Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >利用OpenCV玩转YOLOv3

利用OpenCV玩转YOLOv3

作者头像
Amusi
修改于 2019-12-17 07:42:49
修改于 2019-12-17 07:42:49
6.2K00
代码可运行
举报
文章被收录于专栏:CVerCVer
运行总次数:0
代码可运行

前言

YOLOv3是You Only Look Once系列的最新目标检测算法,关于YOLOv3的介绍,网上一大堆,本文就不跟风描述。想要了解YOLOv3的同学,可以看一下YOLOv3:你一定不能错过

下面简单粗暴列出YOLOv3的结果和DarkNet-53结构:

YOLOv3实验结果

DarkNet-53结构

OpenCV-YOLOv3

前几个月跑过OpenCV-YOLOv2,因为时间问题,就没整理成推文。今天看到learnopencv的github上push了新代码,Amusi打开一看!哦哟,这不是OpenCV-YOLOv3么!

讲真,OpenCV开源社区的大神们太强大了,无时无刻不在更新OpenCV,里面DNN模块几乎每周都会更新。废话不多说,看看这次OpenCV-YOLOv3有哪些特点。

  1. 与OpenCV应用程序轻松集成:如果您的应用程序已经使用OpenCV而您只是想使用YOLOv3,则无需担心编译和构建额外的Darknet代码。
  2. OpenCV CPU版本快9倍:OpenCV的DNN模块CPU实现速度惊人。 例如,与OpenMP一起使用时,Darknet在CPU上花费大约2秒钟来对单个图像进行推理。 相比之下,OpenCV的实现只需0.22秒! 如下图所示:
  1. Python接口:Darknet是用C语言编写的,它并不官方支持Python。(其实这里不是不支持,而是没有Python源码,而是Python调用c编译的动态链接库来实现的)

CVer

Welcome to click AD

安装OpenCV3.4.2

注意:想要在OpenCV中玩转YOLOv3,必须安装OpenCV3.4.2版本及以上。

Python版安装方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1# 推荐安装外挂版
2pip install opencv-contrib-python
3
4# 或者安装正常版
5pip install opencv-python

C++版安装方法

注意,安装OpenCV3.4.2时,如果使用官方提供的release包,需要VS2015或者VS2017才能使用。若利用源码进行安装,需要使用CMake工具,有点费时间,这里Amusi就不安装了。

这里推荐一个Windows下安装OpenCV的教程《OpenCV学习之路》OpenCV3.3安装教程(Windows版)

link: https://blog.csdn.net/amusi1994/article/details/76768775

下载预训练模型

  • yolov3.cfg
  • yolov3.weights
  • coco.names

上述三个文件是YOLOv3官网提供的预训练模型及网络文件,其中yolov3.cfg中定义了网络结构,yolov3.weights是预训练权重,而coco.names就是COCO数据集的类别文件。

如何下载呢,你既可以去YOLO官网下载,也可以阅读下面的CVer福利

代码

C++代码

object_detection_yolo.cpp

由于源码过长,而且Amusi并没有亲测C++版本的代码。所以这里po一段利用OpenCV-YOLOv3处理视频帧的代码,来吊吊大家胃口。

至于为什么Amusi没有亲测C代码,因为安装C++版本的OpenCV3.4.2有点花时间,这里就偷点懒。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 1// Process frames.
 2 2while (waitKey(1) < 0)
 3 3{
 4 4    // get frame from the video
 5 5    cap >> frame;
 6 6
 7 7    // Stop the program if reached end of video
 8 8    if (frame.empty()) {
 9 9        cout << "Done processing !!!" << endl;
1010        cout << "Output file is stored as " << outputFile << endl;
1111        waitKey(3000);
1212        break;
1313    }
1414    // Create a 4D blob from a frame.
1515    blobFromImage(frame, blob, 1/255.0, cvSize(inpWidth, inpHeight), Scalar(0,0,0), true, false);
1616
1717    //Sets the input to the network
1818    net.setInput(blob);
1919
2020    // Runs the forward pass to get output of the output layers
2121    vector<Mat> outs;
2222    net.forward(outs, getOutputsNames(net));
2323
2424    // Remove the bounding boxes with low confidence
2525    postprocess(frame, outs);
2626
2727    // Put efficiency information. The function getPerfProfile returns the 
2828    // overall time for inference(t) and the timings for each of the layers(in layersTimes)
2929    vector<double> layersTimes;
3030    double freq = getTickFrequency() / 1000;
3131    double t = net.getPerfProfile(layersTimes) / freq;
3232    string label = format("Inference time for a frame : %.2f ms", t);
3333    putText(frame, label, Point(0, 15), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 255));
3434
3535    // Write the frame with the detection boxes
3636    Mat detectedFrame;
3737    frame.convertTo(detectedFrame, CV_8U);
3838    if (parser.has("image")) imwrite(outputFile, detectedFrame);
3939    else video.write(detectedFrame);
4040
4141}

Python代码

object_detection_yolo.py

限于篇幅原因,这里只po一段利用OpenCV-YOLOv3处理视频帧的代码。详细代码,见文末CVer福利

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1while cv.waitKey(1) < 0:
 2
 3    # get frame from the video
 4    hasFrame, frame = cap.read()
 5
 6    # Stop the program if reached end of video
 7    if not hasFrame:
 8        print("Done processing !!!")
 9        print("Output file is stored as ", outputFile)
10        cv.waitKey(3000)
11        break
12
13    # Create a 4D blob from a frame.
14    blob = cv.dnn.blobFromImage(frame, 1/255, (inpWidth, inpHeight), [0,0,0], 1, crop=False)
15
16    # Sets the input to the network
17    net.setInput(blob)
18
19    # Runs the forward pass to get output of the output layers
20    outs = net.forward(getOutputsNames(net))
21
22    # Remove the bounding boxes with low confidence
23    postprocess(frame, outs)
24
25    # Put efficiency information. The function getPerfProfile returns the 
26    # overall time for inference(t) and the timings for each of the layers(in layersTimes)
27    t, _ = net.getPerfProfile()
28    label = 'Inference time: %.2f ms' % (t * 1000.0 / cv.getTickFrequency())
29    cv.putText(frame, label, (0, 15), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255))
30
31    # Write the frame with the detection boxes
32    if (args.image):
33        cv.imwrite(outputFile, frame.astype(np.uint8));
34    else:
35        vid_writer.write(frame.astype(np.uint8))

实验结果

对图像进行目标检测

bird.jpg

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1python object_detection_yolo.py --image=bird.jpg

检测结果如下所示:

person.jpg

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1python object_detection_yolo.py --image=person.jpg

注:在Amusi渣渣笔记本(CPU为Inter i5-5300 HQ)上,OpenCV-YOLOv3(Python版)的速度是800ms左右,由此估计C++版本应该在300~500ms左右。其实CPU模式下,速度已经杠杠的了,来看看这恐怖的accuracy。

对视频进行目标检测

此次没有视频演示!没有视频演示!

为什么没有?!

因为上传视频有点麻烦,哈哈,但这不影响我们使用OpenCV-YOLOv3。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1python object_detection_yolo.py --video=run.mp4

侃侃

OpenCV真的很强大,Amusi刚才看了一下其DNN模块,官网提供的示例,居然将Faster R-CNN、SSD和YOLO等算法统一利用一个函数接口来调用。

试想一下,自己训练好的model,然后跑在OpenCV代码中,真的很cool。

这里不得不说说OpenCV的缺点,不方便训练且一般不提供GPU加速。

但还要啥自行车!要啥自行车!

CVer福利

关注CVer微信公众号,后台回复:opencv-yolov3

即可获得OpenCV-YOLOv3示例代码、预训练模型以及测试图像/视频。

参考

[1] https://pjreddie.com/darknet/yolo/

[2] https://github.com/spmallick/learnopencv/tree/master/ObjectDetection-YOLO

[3] https://www.learnopencv.com/deep-learning-based-object-detection-using-yolov3-with-opencv-python-c/

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

本文分享自 CVer 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
死磕YOLO系列,不会 AI没关系,用OpenCV 调用YOLO 做目标检测
对于视觉工程师而言,这当然是个小问题。可术业有专攻,不一定每个程序员都懂 AI 算法,那肯定就有一种方法把算法当成一个黑盒子,处理好输入输出就好了。
Frank909
2020/07/14
6.3K0
死磕YOLO系列,不会 AI没关系,用OpenCV 调用YOLO 做目标检测
目标检测实战:4种YOLO目标检测的C++和Python两种版本实现
本文作者使用C++编写一套基于OpenCV的YOLO目标检测,包含了经典的YOLOv3,YOLOv4,Yolo-Fastest和YOLObile这4种YOLO目标检测的实现。附代码详解。 >>加入极市CV技术交流群,走在计算机视觉的最前沿
Color Space
2021/05/18
2.2K0
目标检测实战:4种YOLO目标检测的C++和Python两种版本实现
ubuntu16.0.4 opencv4.0.0 yolov3测试
硬件信息 8 Intel® Core™ i7-4790 CPU @ 3.60GHz
用户1148525
2019/05/26
6590
【C++】OpenCV:YOLO目标检测介绍及实现示例
我们都知道,yolo这些深度学习检测算法都是在python下用pytorch或tf框架这些训练的,训练得到的是pt或者weight权重文件,这些是算法开发人员做的事情,如何让算法的检测精度更高、速度更快。
DevFrank
2024/07/24
1.4K0
OpenCV4.4 + YOLOv4 真的可以运行了…..
前一阵子YOLOv4发布了,后面就是YOLOv5,估计再过几天就要YOLOv10086了,这个时代技术进步太魔幻,改几个参数就可以继续升级版本。2020.718 OpenCV4.4发布了,支持YOLOv4推理,于是我立刻测试了一波。
OpenCV学堂
2020/07/24
8.3K2
OpenCV4.4 + YOLOv4 真的可以运行了…..
OpenCV DNN模块官方教程(二)YoloV4目标检测实例
OpenCV DNN模块官方教程地址如下,可以查看各个对应的使用方法https://docs.opencv.org/4.4.0/d2/d58/tutorial_table_of_content_dnn.html
Color Space
2020/09/23
3.8K0
OpenCV DNN模块官方教程(二)YoloV4目标检测实例
YOLOv3使用笔记
Google Cloud Platform (GCP) 深度学习虚拟机 (VM)(推荐!)
小锋学长生活大爆炸
2022/05/09
1.2K0
YOLOv3使用笔记
OpenCV DNN模块教程(四)Mask-RCNN实例分割
本文为OpenCV DNN模块官方教程的扩展,介绍如何使用OpenCV加载TensorFlow Object Detection API训练的模型做实例分割,以Mask-RCNN为例来检测缺陷。TensorFlow Object Detection API的github链接地址如下:https://github.com/tensorflow/models/tree/master/research/object_detection
Color Space
2020/10/29
1.1K0
OpenCV DNN模块教程(四)Mask-RCNN实例分割
利用OpenCV和深度学习实现人脸检测
今天偷点儿懒,就没有及时整理最新的paper,还请各位看官谅解。这里整理了一份前段时间做的小demo,实现献丑了 本文基于OpenCV3.3.1或以上版本(如OpenCV3.4)、DNN模块和face_detector示例实现简单、实时的人脸检测。 往期回顾 [计算机视觉] 入门学习资料 [计算机视觉论文速递] 2018-03-20 [计算机视觉论文速递] 2018-03-18 注: [1]:主要参考Face detection with OpenCV and deep learning这个英文教程
Amusi
2018/04/12
6.9K1
利用OpenCV和深度学习实现人脸检测
源码 | OpenCV DNN + YOLOv7目标检测
点击上方蓝字关注我们 作者:王博,极视角科技算法研究员 微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识 简单说明 分别使用OpenCV、ONNXRuntime部署YOLOV7目标检测,一共包含12个onnx模型,依然是包含C++和Python两个版本的程序。 编写这套YOLOV7的程序,跟此前编写的YOLOV6的程序,大部分源码是相同的,区别仅仅在于图片预处理的过程不一样。YOLOV7的图片预处理是BGR2RGB+不保持高宽比的resize+除以255 由于onnx文件太多,无法直接上传
OpenCV学堂
2022/07/19
4.1K1
源码 | OpenCV DNN + YOLOv7目标检测
Github 项目- 基于YOLOV3 和 DeepSort 的实时多人追踪
原文:Github 项目- 基于YOLOV3 和 DeepSort 的实时多人追踪 - AIUAI
AIHGF
2019/02/27
5.7K0
Github 项目- 基于YOLOV3 和 DeepSort 的实时多人追踪
YOLOV3实现车牌检测
计算机视觉无处不在-从面部识别,制造,农业到自动驾驶汽车。今天,我们将通过动手实践进入现代计算机视觉世界,学习如何使用YOLO算法检测车牌。
AI算法与图像处理
2021/03/14
1.5K0
YOLOV3实现车牌检测
深度学习:驾驶行为分析
程序功能简介: 使用yolo训练,OpenCV调用、实现打哈欠、手机、抽烟、系安全带,口罩检测。
DS小龙哥
2022/01/17
7810
深度学习:驾驶行为分析
OpenCV4.x的EAST场景文字检测
点击上方蓝字关注我们 微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识 EAST模型 EAST( An Efficient and Accurate Scene Text Detector)是标题的英文首字母缩写,模型出自旷视科技。相比其他几种场景文字检测模型,表现开挂。在ICDAR 2015数据集上表现优异,见下图: 可以看到红色点标记EAST模型的速度与性能超过之前的模型。EAST模型是一个全卷积神经网络(FCN)它会预测每个像素是否是TEXT或者WORDS,对比之前的一些卷积神经网
OpenCV学堂
2022/08/29
5520
OpenCV4.x的EAST场景文字检测
OpenCV4.0如何跑YOLOv3对象检测模型
OpenCV4.0发布以来,其深度神经网络(Deep Neural Network-DNN)模块,功能变得十分的强大、本公众号坚持不断探索DNN模块中各种新模型支持与黑科技,先后发布了一系列关于OpenCV DNN使用的文章:
OpenCV学堂
2019/04/29
1.6K0
OpenCV4.0如何跑YOLOv3对象检测模型
Yolov5 + Opencv DNN + C++部署
OpenCV由各种不同组件组成。OpenCV源代码主要由OpenCV core(核心库)、opencv_contrib和opencv_extra等子仓库组成。近些年,OpenCV的主仓库增加了深度学习相关的子仓库:OpenVINO(即DLDT, Deep Learning Deployment Toolkit)、open_model_zoo,以及标注工具CVAT等。
AI小怪兽
2023/11/30
2.1K0
使用opencv实现实例分割,一学就会|附源码
无论是从酒店房间接听电话、在办公里楼工作,还是根本不想在家庭办公室等情况,电话会议模糊功能都可以让会议与会者专注于自己,这样的功能对于在家工作并希望保护其家庭成员隐私的人特别有用。 为了实现这样的功能,微软利用计算机视觉、深度学习以及实例分割技术实现。 在之前的博文中,介绍了如何利用YOLO以及OpenCV实现目标检测的功能,今天将采用Mask R-CNN来构建视频模糊功能。
用户3578099
2019/08/15
2.4K0
10分钟学会使用YOLO及Opencv实现目标检测(上)|附源码
计算机视觉领域中,目标检测一直是工业应用上比较热门且成熟的应用领域,比如人脸识别、行人检测等,国内的旷视科技、商汤科技等公司在该领域占据行业领先地位。相对于图像分类任务而言,目标检测会更加复杂一些,不仅需要知道这是哪一类图像,而且要知道图像中所包含的内容有什么及其在图像中的位置,因此,其工业应用比较广泛。那么,今天将向读者介绍该领域中表现优异的一种算算法——“你只需要看一次”(you only look once,yolo),提出该算法的作者风趣幽默可爱,其个人主页及论文风格显示了其性情,目前该算法已是第三个版本,简称YoLo V3。闲话少叙,下面进入教程的主要内容。 在本教程中,将学习如何使用YOLO、OpenCV和Python检测图像和视频流中的对象。主要内容有:
用户3578099
2019/08/15
12.8K0
OpenCV中使用YOLO对象检测
OpenCV中使用YOLO对象检测 OpenCV在3.3.1的版本中开始正式支持Darknet网络框架并且支持YOLO1与YOLO2以及YOLO Tiny网络模型的导入与使用。YOLO是一种比SSD还
OpenCV学堂
2018/04/13
6.5K1
OpenCV中使用YOLO对象检测
EAST场景文字检测模型使用
EAST( An Efficient and Accurate Scene Text Detector)是标题的英文首字母缩写,模型出自旷视科技。相比其他几种场景文字检测模型,表现开挂。在ICDAR 2015数据集上表现优异,见下图:
OpenCV学堂
2019/03/07
2.1K0
推荐阅读
相关推荐
死磕YOLO系列,不会 AI没关系,用OpenCV 调用YOLO 做目标检测
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验