使用VS+OpenCV调用深度学习模型
最近项目有个任务,要在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调用深度学习模型的更多相关文章
- Opencv调用深度学习模型
https://blog.csdn.net/lovelyaiq/article/details/79929393 https://blog.csdn.net/qq_29462849/article/d ...
- Apple的Core ML3简介——为iPhone构建深度学习模型(附代码)
概述 Apple的Core ML 3是一个为开发人员和程序员设计的工具,帮助程序员进入人工智能生态 你可以使用Core ML 3为iPhone构建机器学习和深度学习模型 在本文中,我们将为iPhone ...
- 深度学习模型融合stacking
当你的深度学习模型变得很多时,选一个确定的模型也是一个头痛的问题.或者你可以把他们都用起来,就进行模型融合.我主要使用stacking和blend方法.先把代码贴出来,大家可以看一下. import ...
- flask部署深度学习模型
flask部署深度学习模型 作为著名Python web框架之一的Flask,具有简单轻量.灵活.扩展丰富且上手难度低的特点,因此成为了机器学习和深度学习模型上线跑定时任务,提供API的首选框架. 众 ...
- 用 Java 训练深度学习模型,原来可以这么简单!
本文适合有 Java 基础的人群 作者:DJL-Keerthan&Lanking HelloGitHub 推出的<讲解开源项目> 系列.这一期是由亚马逊工程师:Keerthan V ...
- CUDA上深度学习模型量化的自动化优化
CUDA上深度学习模型量化的自动化优化 深度学习已成功应用于各种任务.在诸如自动驾驶汽车推理之类的实时场景中,模型的推理速度至关重要.网络量化是加速深度学习模型的有效方法.在量化模型中,数据和模型参数 ...
- CUDA上的量化深度学习模型的自动化优化
CUDA上的量化深度学习模型的自动化优化 深度学习已成功应用于各种任务.在诸如自动驾驶汽车推理之类的实时场景中,模型的推理速度至关重要.网络量化是加速深度学习模型的有效方法.在量化模型中,数据和模型参 ...
- 语义分割:基于openCV和深度学习(二)
语义分割:基于openCV和深度学习(二) Semantic segmentation in images with OpenCV 开始吧-打开segment.py归档并插入以下代码: Semanti ...
- 语义分割:基于openCV和深度学习(一)
语义分割:基于openCV和深度学习(一) Semantic segmentation with OpenCV and deep learning 介绍如何使用OpenCV.深度学习和ENet架构执行 ...
随机推荐
- ARM-start.s注释(2410Init.s)
本人只是做个笔记保存一下. 来源:http://blog.itpub.net/13771794/viewspace-478463/ ;================================= ...
- 【译】为什么BERT有3个嵌入层,它们都是如何实现的
目录 引言 概览 Token Embeddings 作用 实现 Segment Embeddings 作用 实现 Position Embeddings 作用 实现 合成表示 结论 参考文献 本文翻译 ...
- 基于MGR+Atlas的读写分离尝试,以及MGR+Keepalived+Atlas自动故障转移+读写分离设想
目的是尝试altas的读写分离,现有一套搭建好做测试的MGR(单主),于是就腿搓绳,在MGR基础上搭建altas. 复制环境准备 读写分离理论上讲,跟复制模式没有关系,atlas负责的是重定向读写,至 ...
- sys.stdout.flush-倒计时
1. import sys for i in range(100): sys.stdout.write('{}/99\r'.format(i)) sys.stdout.flush() 2. impor ...
- Tensorflow图像处理以及数据读取
关于tensoflow的图像的处理,看到了一篇文章,个人觉得不错.https://blog.csdn.net/weiwei9363/article/details/79917942
- TCP协议和UDP协议基础介绍
TCP协议和UDP协议区别 标签(空格分隔): TCP,udp TCP的三次握手 TCP被称为可靠的数据传输协议,主要是通过许多机制来实现的其中最主要的就是三次握手的功能,当然,TCP传送数据的机制非 ...
- java中接口和抽象类的异同点
抽象类和接口的区别:A:成员区别 抽象类: 成员变量:可以变量,也可以常量 构造方法:有 成员方法:可以抽象,也可以非抽象 接口: 成员变量:只可以常量,默认修饰符:public static fin ...
- WEB-INF目录下的jsp怎么引用外部文件:js,css等
在项目中,为了安全.我们通常会将jsp文件放在WEB-INF下面,对于放在WEB-INF下面的js或是css等资源文件.我们通常可以通过相对路径来引用,而如果是放在WEB-INF之外的js 或是 cs ...
- MySQL增删改查常用语句命令
增删改查语句增删改查的语句命令为 增:insert删:delete改:update查:SELECT或者show 库操作创建数据库:create database shujukuba;创建带字符集的数据 ...
- 微信x5内核很鸡贼啊
最近在写一个支付项目,然后要打通微信和支付宝支付,本来后端联调的时候直接调用weixin://wxpay/bizpayurl?XXXX接口就行的,完全走着通,然后到项目验收了就炸了,点不进去了,最后改 ...