首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >OpenCV4.4 + YOLOv4 真的可以运行了…..

OpenCV4.4 + YOLOv4 真的可以运行了…..

作者头像
OpenCV学堂
发布于 2020-07-24 07:59:10
发布于 2020-07-24 07:59:10
8.3K01
代码可运行
举报
运行总次数:1
代码可运行

微信公众号:OpenCV学堂

前一阵子YOLOv4发布了,后面就是YOLOv5,估计再过几天就要YOLOv10086了,这个时代技术进步太魔幻,改几个参数就可以继续升级版本。2020.718 OpenCV4.4发布了,支持YOLOv4推理,于是我立刻测试了一波。

模型下载

YOLOv4的相关模型合集在这里

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://github.com/AlexeyAB/darknet/wiki/YOLOv4-model-zoo

我使用的是基于COCO预训练模型:

YOLOv4-Leaky

OpenCV4.4 DNN

OpenCV4.4 支持YOLOv4,这个是它的官方release里面说的,其实我早就发现了YOLOv4可以通过OpenCV4.2直接跑,怎么OpenCV4.4才官宣。也许不发布新版本不好官宣,只有发布了新版本才可以顺便说一下。此外OpenCV4.4 DNN还有很多新添加的演示程序,支持了深度学习的光流、支持tensorflow object detection API的EfficientDet对象检测模型,但是前提是tensorflow2.x才可以。多了一个tf_text_graph_efficientdet.py文件,用来生成对应的pbtxt文件。

OpenCV4.4 DNN + YOLOv4对象检测演示

跟YOLOv3一样,YOLOv4也有三个输出层,完成推理之后,需要在进一步通过NMS实现对重叠框的去除,什么是NMS(非最大抑制),看下图就懂啦:

然后说一下模型输入格式与输出格式

输入:NCHW=1x3x416x416 输出:NXC 其中N表示多少个对象,C的前四个数矩形框的[center_x, center_y, width, height],从第五个数值开始分别是每个类别的得分,求的最大得分,如果高于阈值0.5,则认为检测到了对象,每个score对应的index即是COCO类别文本。

根据上面的描述,对一个视频文件实现YOLOv4的对象检测代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Net net = readNetFromDarknet(yolov4_config, yolov4_model);
net.setPreferableBackend(DNN_BACKEND_INFERENCE_ENGINE);
net.setPreferableTarget(DNN_TARGET_CPU);
std::vector<String> outNames = net.getUnconnectedOutLayersNames();
for (int i = 0; i < outNames.size(); i++) {
    printf("output layer name : %s\n", outNames[i].c_str());
}

vector<string> classNamesVec;
ifstream classNamesFile("D:/projects/opencv_tutorial/data/models/object_detection_classes_yolov3.txt");
if (classNamesFile.is_open())
{
    string className = "";
    while (std::getline(classNamesFile, className))
        classNamesVec.push_back(className);
}

VideoCapture capture;
capture.open("D:/images/video/f35_02.mp4");
Mat frame;
// 加载图像 
while (true) {
    int64 start = getTickCount();
    capture.read(frame);
    Mat inputBlob = blobFromImage(frame, 1 / 255.F, Size(416, 416), Scalar(), true, false);
    net.setInput(inputBlob);

    // 检测
    std::vector<Mat> outs;
    net.forward(outs, outNames);

    vector<Rect> boxes;
    vector<int> classIds;
    vector<float> confidences;
    for (size_t i = 0; i<outs.size(); ++i)
    {
        // detected objects and C is a number of classes + 4 where the first 4
        float* data = (float*)outs[i].data;
        for (int j = 0; j < outs[i].rows; ++j, data += outs[i].cols)
        {
            Mat scores = outs[i].row(j).colRange(5, outs[i].cols);
            Point classIdPoint;
            double confidence;
            minMaxLoc(scores, 0, &confidence, 0, &classIdPoint);
            if (confidence > 0.5)
            {
                int centerX = (int)(data[0] * frame.cols);
                int centerY = (int)(data[1] * frame.rows);
                int width = (int)(data[2] * frame.cols);
                int height = (int)(data[3] * frame.rows);
                int left = centerX - width / 2;
                int top = centerY - height / 2;

                classIds.push_back(classIdPoint.x);
                confidences.push_back((float)confidence);
                boxes.push_back(Rect(left, top, width, height));
            }
        }
    }

    vector<int> indices;
    NMSBoxes(boxes, confidences, 0.5, 0.2, indices);
    for (size_t i = 0; i < indices.size(); ++i)
    {
        int idx = indices[i];
        Rect box = boxes[idx];
        String className = classNamesVec[classIds[idx]];
        putText(frame, className.c_str(), box.tl(), FONT_HERSHEY_SIMPLEX, 1.0, Scalar(255, 0, 0), 2, 8);
        rectangle(frame, box, Scalar(0, 0, 255), 2, 8, 0);
    }
    float fps = getTickFrequency() / (getTickCount() - start);
    float time = (getTickCount() - start) / getTickFrequency();
    ostringstream ss;
    ss << "FPS : "<< fps <<" detection time: " << time*1000 << " ms";
    putText(frame, ss.str(), Point(20, 20), 0, 0.5, Scalar(0, 0, 255));
    imshow("YOLOv4-Detections", frame);
    char c = waitKey(1);
    if (c == 27) {
        break;
    }
}
waitKey(0);
return;

代码运行结果如下:

我只能说速度有点感人,我有点怕啦,当然我是在i7CPU上运行的。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
140行代码自己动手写一个词云制作小工具(文末附工具下载)
继之前出过表格拆分与合并小工具、pdf转word小工具后,今天我们迎来了词云制作小工具。
可以叫我才哥
2021/08/05
1K0
80行代码自己动手写一个表格拆分与合并小工具(文末附工具下载)
可能是最近加班熬夜太多,这个周末身体不舒服,头痛、冷汗什么的。终于在连着睡了接近2天后,现在慢慢恢复了。
可以叫我才哥
2021/08/05
1.3K0
用Python敲一个今日历史查看小工具,让它来告诉你历史的今天发生过什么大事!
这篇文章灵感源于最近发生的事,信息量都很大,然后突然就想看看历史的今天有发生过什么大事件,最后就写了个查看今日历史的小工具,下面就开始实战!
Python与Excel之交
2021/08/05
8271
用Python手撕一个批量填充数据到excel表格的工具,解放双手!
今天这篇文章是根据批量填充数据的进阶版。基础版本就一段很简单的代码。虽然简单,但如果这个模板或者数据发生变化,还是要改来改去的,所以本文就在基础版本上进行改进,只需要动动鼠标就可以填充大量数据到Excel工作表中。
Python与Excel之交
2021/08/05
2K0
用python实现清理重复文件工具~
在电脑上或多或少的存在一些重复文件,体积小的倒没什么,如果体积大的就很占内存了,而如果自己一个一个查看文件是否重复,然后再删除,还是很要命的。
Python与Excel之交
2021/11/09
2K0
用python实现清理重复文件工具~
爱了爱了,扔了网上的正则调试工具后,我吧啦吧啦自己写了一个!(文末附源码以及工具下载)
最近在做个项目,里面经常用到正则表达式,需要不停的调试修改正则表达式,如果直接在程序里跑,是一件很麻烦且缓慢的事,网上有挺多的正则表达式调试网站,奈何这边网络太差,比让人在程序里跑还让人崩溃,所以就自己写了个正则表达式调试小工具。
Python与Excel之交
2021/09/06
5560
用python实现批量打包程序的工具~
最近看了一些大佬发的关于可视化打包工具auto-py-to-exe文章,auto-py-to-exe是基于pyinstaller,但相比于pyinstaller,它多了 GUI 界面。我自己也试了一下,感觉确实好用且方便,动动手指就能对程序进行打包。
Python与Excel之交
2021/10/14
1.2K0
40行代码自己动手写pdf转word小工具(文末附工具下载)
今天咱们介绍一个pdf转word的免费小工具,满足这么一个不常见但是偶尔会出来烦人的需求!
可以叫我才哥
2021/08/05
2.5K0
惊呆同事的自动化小工具来了!Python 批量将 PDF 转 Word
本期视频内容:惊呆同事的自动化小工具来了!Python 批量将 PDF 转 Word
杰哥的IT之旅
2022/12/06
1.6K0
惊呆同事的自动化小工具来了!Python 批量将 PDF 转 Word
用python实现千图成像工具,快给你的男/女神弄一张吧~
千图成像也就是用N张图片组成一张图片的效果。制作方法有很多的,最常见的如用ps、懒人图云、foto-mosaik-edda这些制作。
Python与Excel之交
2021/10/26
1.1K0
用python实现千图成像工具,快给你的男/女神弄一张吧~
手把手教你爬取某酷音乐付费歌曲~
爬取酷我音乐相比网易云音乐、酷狗音乐以及QQ音乐来说容易很多,没有加密算法,而且在反爬虫中不存在一些难理解的逻辑,只需要理清思路即可!本文会用爬虫+GUI制作酷我音乐下载工具
Python与Excel之交
2021/08/05
3.5K0
用Python制作一个B站视频下载小工具
今天我们分享一个小工具,主要用于B站视频的下载,只需要输入对应视频的网页地址就可以进行下载到本地了。
查理不是猹
2022/01/11
1.1K1
用Python制作一个B站视频下载小工具(文末附完整代码)
今天我们分享一个小工具,主要用于B站视频的下载,只需要输入对应视频的网页地址就可以进行下载到本地了。
可以叫我才哥
2022/04/12
4.2K1
用Python制作一个B站视频下载小工具(文末附完整代码)
新手请教python抽奖程序
大家好,我开始学python,想做一个抽奖程序,源代码如下,如果我要在框架内加上1等奖1个人 ,2等奖2个人,三等奖3个人 应该怎么样编写相关联的代码,就是点击1等奖按钮就只出现一个随机滚动的人员名单,2等奖按钮出现2个滚动的滚动栏,依次类推。
用户4033862
2018/11/27
2.1K0
新手请教python抽奖程序
经典实践 | 网速测速小工具(上)
speedtest 是世界上流行的网速测试平台,python 有其对应的库名为 speedtest-cli。我们可以使用其客户端进行网络测试,也可以使用类对象用代码去测试。我们执行 pip3 install speedtest-cli 即可安装。
玖柒的小窝
2021/10/05
1.3K0
经典实践 | 网速测速小工具(上)
JS-抽奖系统-实现原理
有本事中奖的,过来找我换红包!!哈哈!! <meta charset="UTF-8"> <title>抽奖系统</title> <style type="text/css"> .wrap { width: 300px; margin: 20px auto; text-align: center; } .box { padding: 10px; color: red; font: bold 24px "微软雅黑"; border: 1px solid #FF7F50; color: red; mar
xing.org1^
2018/05/17
8.8K2
Python使用Tkinter实现转盘抽奖器
我使用 Python 中的 Tkinter 模块实现了一个简单的滚动抽奖器,接下来继续写一个简单的转盘抽奖器。
Python碎片公众号
2021/02/26
4K0
Python使用Tkinter实现转盘抽奖器
用Python搞定抖X无水印短视频下载
有时候刷抖音,遇到喜欢的视频保存在本地,然后都是带有水印的,作为有一点“洁癖”的小编,不太喜欢。索性就自己用Python制作了这个简单的小工具,用于下载抖音无水印短视频!
可以叫我才哥
2022/04/12
9590
用Python搞定抖X无水印短视频下载
【 Python 办公】抽奖小工具
你现在是公司的HR,领导想让你在做一个抽奖系统在年会用,参与人员与奖品全在Excel里。见下图
花花Binki
2024/03/20
3350
GUI实战|Python做一个文档图片提取软件
本文将进一步讲解如何用Python提取PDF与Word中图片,并结合之前讲解过的GUI框架PysimpleGUI,做一个多文件图片提取软件,效果如下:
刘早起
2021/01/05
1.5K0
推荐阅读
相关推荐
140行代码自己动手写一个词云制作小工具(文末附工具下载)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验