如何將圖片做成類似train-images-idx3-ubyte形式
使用過(guò)caffe2的人都知道,caffe2可以對(duì)圖像進(jìn)行處理,但是caffe2并不接受直接使用圖片進(jìn)行訓(xùn)練。在使用之前,需要將圖片保存成一種特殊的二進(jìn)制形式,圖片文件和二進(jìn)制文件之間的轉(zhuǎn)換存在一種固定的協(xié)議。? ? 如何把一個(gè)二進(jìn)制文件解析成圖片文件大家已經(jīng)了解,現(xiàn)在我們實(shí)現(xiàn)的是如何通過(guò)圖片做成二進(jìn)制文件。
#?-*-?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")
需要注意,當(dāng)前目錄需要有一個(gè)file1文件夾保存著jpg圖片文件,numOfImage和numOfLabel表示圖片數(shù)量和標(biāo)簽數(shù)量,label.txt表示標(biāo)簽文件,在當(dāng)前目錄下。rows和columns表示圖片像素?cái)?shù)量。需要注意,如果是在大端法機(jī)器上生成的文件才是符合文件轉(zhuǎn)換協(xié)議的,目前大多數(shù)intel機(jī)器是小端法,在這種情況下,生成的文件需要作部分改變才能滿足要求,train-images-idx3-ubyte文件的第5-16個(gè)字節(jié)是小端法生成的,所以需要train-images-idx3-ubyte的第5-16字節(jié)中,每相鄰4個(gè)字節(jié)一組,每組中第1個(gè)字節(jié)和第4個(gè)字節(jié)交換,第2個(gè)字節(jié)和第3個(gè)字節(jié)交換,才能滿足要求。在train-labels-idx1-ubyte中是第5-8字節(jié)中第1個(gè)字節(jié)和第4個(gè)字節(jié)交換,第2個(gè)字節(jié)和第3個(gè)字節(jié)交換,才能滿足要求。