点击我爱计算机视觉标星,更快获取CVML新技术


本文转载自OpenCV学堂。

高阶API介绍

最新版本OpenCV 4.1.2,针对深度神经网络模块,提供了三个高阶的API,通过它们,自动实现输入图像预处理与后处理,直接输出检测结果,支持图像分类、对象检测、图像分割三种常见的视觉常见任务。相关API如下:

dnn::ClassificationModel

dnn::DetectionModel

dnn::SegmentationModel

它们之间的继承关系如下:

DetectionModel为例,创建时候声明模型路径(权重与配置文件路径)完成初始化与网络加载函数:

DetectionModel
(const String &model,  // 模型权重
const String &config="" // 配置文件
)

检测函数:

void cv::dnn::DetectionModel::detect(
InputArray frame, // 输入图像
std::vector< int > & classIds, // 输出类别index
std::vector< float > & confidences, // 得分
std::vector< Rect > & boxes, // 目标框
float confThreshold = 0.5f, // 阈值
float nmsThreshold = 0.0f  // NMS
)

这样就不需要再去解析SSD/Faster-RCNN/YOLOv3最后一层,而且这个函数还支持NMS功能,可以说是极大的方便了小白调用深度学习对象检测模型。是不是有一种级联检测器对象检测的既视感!

代码演示

以OpenCV深度神经网络模型自带的SSD人脸检测为例,首先需要运行:

samples\dnn\face_detector文件夹下的

download_weights.py

文件下载模型,下载之后,通过下面的代码执行加载与初始化:

// 定义与初始化 检测模型
DetectionModel face_detector(modelBinary, modelDesc);
face_detector.setInputSize(Size(300, 300));
face_detector.setInputMean(meanVal);
face_detector.setInputScale(1.0);
face_detector.setInputSwapRB(false);
face_detector.setInputCrop(false);

然后对输入的图像或者视频的每一帧调用detect方法进行人脸检测即可:

face_detector.detect(frame, classIds, confidence, boxes, 0.5, 0.0);

完整的演示程序如下:

// 定义与初始化 检测模型
DetectionModel face_detector(modelBinary, modelDesc);
face_detector.setInputSize(Size(300, 300));
face_detector.setInputMean(meanVal);
face_detector.setInputScale(1.0);
face_detector.setInputSwapRB(false);
face_detector.setInputCrop(false);// VideoCapture capture(0);
VideoCapture capture("D:/images/video/fbb.avi");
Mat frame;
vector<int> classIds;
vector<float> confidence;
vector<Rect> boxes;
ostringstream ss;
while (capture.read(frame)) {int64 start = getTickCount();imshow("input", frame);// 调用模型face_detector.detect(frame, classIds, confidence, boxes, 0.5, 0.0);for (int i = 0; i < boxes.size(); i++) {rectangle(frame, boxes[i], Scalar(0, 0, 255), 2, 8, 0);}double fps = cv::getTickFrequency() / (cv::getTickCount() - start);double time = (cv::getTickCount() - start) / cv::getTickFrequency();ss.str("");ss << " FPS: " << fps << " ; time: " << time*1000 << " ms";putText(frame, ss.str(), Point(20, 20), 0, 0.5, Scalar(0, 0, 255));imshow("dnn_face_detection", frame);if (waitKey(1) >= 0) break;
}
waitKey(0);
return;

运行效果如下:

速度有点感人,别着急,重新编译源码支持OpenVINO inference engine加速之后,改两行代码速度就可以提升10倍以上:

face_detector.setPreferableBackend(DNN_BACKEND_INFERENCE_ENGINE);
face_detector.setPreferableTarget(DNN_TARGET_CPU);

再看一下运行效果

很简单使用OpenVINO的推理引擎(IE)之后,加速效果满满的。


模型压缩于应用部署交流群

关注最新最前沿的模型压缩、轻量级网络设计、网络剪枝、应用部署、算法加速技术,扫码添加CV君拉你入群,(如已为CV君其他账号好友请直接私信)

(请务必注明:部署)

喜欢在QQ交流的童鞋,可以加52CV官方QQ群:805388940。

(不会时时在线,如果没能及时通过验证还请见谅)


长按关注我爱计算机视觉

如何一行代码搞定SSD模型推理与结果解析相关推荐

  1. WPF使用Linq 一行代码搞定数据绑定

    首先设置好DataGrid控件的相关属性,注意XAML代码文件中的列绑定要和源数据的列名一致,如: Binding="{Binding No}" 详细设置如下: this.data ...

  2. 开源作品ThinkJDBC—一行代码搞定数据库操作

    1 简介 ThinkJD,又名ThinkJDBC,一个简洁而强大的开源JDBC操作库.你可以使用Java像ThinkPHP框架的M方法一样,一行代码搞定数据库操作.ThinkJD会自动管理数据库连接, ...

  3. 成功解决numpy.ndarray格式类型转数据为list格式数据带有中括号(一行代码搞定!)

    成功解决numpy.ndarray格式类型转数据为list格式数据带有中括号(一行代码搞定!) 目录 解决问题 解决思路 解决方法 解决问题 numpy.ndarray格式类型转数据为list格式数据 ...

  4. 一行代码搞定 Scrapy 随机 User-Agent 设置

    摘要:爬虫过程中的反爬措施非常重要,其中设置随机 User-Agent 是一项重要的反爬措施,Scrapy 中设置随机 UA 的方式有很多种,有的复杂有的简单,本文就对这些方法进行汇总,提供一种只需要 ...

  5. 【Python】Autoviz: 一行代码搞定数据集探索并可视化

    数据集各个特征有什么变化趋势.各个特征之间有何关系,我们可以借助Matplotlib.Seaborn等诸多工具来可视化展示,那么有没有一种工具能一次展示所有的关系了? 本文要介绍的Python工具Au ...

  6. 一行代码搞定 FTP 服务

    环境搭建: python windows/linux pip install pyftpdlib (安装失败请到这里下载:https://pypi.python.org/pypi/pyftpdlib/ ...

  7. 一行代码搞定 GitHub 访问徽章

    相信对于使用 GitHub 的小伙伴来说,以上 GitHub 徽章(badge)应该都不怎么陌生吧.如果你想快速用起来,找到你想要的徽章代码 ctrl+c & ctrl+v ,再修改对应的 G ...

  8. SDAutoLayout 一行代码搞定自动布局

    SDAutoLayout(一行代码搞定自动布局!) QQ交流群:519489682(已满)497140713 ☆☆ SDAutoLayout 基础版视频教程:http://www.letv.com/p ...

  9. thinkjdbc 关闭_ThinkJD: ThinkJD,又名ThinkJDBC,一个强大的开源JDBC/ORM操作库,让你尽可能简洁地用一行代码搞定数据库操作。...

    1 简介 ThinkJD,又名ThinkJDBC,一个简洁而强大的开源JDBC操作库.你可以使用Java像ThinkPHP框架的M方法一样,一行代码搞定数据库操作.ThinkJD会自动管理数据库连接, ...

最新文章

  1. ADC和DAC常用技术术语
  2. Matlab稀疏矩阵
  3. boost::hana::make_set用法的测试程序
  4. java 常见bug_java常见bug
  5. 抽象思想解读Linux进程描述符
  6. 移动端列表以树的形式展示
  7. string与wstring互转
  8. 计算机之间是如何进行通信的?;详解三次握手和四次挥手
  9. Ubuntu下RamDisk使用
  10. 《Web漏洞防护》读书笔记——第6章,XXE防护
  11. 最详细的Android SDK下载安装及配置教程
  12. tushare找出箱体突破点
  13. asp.net 设置div带颜色透明
  14. 组装专用计算机系统吗,组装的电脑有自带系统吗?
  15. 如何将图片做成内外边框HTML,如何用html给图片加边框
  16. Centos系统找出并杀死僵尸进程
  17. (翻译自用)TG^2———IJDAR杂志论文
  18. 两轮电动车被小米、哈啰们盯上了
  19. 2014黑帽大会揭露十大恐怖安全漏洞!
  20. K - 链表的有序集合_Java

热门文章

  1. access 动态 top 条件_2020年10月抖音直播营销报告_行业动态
  2. k8s包管理器helm_是时候使用Helm了:Helm, Kubernetes的包管理工具
  3. 石头剪刀布程序流程图_“剪刀、石头、布”也能救命?临安区社会福利中心开展海姆立克急救法培训...
  4. int** 赋值_一篇文章搞明白Integer、new Integer() 和 int 的概念与区别
  5. js判断定时器是否启动_原生js如何做出轮播图的效果
  6. print(程序结束)_Python入门丨print()函数
  7. nginx做https跳转apache
  8. vc++ 提取网页上的文字_用奢悦vc一般多久能反黑
  9. python 3.8 新特性_Python 3.8六大新功能
  10. java 参数类型不确定_java泛型的那些事