Opencv:DNNモジュールロードマシン学習モデル

4060 ワード

DNNモジュール
OpenCV 3.3からdnnモジュールをメインウェアハウスに組み込み,現在Caffe,TensorFlow,Torch,PyTorchなどの深い学習フレームワークをサポートしている.
protobuf
Google Protocol Buffersは、googleが開発したデータストレージ、ネットワーク通信時にプロトコルコーデックに使用されるツールライブラリです.protobufは、json/xmlのような言語プラットフォームとは独立した柔軟で効率的な構造化データ表現方法である.
TensoFlowモデル
1.     
	a.     protobuf      :.pb
	b. protobuf      :.pbtxt
2.         :readNetFromTensorflow
dnn::Net net = cv::dnn::readNetFromTensorflow("xxx.pb");
3.     ,      
Mat img = imread("1.jpg", 1);
Mat inputBlob = dnn::blobFromImage(img, 0.00390625f, Size(256, 256), Scalar(), false,false); 
4.          
net.setInput(inputBlob, "data");     
5.     (  )
Mat pred = net.forward("fc2/prob");
6.        

Caffeモデル
1.     
	a.     .caffemodel
	b.     .prototxt
2.     :readNetFromCaffe

残りの流れはtensorflowと同じです
ネットワークモデルのロード
Net readNetFromTensorflow(const String &model, const String &config = String()); model:.pbファイルconfig:.pbtxtファイル
Net readNetFromCaffe (const String &prototxt, const String &caffeModel=String()) prototxt:.prototxtファイルcaffeModel:.caffemodelファイル
画像をモデル入力に変換(画像のズーム/カット/チャネルの変更など、結果として4次元のマトリクス)
Mat blobFromImage(InputArray image, double scalefactor=1.0, const Size& size = Size(), const Scalar& mean = Scalar(), bool swapRB=true, bool crop=true); image:opencvのmatデータ型で入力した画像.scalefactor:トレーニング時に0-1の間に正規化されている場合、このパラメータは0.00390625 f(1/256)でなければなりません.そうしないと1.0 sizeです.トレーニング時の入力画像サイズと一致するはずです.mean:これは主にcaffeで使用されます.Caffeではトレーニングデータの平均swappRBがよく用いられる:画像の1番目のチャネルと最後のチャネルを交換するかどうかの順序crop:trueであれば画像を切り取り、falseであれば等比例縮小画像である
入力
void setInput(InputArray blob,const String&name=",double scalefactor=1.0,const Scalar&mean=Scalar()blob:入力データname:入力レイヤの名前scalefactor:スケールmean:平均(ピクセル値からこの平均値を差し引く)
しゅつりょく
Mat forward(const String& outputName = String()); outputName:出力レイヤの名前
その他の方法でモデルをロード
Ptr cv::dnn::createTensorflowImporter(const String &model) model:.pbファイル
Ptr cv::dnn::createCaffeImporter(const String &prototxt, const String &caffeModel=String()) prototxt:.prototxtファイルcaffeModel:.caffemodelファイル
Ptr<dnn::Importer> importer;
try
{
	importer = dnn::createCaffeImporter("xxx.prototxt", ".caffemodel");
}
catch (const cv::Exception &err) {
	cerr << err.msg << endl;
}
//    
dnn::Net net;
importer->populateNet(net);
importer.release();