【opencv】调用caffe、tensorflow、darknet模型

本文参考自: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等深度学习框架。

1. 加载模型成网络

1.1 调用caffe模型

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基于残差网络实现人脸检测 

1.2 调用TensorFlow模型

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模型图像分类 

1.3 调用Darknet模型

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模型。

2. 加载测试数据

        转换数据为四维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,就是等比例放缩图像。

3. 输出结果

        从磁盘加载完模型,并且输入图像数据之后,就可以用.forward方法来向前传播我们的图像,获取结果。

//检测 darknet
Mat detectionMat = net.forward("detection_out");
//分类 Inception
prob =net.forward("softmax2");
//tf 
pred = net.forward("fc2/prob");  

4. 其他参考资料

        1 OpenCV Tutorials 

        2 Deep Learning with OpenCV

        3 opencv的dnn解析 

你可能感兴趣的:(【opencv】调用caffe、tensorflow、darknet模型)