前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV4 | 如何一行代码搞定SSD模型推理与结果解析

OpenCV4 | 如何一行代码搞定SSD模型推理与结果解析

作者头像
OpenCV学堂
发布2019-11-11 13:20:41
1.5K0
发布2019-11-11 13:20:41
举报
文章被收录于专栏:贾志刚-OpenCV学堂

高阶API介绍

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

dnn::ClassificationModel

dnn::DetectionModel

dnn::SegmentationModel

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

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

代码语言:javascript
复制
DetectionModel
(const String &model,  // 模型权重
const String &config="" // 配置文件
)

检测函数:

代码语言:javascript
复制
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文件夹下的

代码语言:javascript
复制
download_weights.py

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

代码语言:javascript
复制
// 定义与初始化 检测模型
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方法进行人脸检测即可:

代码语言:javascript
复制
face_detector.detect(frame, classIds, confidence, boxes, 0.5, 0.0);

完整的演示程序如下:

代码语言:javascript
复制
// 定义与初始化 检测模型
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倍以上:

代码语言:javascript
复制
face_detector.setPreferableBackend(DNN_BACKEND_INFERENCE_ENGINE);
face_detector.setPreferableTarget(DNN_TARGET_CPU);

再看一下运行效果

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档