1. 程式人生 > >OpenCV呼叫Tensorflow訓練好的.pb模型

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及以上吧。

4、opencv呼叫tf模型文件

 

二、使用步驟

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

 

好的~

。。。