不同文件夾下的亂序數據集處理

首先是處理圖片數據集:

import numpy as np
import pandas as pd
from PIL import Image
import os
import glob # glob是用來遍歷文件夾下的所有bmp文件
cwd = os.getcwd() # 獲取電腦的主文件夾路徑:/home/xm
arr = [[]]
classes = [‘fastfading’,’gblur’,’jp2k’,’jpeg’,’wn’] #將所有的文件夾按照預先知道的順序排列
#存在列表中,實際圖片文件夾的順序要和dmos文件中的標籤的順序要一一對應,
for index,name in enumerate(classes):
    class_path = cwd + '/data/' + name + '/' #獲取圖像文件夾的路徑
    for infile in glob.glob(class_path + '*.bmp'): #遍歷classes列表元素的文件夾中的
    #所有bmp格式的文件
        file,ext = os.path.splitext(infile)
        img = Image.open(infile) # 打開每一張圖片
        img = img.resize([32,32]) # 將圖片壓縮
        r,g,b = img.split() #彩色圖片拆分成三色通道
        r_array = np.array(r).reshape([1024])
        g_array = np.array(g).reshape([1024])
        b_array = np.array(b).reshape([1024]) # 將三色通道的圖片信息轉換成
        #numpy的格式
        merge_array = np.concatenate((r_array,g_array,b_array))
        #將三色通道的信息進行橫向拼接,這樣一張圖片的所有信息就全部包含在一個行向量中了
        if arr == [[]]: #將第一張圖片的信息放到arr列表中
            arr = [merge_array]
            continue
        arr = np.concatenate((arr,[merge_array]),axis = 0)
        #從第二張開始的圖片信息都按照np.concatenate的方式一張一張往下拼接,這樣
        #得到的arr.shape = [982,32 * 32 * 3],982張32x32的三色通道圖片

標籤處理:這裏的標籤處理是按照噪聲作爲標籤來進行處理的,因爲噪聲的標籤也是在不同的文件夾下
的,而且噪聲的文件信息的格式都不是一個格式,所以處理起來比較麻煩,這一部分的內容沒有進行封裝。

a = []
for index,name in enumerate(classes):
    class_path = cwd + '/data/' + name + '/'
    label_path = class_path + 'info.txt'
    f = open(label_path)
    lines = f.readlines()
    for line in lines:
        line.strip('\n')
        line = line.split(' ')
        a.append(line)

得到的數據最後一列是有‘\n’的,脫掉’\n’

for i in range(len(a)):
a[i][2] = a[i][2].strip(‘\n’)

d = pd.DataFrame(a)

得到的數據的最後一列是字符串的形式,需要將它轉換成浮點形的,所以有了以下的代碼:

d[2] = d[2].astype(‘float’)

得到的d的最後一列就是float的形式的了。

for i in range(start,end):
            for j in range(i + 1,end):
                if len(a[i][1]) > len(a[j][1]):
                    temp = a[i]
                    a[i] = a[j]
                    a[j] = temp

有的文件夾數據集中和圖片對應的標籤的索引有的是亂序的,利用冒泡的方法將文件名小的上浮,如1.bmp < 2.bmp

for i in range(start,end):
            for j in range(i + 1,end):
                if len(a[i][1]) == len(a[j][1]): #如果字符串的長度一樣
                    if a[i][1] > a[j][1]:
                        temp = a[i]
                        a[i] = a[j]
                        a[j]= temp

標籤的處理也可以用以下的方式來讀取:

f1 = open('/home/xm/data/fastfading/info.txt') # 4
data1 = pd.read_csv(f1,header = None,delim_whitespace = True)
# print(data1)
f2 = open('/home/xm/data/jp2k/info.txt') # 1
data2 = pd.read_csv(f2,header = None,delim_whitespace = True)
# print(data2)
f3 = open('/home/xm/data/jpeg/info.txt') # 2
data3 = pd.read_csv(f3,header = None,delim_whitespace = True)
# print(data3)
f4 = open('/home/xm/data/wn/info.txt') # 5
data4 = pd.read_csv(f4,header = None,delim_whitespace = True)
data4 = np.array(data4)
data4 = list(data4)

for i in range(len(data4)): #按照文件名的長度進行排序,冒泡算法
            for j in range(i + 1,len(data4)):
                if len(data4[i][1]) > len(data4[j][1]):
                    temp = data4[i]
                    data4[i] = data4[j]
                    data4[j] = temp
for i in range(len(data4)): #文件名長度相等的話,按照字符串中字符的大小來排序,也用冒泡算法
            for j in range(i + 1,len(data4)):
                if len(data4[i][1]) == len(data4[j][1]): #如果字符串的長度一樣
                    if data4[i][1] > data4[j][1]:
                        temp = data4[i]
                        data4[i] = data4[j]
                        data4[j]= temp
data4 = np.array(data4)
data4 = pd.DataFrame(data4)
datas = pd.concat([data2,data3,data,data1,data4],axis = 0) #拼接5個文件夾中的所有label
#的info信息
datas = np.array(datas)
noiseset = datas[:,2][:,np.newaxis]
print(noiseset.shape) 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章