Opencv呼び出しtf訓練モデル

3184 ワード

tensorflowで訓練したモデルは、どのように使用しますか?tensorflowで使うのは、もちろん実現しやすいでしょう.しかし、実際の生産配置では、ホストはtfをインストールしないことを要求し、グラフィックスカードもありません.本博文はこれを記録した.
一、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);
各パラメータの文書解釈
 /** @brief Creates 4-dimensional blob from image. Optionally resizes and crops @p image from center,
     *  subtract @p mean values, scales values by @p scalefactor, swap Blue and Red channels.
     *  @param image input image (with 1-, 3- or 4-channels).
     *  @param size spatial size for output image
     *  @param mean scalar with mean values which are subtracted from channels. Values are intended
     *  to be in (mean-R, mean-G, mean-B) order if @p image has BGR ordering and @p swapRB is true.
     *  @param scalefactor multiplier for @p image values.
     *  @param swapRB flag which indicates that swap first and last channels
     *  in 3-channel image is necessary.
     *  @param crop flag which indicates whether image will be cropped after resize or not
     *  @details if @p crop is true, input image is resized so one side after resize is equal to corresponding
     *  dimension in @p size and another one is equal or larger. Then, crop from the center is performed.
     *  If @p crop is false, direct resize without cropping and preserving aspect ratio is performed.
     *  @returns 4-dimansional Mat with NCHW dimensions order.
     */

最初のパラメータ、InputArrayイメージは、入力された画像を表し、opencvのmatデータ型であってもよい.
2番目のパラメータ、scalefactor、このパラメータは重要で、訓練時に0-1の間に正規化される場合、このパラメータは0.00390625 f(1/256)であり、そうでない場合は1.0である.
3番目のパラメータ、sizeは、訓練時の入力画像サイズと一致するようにしなければならない.
4番目のパラメータ、mean、これは主にcaffeで使用され、caffeではトレーニングデータの平均値がよく使用されます.tfでは平均ファイルは使用されていないようです.
5番目のパラメータ、swapRB、画像の1番目のチャネルと最後のチャネルの順序を交換するかどうか.
6番目のパラメータ、crop、trueであれば画像を切り取り、falseであれば画像を等比例縮小します.
三、その他の注意事項
1、入力と出力nameの対応に注意.以下はc++のコードで、tfの中の入力はnameがdataであるべきで、出力はnameがfc 2/probであるべきです
net.setInput(inputBlob, "data");   
pred = net.forward("fc2/prob");
、pbファイルが200 mより大きい場合は、わけのわからないエラーに注意してください.sources\modules\core\src\matrix.cpp:362: error: (-215) u != 0 in function cv::Mat::create