
文章题目比较大,源码解读是一项很庞大的工程,本文只是一个引子。小编也希望借写文章的机会,好好读一下代码,真正了解原理,并与读者一起讨论学习,接受批评。
读文章前,不妨看一下YOLOV3检测效果的视频~~
YOLOv3 效果展示
怎么样,够惊艳吧!是不是更想深入了解了呢!
YOLOV3是什么?
计算机视觉领域主要有图像分类、图像定位、目标检测、目标跟踪等几大任务。图像分类模型是将图像划分为单个类别,通常对应于图像中最突出的物体。图像定位是在图像分类的基础上,确定目标具体在图像的什么位置;目标检测是从图像中输出单个目标的Bounding Box(边框)以及标签。
在图像定位中,通常只有一个或固定数目的目标,而目标检测更一般化,图像中出现的目标种类和数目都不确定;目标跟踪是指在给定场景中跟踪感兴趣的具体对象或多个对象的过程,简单来说,给出目标在跟踪视频第一帧中的初始状态(如位置、尺寸),自动估计目标物体在后续帧中的状态。
YOLO 是Joseph Redmon,Santosh Divvala,Ross Girshick和Ali Farhadi提出的一种目标检测算法。人类视觉系统快速且精准,只需看一眼就可以识别图像的物体和位置,因此,作者用YOLO(You Only Look Once)命名其算法,将图像分类和目标定位合二为一。
目标检测技术可在很多场景应用,如无人驾驶、变电站机器人巡检、线路无人机巡检等。
YOLO算法目前已有3个版本,在速度和精确度上都得到巨大提升,小编喜欢一步到位(好高骛远),所以以最新的YOLOV3版本进行分析。其源码可从 https://github.com/pjreddie/darknet 下载。
YOLOV3的优势
目标检测领域有非常多优秀的算法,比如基于候选区域的目标检测器,包括Fast R-CNN、Faster R-CNN 和 FPN等,以及包括YOLO、SSD和RetinaNet等在内的单次检测器。
YOLOV3性能指标如何呢?可以从准确率和检测速度两方面来衡量。“YOLOv3非常快速和准确。在IoU设为0.5时测定mAP,YOUOv3与Focal Loss相当,但速度快了约4倍。而且只需更改模型的大小,您就可以轻松地在速度和精度之间进行平衡!”,如官方图。

可以看出,对于 320x320 的图像,YOLOv3 可以达到22ms的检测速度,与 SSD 的准确率相当,速度却快 3 倍。YOLOv3在一块 TitanX 上可以 51ms 的速度达到57.9 AP_50 的性能,而用 RetinaNet 则以 198ms 的速度获得 57.5 AP_50 的性能,性能相近但快3 倍。
从前面视频也可以看到,YOLOV3对小物体或远处物体、重叠遮挡物体、运动模糊物体、密集物体的识别率都非常高。
使用YOLO进行目标检测
1 使用预训练模型
使用预先训练的模型通过YOLO系统检测对象,如果没有安装Darknet,那么应该首先安装Darknet。

在cfg/子目录中,可以找到YOLO的配置文件。然后下载预先训练好的模型,大约237MB。

运行检测器:

运行时输出如下:

输出目标检测结果:

怎么样,是不是有点小成就感……

2 训练自己的模型
这部分网上资料很多,可以自行搜索。比如你需要做一个变电站巡检机器人,先搜集了大量油位计、呼吸器、压力表、开关状态、漏油等等,甚至冒烟着火的照片(小编认为这一步是最重要的,巧妇难为无米之炊嘛),然后需要按照VOC数据集的格式准备训练数据集。
目录结构如下图所示:

此外,需要对采集到的图片进行标记,如使用LabelImg工具。Windows下编译好的工具不好找,可以下载labelImg-master,在python环境下运行工具。

YOLOV3执行流程
YOLOV3官方原始代码为C语言所写,基本没有使用第三方库,几乎所有细节都可以从代码中找得到。但是由于源码并没有相关注释,阅读起来会比较费劲。
工欲善其事,必先利其器。
小编认为还是VS更符合个人习惯,调试很方便(阅读代码必须跟踪调试,否则难以理解),安装VS2015社区免费版就足够了,当然要真正能运行,还需要安装NV驱动、opencv、CUDA、cuDNN等等。
官方下载的YOLOV3是linux工程项目,偷懒不想自己改为VS工程的话,可以拿来主义,百度darknet-master_VS下载。
yolo中源码主要包括三部分,\example,\include,以及\src。

主函数main(int argc, char **argv)在dartnet.c中。以训练为例,输入运行参数:./darknet detetor train cfg/voc.data cfg/yolov3-voc.cfg,也可在VS中配置,如下:

argv[0]即第一个参数是./darknet,程序名;
argv[1]即第二个参数是detector;
主函数main对于参数argv[1]进行判断,根据argv[1]参数来启动不同的程序。这里argv[1] =detector,调用的函数是run_detector(),同时把argc和argv参数传过去。
run_detector()函数获取数据集配置文件路径char *datacfg = argv[3],如voc.data中包括训练、测试、验证数据集的路径。

获取模型配置文件路径,char *cfg = argv[4];
run_detector()函数根据argv[2]参数决定下一步执行的功能。这里argv[2]=train,跳转到train_detector()函数。

train_detector()执行过程如下:


构建的神经网络结构如下:





可以看出YOLO的代码结构还是非常清晰的。
以上就是本期的内容分享啦~下期将会为大家带来YOLO的重点功能代码解读。
本期参考文章:
https://blog.csdn.net/lixincan_hit/article/details/80290758
https://blog.csdn.net/l7H9JA4/article/details/79620247
https://blog.csdn.net/upydwqpaso/article/details/82221373
https://blog.csdn.net/u014540717/article/details/53114067
(文章作者:Mr刘,一个热爱Ai的传统码农~)
想要Mr刘联系方式的伙伴,可以私信留言小瓦君~✌️✌️
瓦特和比特
“瓦特和比特”致力于打造国内最专业有趣的能源电力&数据分析学习社区,集结能源行业优秀的业务专家和数据分析大咖,为数据分析从业者和能源从业者提供一种全新的能源电力&数据分析交流方式。
案例|电力系统基于大数据的短期负荷预测
从大数据分析角度,探讨电力设备状态检测与评估
小瓦君提示:关注“瓦特和比特”,学习最新的电力数据技能,为你热爱的工作打开新的视野~同时也欢迎从事不同岗位的电力人,公众号留言,跟小瓦君一起分享你的“电力人生”😊
瓦特和比特
有趣的分析在等你长按扫码可关注

