問題描述
在windows平臺上,本地訓練SSD_512獲得了對應的權值參數文件,加載模型進行前向測試的時候,發現調用caffe.io.Transformer中的resize處理函數速度太慢,打算用opencv的resize作替換,所以更改了輸入圖片到模型中的預處理過程,使用caffe.io.Transformer進行預處理的過程以下:python
import numpy as np import sys,os # 設置當前的工做環境在caffe下 caffe_root = '/home/xxx/caffe/' # 咱們也把caffe/python也添加到當前環境 sys.path.insert(0, caffe_root + 'python') import caffe os.chdir(caffe_root)#更換工做目錄 # 設置網絡結構 net_file=caffe_root + 'models/bvlc_reference_caffenet/deploy.prototxt' # 添加訓練以後的參數 caffe_model=caffe_root + 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel' # 均值文件 mean_file=caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy' # 這裏對任何一個程序都是通用的,就是處理圖片 # 把上面添加的兩個變量都做爲參數構造一個Net net = caffe.Net(net_file,caffe_model,caffe.TEST) # 獲得data的形狀,這裏的圖片是默認matplotlib底層加載的 transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape}) # matplotlib加載的image是像素[0-1],圖片的數據格式[weight,high,channels],RGB # caffe加載的圖片須要的是[0-255]像素,數據格式[channels,weight,high],BGR,那麼就須要轉換 # channel 放到前面 transformer.set_transpose('data', (2,0,1)) transformer.set_mean('data', np.load(mean_file).mean(1).mean(1)) # 圖片像素放大到[0-255] transformer.set_raw_scale('data', 255) # RGB-->BGR 轉換 transformer.set_channel_swap('data', (2,1,0)) # 這裏纔是加載圖片 im=caffe.io.load_image(caffe_root+'examples/images/cat.jpg') # 用上面的transformer.preprocess來處理剛剛加載圖片 net.blobs['data'].data[...] = transformer.preprocess('data',im) #注意,網絡開始向前傳播啦 out = net.forward() # 最終的結果: 當前這個圖片的屬於哪一個物體的機率(列表表示) output_prob = output['prob'][0] # 找出最大的那個機率 print 'predicted class is:', output_prob.argmax()
用opencv2中的resize函數替換以後,檢測的結果不好,最終經過比較兩種resize方式對同一張圖片處理後結果的差別,發現兩種方式存在不一樣,雖說差別很小,可是也會嚴重影響檢測結果,緣由可能以下:ubuntu
模型不夠魯棒
caffe中的resize和opencv中的resize的默認插值方式可能不一樣,這點須要看源碼進行確認
在ubuntu上不存在這個問題,猜測多是在windows下的caffe不是官方提供的,可能處理方式存在差別
最終,所有采用caffe.io.Transformer的方式進行圖片的預處理,檢測結果恢復正常。windows
此外,測試了opencv2和opencv3,發現用opencv2處理圖片,檢測的效果更好,緣由未知!
---------------------
做者:tsq292978891
來源:CSDN
原文:https://blog.csdn.net/tsq292978891/article/details/78918413
版權聲明:本文爲博主原創文章,轉載請附上博文連接!網絡