本文参考自:opencv调用cCaffe、TensorFlow、Torch、PyTorch训练好的模型
往往,当我们训练好一个模型后,就可以通过OpenCV加载模型使用该模型,完成分类和实时预测的任务了。
自OpenCV 3.1版以来,dnn模块一直是opencv_contrib库的一部分,在3.3版中,它被提到了主仓库中。用OpenCV 3.3,可以很好地利用深度学习预训练模型,将它们作为分类器。OpenCV3.4中DNN模块发布了两个必杀技:一个支持Faster R-CNN的对象检测,比SSD与YOLO这些模型有更好的检测精度与小对象检测能力;另外一个是支持基于SSD+Resnet模型的人脸检测,虽然速度还达不到HAAR级联检测器的实时性,但是准确性与模型泛化能力可以说完爆HAAR级联检测器方式的人脸检测算法。
OpenCV 3.3版本发布,对深度学习(dnn模块)提供了更好的支持,dnn模块目前支持Caffe、TensorFlow、Torch、PyTorch等深度学习框架。
String modelDesc = "../face/deploy.prototxt";
String modelBinary = "../face/res10_300x300_ssd_iter_140000.caffemodel";
// 初始化网络
dnn::Net net = readNetFromCaffe(modelDesc, modelBinary);
if (net.empty()){
printf("could not load net...\n");
return -1;
}
实例请移步:OpenCV基于残差网络实现人脸检测
String labels_txt_file ="../inception5h/imagenet_comp_graph_label_strings.txt";
String tf_pb_file ="../inception5h/tensorflow_inception_graph.pb";
// 加载网络
Net net =readNetFromTensorflow(tf_pb_file);
if(net.empty()){
printf("read caffe model data failure...\n");
return -1;
}
实例请移步:OpenCV 基于Inception模型图像分类
String modelConfiguration = "../yolov2-tiny-voc/yolov2-tiny-voc.cfg";
String modelBinary = "../yolov2-tiny-voc/yolov2-tiny-voc.weights";
dnn::Net net = readNetFromDarknet(modelConfiguration, modelBinary);
if (net.empty())
{
printf("Could not load net...\n");
return;
}
实例请移步:OpenCV DNN之YOLO实时对象检测
除了上述的几种读取模型的方法,opencv中还提供了 readNetFromTorch 和 readhTorchBlob 用来读取Torch模型。
转换数据为四维Blob图片,输入数据到网络 。
// 加载图像
Mat frame = imread("../123.jpg");
Mat inputBlob = blobFromImage(frame, 1/255.F, Size(416, 416), Scalar(), true, false);
net.setInput(inputBlob, "data");
blobFromImage函数的各个参数的含义如下表所示:
序号 | 参数名 | 含义 |
1 | InputArray image | 输入的图像,可以是opencv的mat数据类型 |
2 | scalefactor | 这个参数很重要的,如果训练时,是归一化到0-1之间,那么这个参数就应该为0.00390625f (1/256),否则为1.0。 |
3 | size | 应该与训练时的输入图像尺寸保持一致。 |
4 | mean | 在caffe中用到,caffe中经常会用到训练数据的均值。tf中貌似没有用到均值文件。 |
5 | swapRB | 是否交换图像第1个通道和最后一个通道的顺序。 |
6 | crop | 如果为true,就是裁剪图像,如果为false,就是等比例放缩图像。 |
从磁盘加载完模型,并且输入图像数据之后,就可以用.forward方法来向前传播我们的图像,获取结果。
//检测 darknet
Mat detectionMat = net.forward("detection_out");
//分类 Inception
prob =net.forward("softmax2");
//tf
pred = net.forward("fc2/prob");
1 OpenCV Tutorials
2 Deep Learning with OpenCV
3 opencv的dnn解析