天天看點

caffe中圖像預處理和opencv讀取圖像差異caffe讀取圖像opencv讀圖

caffe讀取圖像

使用caffe.io.Transform類操作:

1、設定圖檔的shape格式為網絡data層格式
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
           
2、改變次元順序,由原始圖檔次元(h, w, c)變為(c, h, w)
transformer.set_transpose('data', (2,0,1)) 
           
3、減去圖像均值,注意要先将binaryproto格式均值檔案轉換為npy格式
transformer.set_mean('data', np.load(mean_file_path).mean(1).mean(1))
或者通道均值
transformer.set_mean('data', [b_v, g_v, r_v] )
           
4、縮放到[0,255]之間
transformer.set_raw_scale('data', 255)
           
5、交換通道,将C通道由RGB變為BGR
transformer.set_channel_swap('data', (2,1,0))
           
6、加載圖檔
im=caffe.io.load_image(img)
           
7、執行上面設定的圖檔預處理操作,并将圖檔載入到blob中
net.blobs['data'].data[...] = transformer.preprocess('data', im)
           

opencv讀圖

1、上述采用caffe.io.load_image讀圖,資料格式是RGB,數值範圍0~1,是以會有4、5步的操作。

當采用opencv讀圖時,有2個差別:

(1)資料格式是BGR

(2)數值範圍0~255

2、

利用imread函數讀圖時,shape格式為:H W C

利用resize函數縮放時,注意shape設為:W H

3、注意區分2個變換:

(1)transformer.set_transpose(‘data’, (2,0,1)) 這個是将HWC->CHW,不管是caffe.io讀圖,還是opencv讀圖,這步操作都是需要的。

(2)transformer.set_channel_swap(‘data’, (2,1,0))這個是将C通道的RGB->BGR。該操作隻是在caffe.io讀圖時需要做下。opencv讀圖時本身就已經是BGR了。