影象資料集製作
阿新 • • 發佈:2019-02-03
影象資料集的製作分為以下2個步驟:1.將影象資訊資料化 2.給每一幅影象貼上對應的標籤 .使用PIL中的Image模組將圖片的資訊資料化,整個處理過程都已經封裝好了的,需要修改的地方就是資料夾的路徑和資料夾的名字classes,直接上程式碼:
import numpy as np
import os,glob
from PIL import Image #用於處理圖片的模組
import pandas as pd
import scipy.io as sio #用於讀取.mat資料的模組
class Dataset:
def __init__(self):
self.classes = ['jp2k' , 'jpeg', 'wn','gblur','fastfading'] # 資料夾的順序要預先排列好,因為下面的遍歷順序是按照classes列表中的順序進行遍歷的
self.cwd = os.getcwd() #得到的主目錄,比如我的主目錄是‘/home/nw’,那麼self.cwd就等於'/home/nw'
self.arr = [[]]
self.a = []
def img2array(self):
for index,name in enumerate(self.classes):
class_path = self.cwd + '/data/' + name + '/'#這是我的圖片資料夾的存放路徑
for infile in glob.glob(class_path + '*.bmp'): # 遍歷所有資料夾下的bmp格式的圖片
file,ext = os.path.splitext(infile) #將檔名字和格式進行拆分
img = Image.open(infile) #使用Image模組開啟檔案
img = img.resize([32,32]) #將圖片大小都設定成 32 * 32 大小的
r,g,b = img.split() #將彩色圖片拆分為三色通道,r,g,b分別為red,green,black
r_array = np.array(r).reshape([1024]) #利用numpy將三色通道中的圖片資訊資料化。
g_array = np.array(g).reshape([1024]) # 將32 * 32的三色通道的影象都reshape成一行
b_array = np.array(b).reshape([1024])
merge_array = np.concatenate((r_array,g_array,b_array)) #將三色通道的圖片資訊拼接,這就是一張圖片的所有資訊,shape = [1,1024 * 3]
if self.arr == [[]]:
self.arr = [merge_array] #第一張圖片放到列表中,後面經過numpy 中的concatenate會變成ndarray格式的
continue
self.arr = np.concatenate((self.arr,[merge_array]),axis = 0) #將所有資料夾下的所有的bmp格式的圖片資訊拼接成一個數組
return self.arr
def getdataset(self):
img_info = self.img2array() # 通過呼叫 img2array方法來得到圖片資訊
f = open('/home/nw/data/dmos.mat','rb') #將相應資料夾下的標籤資訊讀取出來
#因為資料夾下的標籤矩陣是mat格式的,使用scipy下的io模組中的loadmat可以直接將標籤矩陣讀寫出來
#注意上面classes中的資料夾的順序要準確,要和標籤的順序一一對應。資料夾和標籤的對應順序要預先明確
labelset = sio.loadmat(f)
labelset = labelset['dmos'] #load出來的是字典的形式。使用索引將標籤資訊取出來
labelset = np.reshape(labelset,[982,1]) #將標籤處理成shape = [樣本數,1]
dataset = np.concatenate((img_info,labelset),axis = 1) #將圖片資訊和標籤資訊拼接起來
return dataset
from sys import path
path.append('/home/nw/data') #將編譯路徑新增進去
from data28 import Dataset #data28是檔案data28.py,從data28匯入Dataset類
haha = Dataset() #例項化
dataset = haha.getdataset() #通過呼叫例項化之後的getdataset方法獲得dataset資料集
下面使用pickle將資料寫入和讀出檔案
f = open('/home/nw/data/dataset.txt','rb') #線開啟一個檔案,如果這個檔案不存在,就新建這個檔案,二進位制可寫
pickle.dump(dataset,f) #使用pickle的dump將獲得的dataset資料倒入到f檔案中
f.close()
使用pickles對資料做各種處理:
f = open('/home/nw/data/dataset.txt','rb') #二進位制可讀
dataset = pickle.load(f) #使用pickle.load()讀取檔案中的資料
f.close()
我的資料格式是982 * 3073,982代表的是982張圖片,3073中前面的3072列代表的是圖片資訊,最後一列代表的標籤資訊。
剔除標籤為0的圖片:
for i in range(dataset.shape[0]):
if dataset[i][3072] == 0:
dataset = np.delete(dataset,i,axis = 0) #np.delete()中dataset是需要做處理的
資料集,i是需要刪掉的索引,axis = 0代表按照行的方式刪除,之後得到的就是去掉標籤為0的全部圖片資料,使用np.random.shuffle(dataset)打亂圖片順序,方便後續進行訓練。np.random.shuffle(dataset)不返回任何值,所以dataset=np.random.shuffle(dataset)得到的是None