最近项目有个任务,要在windows环境下用VS+OpenCV实现caffe模型的调用,于是在网上找了几个相关的博客跑了几个demo练练手。这些博客写得都很详细,但是有些细节由于版本更新的问题,配置的过程中有些变化,所以自己再发篇博客记录下。目前OpenCV似乎只支持对caffe模型的调用,如果手上有的是pytorch或者tensorflow训练好的模型的话,可以用其他软件转成caffemodel以及protxt文件。

之前尝试过用OpenCV3.2.0,所做的工作如下:

前期的准备工作可以参考这篇博客:基于opencv dnn模块 的caffe模型的调用,关于配置环境,我用的VS2015,CMake是官网的最新版本,OpenCV选的是博客中用的OpenCV3.2.0。其中需要注意的是,运行环境及前期准备过程中, OpenCV contrib库的版本应该与自己下载的OpenCV库相对应,不然后续编译的过程中会报错。同时,在编译OpenCV及contrib库的过程中,在完成第一次编译,找到“OPENCV_EXTRA_MODUALS_PATH”设置路径的时候,在复制完路径后记得把路径中的‘\’改成'/',不然也会报错。接下来就是按着上面的博客一步步来。第一demo很顺利地就跑通了,到第二个demo的最后一步的时候,系统总是会报错,提示我没有'norm_para'这个参数。用博客上的方法发现还是跑不通,原因可能是网上下的caffemode时有更新,所以deploy.protxt中也会有相应的改动,在网上找了好久一直没有解决的办法,最终靠着github解决了问题:https://github.com/opencv/opencv_contrib/issues/935

后来调用caffe训练的模型的时候,发现OpenCV3.2.0的dnn模块还不支持bn层,而对于很多网络来说,缺少了bn层,测试效果往往会下降很多。折腾了好半天,发现OpenCV3.3.0已经新加入了bn层,并且将dnn提升到了正式代码块中,也就省去了前面提到的用CMake进行编译的过程。下面直接贴一段调用caffe模型,输出网络某一层的函数的代码:

#include <opencv2/dnn.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/core/utils/trace.hpp>
using namespace cv;
using namespace cv::dnn; float* classifier(string modelTxt, string modelBin, string img_path)
{ Mat testImage = imread(img_path, 0); if (testImage.empty()) { printf("could not load image...\n"); } // create googlenet with caffemodel text and bin
Net net = dnn::readNetFromCaffe(modelTxt, modelBin);
if (net.empty()) { std::cerr << "Can't load network by using the following files: " << std::endl; std::cerr << "prototxt: " << modelTxt << std::endl; std::cerr << "caffemodel: " << modelBin << std::endl; }
Mat inputBlob = blobFromImage(testImage, 1);
Mat InnerProduct1;
cv::TickMeter t;
CV_TRACE_REGION("forward");
net.setInput(inputBlob, "data"); //set the network input
t.start();
InnerProduct1 = net.forward("Pooling3"); //compute output
t.stop();
float *b;
b = new float[64]; for (int i = 0; i < 64; i++)
{
//b[i] = InnerProduct1.at<float>(i);
b[i] = InnerProduct1.at<float>(0,i,0);
}
//cout << b[1];
return b;
}

 其中函数的输入modelTxt与modelBin分别对应于caffe的prototxt文件以及训练好的caffemodel,img_path为要测试的图片,而"Pooling3"对应于你想提取的某一层在prototxt文件中的名称。

使用VS+OpenCV调用深度学习模型的更多相关文章

  1. Opencv调用深度学习模型

    https://blog.csdn.net/lovelyaiq/article/details/79929393 https://blog.csdn.net/qq_29462849/article/d ...

  2. Apple的Core ML3简介——为iPhone构建深度学习模型(附代码)

    概述 Apple的Core ML 3是一个为开发人员和程序员设计的工具,帮助程序员进入人工智能生态 你可以使用Core ML 3为iPhone构建机器学习和深度学习模型 在本文中,我们将为iPhone ...

  3. 深度学习模型融合stacking

    当你的深度学习模型变得很多时,选一个确定的模型也是一个头痛的问题.或者你可以把他们都用起来,就进行模型融合.我主要使用stacking和blend方法.先把代码贴出来,大家可以看一下. import ...

  4. flask部署深度学习模型

    flask部署深度学习模型 作为著名Python web框架之一的Flask,具有简单轻量.灵活.扩展丰富且上手难度低的特点,因此成为了机器学习和深度学习模型上线跑定时任务,提供API的首选框架. 众 ...

  5. 用 Java 训练深度学习模型,原来可以这么简单!

    本文适合有 Java 基础的人群 作者:DJL-Keerthan&Lanking HelloGitHub 推出的<讲解开源项目> 系列.这一期是由亚马逊工程师:Keerthan V ...

  6. CUDA上深度学习模型量化的自动化优化

    CUDA上深度学习模型量化的自动化优化 深度学习已成功应用于各种任务.在诸如自动驾驶汽车推理之类的实时场景中,模型的推理速度至关重要.网络量化是加速深度学习模型的有效方法.在量化模型中,数据和模型参数 ...

  7. CUDA上的量化深度学习模型的自动化优化

    CUDA上的量化深度学习模型的自动化优化 深度学习已成功应用于各种任务.在诸如自动驾驶汽车推理之类的实时场景中,模型的推理速度至关重要.网络量化是加速深度学习模型的有效方法.在量化模型中,数据和模型参 ...

  8. 语义分割:基于openCV和深度学习(二)

    语义分割:基于openCV和深度学习(二) Semantic segmentation in images with OpenCV 开始吧-打开segment.py归档并插入以下代码: Semanti ...

  9. 语义分割:基于openCV和深度学习(一)

    语义分割:基于openCV和深度学习(一) Semantic segmentation with OpenCV and deep learning 介绍如何使用OpenCV.深度学习和ENet架构执行 ...

随机推荐

  1. 用word发CSDN blog,免去插图片的烦恼

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...

  2. neo4j性能调优(转)

    最近在公司实习做的就是优化neo4j图形数据库查询效率的事,公司提供的是一个在Linux上搭建且拥有几亿个节点的数据库.开始一段时间主要是熟悉该数据库的一些基本操作,直到上周才正式开始步入了优化数据库 ...

  3. Analysis of Servlet

    @WebServlet("/cdiservlet") public class NewServlet extends HttpServlet { private Message m ...

  4. 前端生成pdf

    https://stackoverflow.com/questions/31610129/pdfmake-html-table-to-pdfmake-table https://www.jianshu ...

  5. spring boot 1.x配置,不断完善中

    spring boot是典型的约定大于配置,那么很有必要对在开发过程中这些配置做统一的添加记录,以免用到的时候到处搜索,网上的东西又良莠不齐. server.port=8880 微服务注册中心,yml ...

  6. css: box-sizing

    border-box 宽度包含了边框 content-box 边框不包含在内容区中,会增加到实际的宽度中

  7. C# DataTable抽取Distinct数据(不重复数据)[z]

    DataTable dataTable;       DataView dataView = dataTable.DefaultView;       DataTable dataTableDisti ...

  8. centos7 使用kubeadm 快速部署 kubernetes 国内源

    前言 搭建kubernetes时看文档以及资料走了很多弯路,so 整理了最后成功安装的过程已做记录.网上的搭建文章总是少一些步骤,想本人这样的小白总是部署不成功(^_^). 准备两台或两台以上的虚拟机 ...

  9. css fixed 失效问题解法

    https://stackoverflow.com/questions/11258877/fixed-element-disappears-in-chrome 开启css硬件加速,transform: ...

  10. PCB设计基本流程

    [PCB设计基本流程]1.准备原理图和网络表2.电路板规划3.参数设置4.导入网标5.布局6.布线7.规则检查与手工调整8.输出文件 [具体步骤]1.在原理图环境下:Tool——>Footpri ...