最近项目有个任务,要在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. jsTree通过AJAX从后台获取数据

    页面代码: <div id="MenuTree"></div> javascript代码: $(document).ready(function ($) { ...

  2. Virtualbox下克隆CentOS 网络配置

    Virtualbox下克隆虚拟机非常容易,也使得我们在平常搭建测试环境方便了许多.不过克隆以后的虚机并不能够直接联网,这是由于网卡的MAC地址引起的.在"控制->复制"弹出的 ...

  3. 需要转义的java字符(转)

    特别字符 说明 $ 匹配输入字符串的结尾位置.如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n' 或‘\r'.要匹配 $ 字符本身,请使用 \$. ( ) 标记一个子 ...

  4. html入门第一天(知识总结)。

    一文本标签:----------双标签.<b>标签 <strong>标签,文本呈现粗体(Html5中建议用strong,strong语义更强)<i>标签 <e ...

  5. Mysql数据存在更新,不存在则插入的实现

    有些情况下,我们需要对数据库进行插入或更新操作的时候需要先根据特定的字段去判断是否已存在,然后做出不同的插入或者跟新操作. replace函数: 我们要在需要判断的字段上建立一个唯一索引,且这个字段不 ...

  6. selenium调用webdriver异常

    使用selenium调用webdriver的时候报错. from selenium import webdriver browser = webdriver.Chrome() browser.get( ...

  7. 48 【golang】json的效率

    本文将主要做如下几方面的测试: 1,构造一个[100]struct的数组,然后来测试它的json编码后的字符串 或者([]byte),首先关心它的功能是否正常: 2,在很早之前,我们在使用golang ...

  8. Winform导入文件

    winfrom的选中文件的路径放进文本框,我还是一个新手,欢迎大家在评论里面多多指教

  9. systemd 编写服务管理脚本---学习

    转载:https://www.cnblogs.com/sparkdev/p/8521812.html 我们运行 linux 服务器的主要目的是通过运行程序提供服务,比如 mysql.web serve ...

  10. c# post方法亲测可用

    /// <summary> /// Post接口方法 /// </summary> /// <param name="requestUri">& ...