問題描述
在windows平台上,本地訓練SSD_512得到了對應的權值參數文件,加載模型進行前向測試的時候,發現調用caffe.io.Transformer中的resize處理函數速度太慢,打算用opencv的resize做替換,因此更改了輸入圖片到模型中的預處理過程,使用caffe.io.Transformer進行預處理的過程如下:
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方式對同一張圖片處理后結果的差異,發現兩種方式存在不同,雖然說差異很小,但是也會嚴重影響檢測結果,原因可能如下:
模型不夠魯棒
caffe中的resize和opencv中的resize的默認插值方式可能不同,這點需要看源碼進行確認
在ubuntu上不存在這個問題,猜想可能是在windows下的caffe不是官方提供的,可能處理方式存在差異
最終,全部采用caffe.io.Transformer的方式進行圖片的預處理,檢測結果恢復正常。
此外,測試了opencv2和opencv3,發現用opencv2處理圖片,檢測的效果更好,原因未知!
---------------------
作者:tsq292978891
來源:CSDN
原文:https://blog.csdn.net/tsq292978891/article/details/78918413
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
