点击上方蓝字关注我们
微信公众号:OpenCV学堂
关注获取更多计算机视觉与深度学习知识
高阶API介绍
最新版本OpenCV4.1.2,针对深度神经网络模块,提供了三个高阶的API,通过它们,自动实现输入图像预处理与后处理,直接输出检测结果,支持图像分类、对象检测、图像分割三种常见的视觉常见任务。相关API如下:
dnn::ClassificationModel
dnn::DetectionModel
dnn::SegmentationModel
它们之间的继承关系如下:
以DetectionModel为例,创建时候声明模型路径(权重与配置文件路径)完成初始化与网络加载函数:
DetectionModel(constString &model, // 模型权重constString &config=""// 配置文件)
检测函数:
void cv::dnn::DetectionModel::detect(InputArray frame, // 输入图像std::vector< int > & classIds, // 输出类别indexstd::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, 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)之后,加速效果满满的。
推荐阅读
OpenCV加速与优化,让代码执行速度飞起来
CPU上跑深度学习模型,FPS也可以达100帧
网络模型量化与推理加速框架OpenVINO最新版本SDK演示
如何编译OpenCV4.1.0支持OpenVINO推断引擎加速支持
10分钟学会 OpenCV CUDA编程
OpenVINO深度学习推理框架 开发技术系列文章汇总
首发 | OpenVINO开发配套视频教程发布了
最后送个福利,需要的自取!
|