Caffe中的資料轉換
1.cv2.imread()和caffe.io.loadimage的區別
https://blog.csdn.net/lovelyaiq/article/details/70254583
使用opencv和caffe的夥伴們,可能會有一個疑問,那就是對於同時讀取圖片的cv2.imread()和caffe.io.loadimage兩個函式,有什麼差別?
1、cv2.imread()介面讀影象,讀進來直接是BGR 格式資料格式在 0~255,通道格式為(H,W,C),即行,列、通道數(Row, Col, C)。
2、caffe.io.load_image()讀進來是RGB格式和 0~1(float)
因此,cv2.imread()讀取的資料,需要進過轉換後,才和caffe.io.load_image()相同,例如:
image1=cv2.imread(caffe_root + 'examples/images/cat.jpg') image1=cv2.cvtColor(image1,cv2.COLOR_BGR2RGB) image1=image1/255. 經過轉換後,cv2.imread讀取的image1和caffe.io.load_image()讀取到的image格式相同。 所以在進行特徵提取之前要在transformer中設定transformer.set_raw_scale('data',255)(縮放至0~255)
以及transformer.set_channel_swap(‘data’,(2,1,0)(將RGB變換到BGR)。
呼叫caffe model進行特徵提取分類時,要注意區分image用何種方法讀進來。
2.均值問題
兩種方式:1.net中設定均值;2.使用均值檔案
Caffe學習系列(15):計算圖片資料的均值:https://www.cnblogs.com/denny402/p/5102328.html
圖片減去均值後,再進行訓練和測試,會提高速度和精度。因此,一般在各種模型中都會有這個操作。
那麼這個均值怎麼來的呢,實際上就是計算所有訓練樣本的平均值,計算出來後,儲存為一個均值檔案,在以後的測試中,就可以直接使用這個均值來相減,而不需要對測試圖片重新計算。
一、二進位制格式的均值計算
caffe中使用的均值資料格式是binaryproto, 作者為我們提供了一個計算均值的檔案compute_image_mean.cpp,放在caffe根目錄下的tools資料夾裡面。編譯後的可執行體放在 build/tools/ 下面,我們直接呼叫就可以了
# sudo build/tools/compute_image_mean examples/mnist/mnist_train_lmdb examples/mnist/mean.binaryproto
帶兩個引數:
第一個引數:examples/mnist/mnist_train_lmdb, 表示需要計算均值的資料,格式為lmdb的訓練資料。
第二個引數:examples/mnist/mean.binaryproto, 計算出來的結果儲存檔案。
二、python格式的均值計算
如果我們要使用python介面,或者我們要進行特徵視覺化,可能就要用到python格式的均值檔案了。首先,我們用lmdb格式的資料,計算出二進位制格式的均值,然後,再轉換成python格式的均值。
我們可以編寫一個python指令碼來實現:
複製程式碼
#!/usr/bin/env python
import numpy as np
import sys,caffe
if len(sys.argv)!=3:
print "Usage: python convert_mean.py mean.binaryproto mean.npy"
sys.exit()
blob = caffe.proto.caffe_pb2.BlobProto()
bin_mean = open( sys.argv[1] , 'rb' ).read()
blob.ParseFromString(bin_mean)
arr = np.array( caffe.io.blobproto_to_array(blob) )
npy_mean = arr[0]
np.save( sys.argv[2] , npy_mean )
複製程式碼
將這個指令碼儲存為convert_mean.py
呼叫格式為:
# sudo python convert_mean.py mean.binaryproto mean.npy
其中的 mean.binaryproto 就是經過前面步驟計算出來的二進位制均值。
mean.npy就是我們需要的python格式的均值。
計算影象均值是影象預處理中的常見操作,計算機視覺中,深度學習框架輸入圖片後一般都會進行均值削減,分兩種方法,一種是減去均值檔案,另一種是生成RGB三個數值。
第一種方法一般參考各自框架的API即可。
第二種方法可以由簡單的python程式碼得到,如下所示:
import os
import cv2
from numpy import *
#img_dir='/home/zzy/ai_challenger_scene_validation_20170908/scene_validation_20170908/'
img_dir='/home/zzy/ai_challenger_scene_train_20170904/scene_train_20170904/'
img_list=os.listdir(img_dir)
img_size=224
sum_r=0
sum_g=0
sum_b=0
count=0
for img_name in img_list:
img_path=os.path.join(img_dir,img_name)
img=cv2.imread(img_path)
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
img=cv2.resize(img,(img_size,img_size))
sum_r=sum_r+img[:,:,0].mean()
sum_g=sum_g+img[:,:,1].mean()
sum_b=sum_b+img[:,:,2].mean()
count=count+1
sum_r=sum_r/count
sum_g=sum_g/count
sum_b=sum_b/count
img_mean=[sum_r,sum_g,sum_b]
print img_mean