据说,现在很多小区都上线了AI抓拍高空抛物的黑科技,可以自动分析抛物轨迹,用来协助检查很多不文明行为

你想不想知道,这类检测视频中目标物的黑科技是怎么实现的呢?

虽然不同场景下的目标检测模型训练不同,但底层技术都是一样的。

这里就一步步来教一下大家如何用C++ 和OpenCV 实现视频目标检测(YOLOv4模型)。

1.     实现思路

读取视频流,载入模型,执行推理,找出所有目标及其位置,最后绘制检测结果。

2.     实现步骤

读取摄像头视频流或本地视频文件:

cv::VideoCapture cap;
cap.open(0); //打开摄像头
//cap.open("TH1.mp4"); //读取视频文件

载入模型:

cv::dnn::Net net = cv::dnn::readNet(config, model, framework);
net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);

执行推理:

net.forward(outs, outNames); //前向传播

找出所有目标及其位置:

for (size_t i = 0; i < outs.size(); ++i) {
     data = (float*)outs[i].data;
     for (int j = 0; j < outs[i].rows; ++j, data += outs[i].cols)
     {
         scores = outs[i].row(j).colRange(5, outs[i].cols);
         cv::minMaxLoc(scores, 0, &confidence, 0, &classIdPoint);

绘制检测结果:

void drawPred(
    cv::Mat &frame,
    vector<cv::Rect> &boxes,
    vector<int> &classIds,
    vector<int> &indices,
    vector<string> &classNamesVec)

 

java opencv 目标检测 opencv实现目标检测_机器学习算法

(a)测试图1YOLOv4

java opencv 目标检测 opencv实现目标检测_OpenCV_02

(b)测试图1YOLOv4-tiny

java opencv 目标检测 opencv实现目标检测_机器学习算法_03

(c)测试图2YOLOv4

java opencv 目标检测 opencv实现目标检测_OpenCV_04

(d)测试图2YOLOv4-tiny

图 YOLOv4与YOLOv4-tiny模型的检测结果

3.     总结

YOLOv4的检测精度优于YOLOv4-tiny。经GPU 加速后,模型推理速度明显提升,YOLOv4 的推理速度提高了约10倍,YOLOv4-tiny的推理速度提高了约4.8倍。