前言

opencv是图像领域中非常优秀的一个开源库,近年来,随着深度学习的发展,深度在图像识别、物体检测、语义分割等领域已经达到落地的程度。opencv开源库也一直在支持各种分类、检测model的调用,虽然还不够全面。。。opencv从3.3开始已经支持分类模型的调用,包括caffe、tensorflow、pytorch等框架训练出的模型。从3.4.2开始,支持yolov3的调用,这真的是一个很大的进步,可以把物体检测真正落地。

Opencv3.4.3调用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;
#include <fstream>
#include <iostream>
#include <cstdlib>
using namespace std;
/* Find best class for the blob (i. e. class with maximal probability) */
static void getMaxClass(const Mat &probBlob, int *classId, double *classProb)
{Mat probMat = probBlob.reshape(1, 1); //reshape the blob to 1x1000 matrixPoint classNumber;minMaxLoc(probMat, NULL, classProb, NULL, &classNumber);*classId = classNumber.x;
}
static std::vector<String> readClassNames(const char *filename = "synset_words.txt")
{std::vector<String> classNames;std::ifstream fp(filename);if (!fp.is_open()){std::cerr << "File with classes labels not found: " << filename << std::endl;exit(-1);}std::string name;while (!fp.eof()){std::getline(fp, name);if (name.length())classNames.push_back(name.substr(name.find(' ') + 1));}fp.close();return classNames;
}
int main()
{CV_TRACE_FUNCTION();String modelTxt = "bvlc_googlenet.prototxt";String modelBin = "bvlc_googlenet.caffemodel";String imageFile = "cup_1.jpg";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;std::cerr << "bvlc_googlenet.caffemodel can be downloaded here:" << std::endl;std::cerr << "http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel" << std::endl;exit(-1);}Mat img = imread(imageFile);if (img.empty()){std::cerr << "Can't read image from the file: " << imageFile << std::endl;exit(-1);}//GoogLeNet accepts only 224x224 RGB-imagesMat inputBlob = blobFromImage(img, 1, Size(224, 224),Scalar(104, 117, 123));   //Convert Mat to batch of imagesMat prob;cv::TickMeter t;for (int i = 0; i < 10; i++){CV_TRACE_REGION("forward");net.setInput(inputBlob, "data");        //set the network inputt.start();prob = net.forward("prob");                          //compute outputt.stop();}int classId;double classProb;getMaxClass(prob, &classId, &classProb);//find the best classstd::vector<String> classNames = readClassNames();std::cout << "Best class: #" << classId << " '" << classNames.at(classId) << "'" << std::endl;std::cout << "Probability: " << classProb * 100 << "%" << std::endl;std::cout << "Time: " << (double)t.getTimeMilli() / t.getCounter() << " ms (average from " << t.getCounter() << " iterations)" << std::endl;system("pause");return 0;
}

关于代码中所用到的文件:bvlc_googlenet.caffemodel、bvlc_googlenet.prototxt、synset_words.txt

其中:bvlc_googlenet.caffemodel是模型文件,是GoogleNet在ImageNet上训练好的模型,bvlc_googlenet.prototxt是googleNet的结构文件,synset_words.txt是ImageNet上的类别信息。

实验结果

Best class: #812 'space shuttle'
Probability: 99.9828%
Time: 53.3045 ms (average from 10 iterations)

Best class: #504 'coffee mug'
Probability: 68.0434%
Time: 52.8983 ms (average from 10 iterations)

C++调用caffe分类模型-Opencv3.4.3相关推荐

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

    本文参考自:opencv调用cCaffe.TensorFlow.Torch.PyTorch训练好的模型 往往,当我们训练好一个模型后,就可以通过OpenCV加载模型使用该模型,完成分类和实时预测的任务 ...

  2. Caffe、TensorFlow、MXnet三个开源库对比+主流分类模型对比

    库名称 开发语言 支持接口 安装难度(ubuntu) 文档风格 示例 支持模型 上手难易 Caffe c++/cuda c++/python/matlab *** * *** CNN ** MXNet ...

  3. r包调用legend函数_R语言实现基于朴素贝叶斯构造分类模型数据可视化

    本文内容原创,未经作者许可禁止转载! 目录 一.前言 二.摘要 三.关键词 四.算法原理 五.经典应用 六.R建模 1.载入相关包(内含彩蛋): 1.1 library包载入 1.2 pacman包载 ...

  4. caffe训练分类模型教程

    caffe训练分类模型教程 1.已有图像存放在train和val下,book和not-book(两类)的图片数量相同 在caffe/data下新建一個myself文件夾,并新建两个文件夹分别命名为tr ...

  5. 如何调用 caffe 训练好的模型对输入图片进行测试

    如何调用 caffe 训练好的模型对输入图片进行测试 该部分包括两篇文章 win10 下 caffe 的第一个测试程序(附带详细讲解) 主要讲解如何利用 caffe 来训练模型. 如何调用 caffe ...

  6. logistic回归 如何_第七章:利用Python实现Logistic回归分类模型

    免责声明:本文是通过网络收集并结合自身学习等途径合法获取,仅作为学习交流使用,其版权归出版社或者原创作者所有,并不对涉及的版权问题负责.若原创作者或者出版社认为侵权,请联系及时联系,我将立即删除文章, ...

  7. 独家 | 教你用Pytorch建立你的第一个文本分类模型!

    作者:Aravind Pai 翻译:王威力 校对:张一豪 本文约3400字,建议阅读10+分钟 本文介绍了利用Pytorch框架实现文本分类的关键知识点,包括使用如何处理Out of Vocabula ...

  8. 百度开源业内首个口罩人脸检测及分类模型,携手开发者共同抗疫

    2020-02-13 15:33:32 允中 发自 凹非寺 量子位 编辑 | 公众号 QbitAI 抗击疫情,众志成城,人工智能技术正被应用到疫情防控中来. 2月13日,百度宣布免费开源业内首个口罩人 ...

  9. 机器学习多目标分类模型解法

    机器学习被广泛的应用于推荐.风控等场景.经典的机器学习建模数据是由特征列和单一目标列构成的,比如要做广告的CTR预测,其实模型关心的是一个广告曝光后是否会被点击,这是一个单一目标场景的建模过程.但是在 ...

  10. Lesson 5.分类模型决策边界与模型评估指标

    Lesson 5.分类模型决策边界与模型评估指标(上) 在逻辑回归的算法基础内容结束之后,我们还需要补充一些关于分类模型的基础知识,包括观察分类模型判别性能的决策边界基本的概念与实现方法,同时也包括对 ...

最新文章

  1. C#中判断空字符串的3种方法性能分析【月儿原创】
  2. 上周新闻回顾:微软补丁个个紧急 奥运网络百花齐放
  3. IEEE:2021年的机遇、挑战以及关键的科技趋势
  4. 1月31日云栖精选夜读:阿里云客户案例研究:罗辑思维
  5. C++面试笔记(2)
  6. 基于.NET实现数据挖掘--朴素贝叶斯算法
  7. 【51单片机快速入门指南】4.3.2: MPU6050:一阶互补滤波、二阶互补滤波和卡尔曼滤波获取欧拉角
  8. SQlite数据库的C编程接口(三) 预处理语句(Prepared Statements) ——《Using SQlite》读书笔记 .
  9. 手柄游戏之《恶魔城暗影之王》推荐
  10. pr视频两边模糊_干货!Pr教程:如何在视频中添加模糊效果?
  11. 40 个科研学术网站,赶紧来收藏一波!
  12. Qt 实现 别踩白块儿。
  13. 教你如何使用 Python 将 pdf 文档进行 加密 解密——python实用小技能分享
  14. Qt creator学习笔记(一)认识Qt
  15. 编译原理(1)词法分析程序(C++实现)
  16. 理解F.dropout 和nn.ReLU(inplace=True)中inplace的作用
  17. 神经网络的主要应用领域,神经网络技术及其应用
  18. 与 vmx86 驱动程序的版本不匹配解决方法
  19. Windows 10 安装STF实战
  20. CANoe的使用之Diva工程新建

热门文章

  1. nginx、tomcat负载均衡
  2. 每天CookBook之JavaScript-073
  3. C#信息采集系统,常见控件练习
  4. 如何解决第三方JavaScript引入工程后报错
  5. JQuery Jcrop—JQuery Jcrop 图像裁剪工具学习
  6. SqlServer中截取(获取)字符串中特定字符分割的每个元素
  7. libevent 编程疑难解答
  8. 1.React学习笔记----基础模板创建+远程仓库建立
  9. 每天一道剑指offer-链表中环的入口节点
  10. modbus发送接收_自己编写MODBUS协议代码所踩过的坑