如何將圖片做成類似train-images-idx3-ubytexings
阿新 • • 發佈:2019-01-11
如何將圖片做成類似train-images-idx3-ubyte形式
使用過caffe2的人都知道,caffe2可以對影象進行處理,但是caffe2並不接受直接使用圖片進行訓練。在使用之前,需要將圖片儲存成一種特殊的二進位制形式,圖片檔案和二進位制檔案之間的轉換存在一種固定的協議。
如何把一個二進位制檔案解析成圖片檔案,在這篇博http://blog.csdn.net/u014046170/article/details/47445919中有詳盡的描述,現在我們實現的是如何通過圖片做成二進位制檔案。# -*- coding: utf-8 -*- from PIL import Image import struct import os imageFilePath="H:\\file1\\" numOfImage=1187 numOfLabel=1187 rows=60 columns=90 imageUbyte="train-images-idx3-ubyte" labelUbyte="train-labels-idx1-ubyte" label="label.txt" def readImage(): print os.getcwd() file=open(imageUbyte,"wb") file.write(struct.pack('i',50855936)) file.write(struct.pack('i',numOfImage)) file.write(struct.pack('i',rows)) file.write(struct.pack('i',columns)) for i in xrange(numOfImage): lene=Image.open(imageFilePath+str(i+1000)+".jpg") #lene=lene.convert("L") #if not os.path.exists() for j in xrange(rows): for k in xrange(columns): file.write(struct.pack('B',lene.getpixel((k,j)))) #print lene.mode,lene.size,lene.format file.close() print("create "+imageUbyte+" success") def readLabel(): fileubyte=open(labelUbyte,"wb") filetxt=open(label,"r") fileubyte.write(struct.pack('i',17301504)) fileubyte.write(struct.pack('i',numOfLabel)) for i in xrange(numOfLabel): initdata=filetxt.read(1) fileubyte.write(struct.pack('B',int(initdata))) filetxt.read(1) fileubyte.close() filetxt.close() print("create "+labelUbyte+" success") if __name__ == '__main__': readImage() readLabel() print("create files finished")
需要注意,當前目錄需要有一個file1資料夾儲存著jpg圖片檔案,numOfImage和numOfLabel表示圖片數量和標籤數量,label.txt表示標籤檔案,在當前目錄下。rows和columns表示圖片畫素數量。需要注意,如果是在大端法機器上生成的檔案才是符合檔案轉換協議的,目前大多數intel機器是小端法,在這種情況下,生成的檔案需要作部分改變才能滿足要求,train-images-idx3-ubyte檔案的第5-16個位元組是小端法生成的,所以需要train-images-idx3-ubyte的第5-16位元組中,每相鄰4個位元組一組,每組中第1個位元組和第4個位元組交換,第2個位元組和第3個位元組交換,才能滿足要求。在train-labels-idx1-ubyte中是第5-8位元組中第1個位元組和第4個位元組交換,第2個位元組和第3個位元組交換,才能滿足要求。