OpenCV呼叫Tensorflow訓練好的.pb模型
“ 做一個安靜細微的人,於角落裡自在開放,默默悅人,卻始終不引起過分熱鬧的關注,保有獨立而隨意的品格,這就很好。”
本博文使用opencv的dnn模組inference儲存好的.pb模型~
原博地址:https://blog.csdn.net/hust_bochu_xuchao/article/details/79428759
一、opencv dnn模組
1、OpenCV 3.3版本釋出,對深度學習(dnn模組)提供了更好的支援,dnn模組目前支援Caffe、TensorFlow、Torch、PyTorch等深度學習框架。
2、OpenCV的dnn模組呼叫TesorFlow訓練的MoblieNet模型
3、關於opencv的版本,最好是3.4.0及以上吧。
二、使用步驟
1、tf訓練模型,並儲存成.pb檔案
2、使用opencv的readNetFromTensorflow函式載入.pb檔案
3、帖幾行關鍵性程式碼
String weights = "nn.pb"; dnn::Net net = cv::dnn::readNetFromTensorflow(weights); Mat img = imread(files[i], 1); Mat inputBlob = dnn::blobFromImage(img, 0.00390625f, Size(256, 256), Scalar(), false,false); net.setInput(inputBlob, "data");//set the network input, "data" is the name of the input layer Mat pred = net.forward("fc2/prob");
4、dnn::blobFromImage函式解讀(這個很重要,引數不對,直接影響預測結果)
opencv中的函式宣告:
CV_EXPORTS_W Mat blobFromImage(InputArray image, double scalefactor=1.0, const Size& size = Size(),
const Scalar& mean = Scalar(), bool swapRB=true, bool crop=true);
對於各引數的文件解釋:
第一個引數,InputArray image,表示輸入的影象,可以是opencv的mat資料型別。
第二個引數,scalefactor,這個引數很重要的,如果訓練時,是歸一化到0-1之間,那麼這個引數就應該為0.00390625f (1/256),否則為1.0
第三個引數,size,應該與訓練時的輸入影象尺寸保持一致。
第四個引數,mean,這個主要在caffe中用到,caffe中經常會用到訓練資料的均值。tf中貌似沒有用到均值檔案。
第五個引數,swapRB,是否交換影象第1個通道和最後一個通道的順序。
第六個引數,crop,如果為true,就是裁剪影象,如果為false,就是等比例放縮影象。
三、其他注意事項
1、注意輸入和輸出name的對應。下面是c++的程式碼,tf中的輸入就應該name為data,輸出就應該name為fc2/prob
net.setInput(inputBlob, "data");
pred = net.forward("fc2/prob");
2、如果pb檔案大於200m,小心出現莫名其妙的報錯。sources\modules\core\src\matrix.cpp:362: error: (-215) u != 0 in function cv::Mat::create
好的~
。。。