“ 做一个安静细微的人,于角落里自在开放,默默悦人,却始终不引起过分热闹的关注,保有独立而随意的品格,这就很好。”
本博文使用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
好的~
。。。