欢迎重视我的公众号 [极智视界],回复001获取Google编程规范

O_o>_<o_OO_o~_~o_O

  大家好,我是极智视界,本文详细介绍一下 YOLOv1 算法的规划与完成,包含练习。

  本文是方针检测类算法完成共享的第一篇,从 用回归做物体检测 算法开山鼻祖 YOLOv1 讲起。YOLO (You Only Look Once) 是充溢艺术性和实用性的算法系列,而 YOLOv1 是个开头,在论文《You Only Look Once:Unified, Real-Time Object Detection》中提出。YOLO 方针检测算法以实时著称,并经不断发展能逐渐兼顾精度。简略看一些 YOLO 官网的宣传作用:

极智AI | 目标检测实现分享一:详解 YOLOv1 算法实现

  下面开端,同样这儿不止会讲原理还会讲完成及练习。

1、YOLOv1 原理

  在论文中其实不止提出了 baseline YOLOv1 模型,还提出了 Fast YOLOv1,而 Fast YOLOv1 旨在让人们看到 YOLO 的功率极限。先来看论文中的试验数据,YOLOv1 的主要对标对象是 Fast R-CNN、DPM,下面是精度 (mAP) 和 功能 (fps) 数据:

     

极智AI | 目标检测实现分享一:详解 YOLOv1 算法实现

  练习测验数据集是 PASCAL VOC 0712,硬件是 Nvidia Titan X,这儿咱们主要关心 Real-Time Detectors,能够看到比较于 DPM 和 Fast R-CNN, YOLOv1 兼顾精度和推理功率,还能够注意到 Fast YOLOv1 的帧率达到了的 155 fps,相当于浮点推理单图 6.5 个 ms,这在其时相当快。

  YOLOv1 比较于 Fast-RCNN 能够更加好的区分布景和待检测方针,然而 YOLOv1 并不是一个极度完美的网络,还有一些缺陷 (这跟网络规划相关),如下:

     

极智AI | 目标检测实现分享一:详解 YOLOv1 算法实现

  上图是 Fast R-RCNN vs YOLOv1 Error Analysis,能够看到主要有以下几点:

  (1) YOLOv1 的猜测准确度 Correct 没 Fast R-CNN 高;

  (2) YOLOv1 的 Localization 错误率更高,这是因为 YOLOv1 选用直接对方位进行回归的方式进行猜测,这不如滑窗式的;

  (3) YOLOv1 关于布景猜测的错误率更低;

  以试验结论为导向,下面介绍 YOLOv1 的网络规划艺术。

1.1 网络结构规划

极智AI | 目标检测实现分享一:详解 YOLOv1 算法实现

  整个网络由 24 个卷积层 (受 GoogLeNet 启示,有很多 1 x 1 和 3 x 3 替换的结构) 和 2 个全连接层构成,输入图画尺度为 448 x 448,输出为 7 x 7 x 30,说一下输出为啥是这个 shape。YOLOv1 会把输入图画划成 7 x 7 的 grid,每个 grid 担任猜测 2 个方针,关于每个方针来说又有这些属性:x、y、h、w、置信度,然后再加上类别数 20,这样就形成了 7 x 7 x (2 x 5 + 20) = 7 x 7 x 30 的输出 tensor 了。如下:

     

极智AI | 目标检测实现分享一:详解 YOLOv1 算法实现

  因为 YOLOv1 将图片划分为 7 x 7 个 grid,尽管每个 grid 担任猜测两个方针,但最后会经过抑制只保存一个匹配度最高的 bounding box,也就是说一张图我最多就给你猜测七七 49 个方针,那么想一下,如果有两个相邻的方针落在了同一个 grid 中,那么势必会漏检一个,所以 YOLOv1 关于附近方针的检测作用不好。

1.2 丢失函数规划

  YOLOv1 的整个丢失函数如下,这个比较经典:

     

极智AI | 目标检测实现分享一:详解 YOLOv1 算法实现

  一个个来说:

  (1) 第一个和第二个都是方位丢失。第一个是中心点方位丢失,选用简略的平方和进行核算。其中 lij^obj 是一个控制参数,作用是当标签中该 grid 有待检测物体,则为 1,否则为零;

  (2) 第二个是宽高丢失。这儿对 w、h 分别取了根号,原因是这样能够减缓倾向于调整尺度比较大的猜测框,这儿的 lij^obj 和第一个中的相同;

  (3) 第三个和第四个需求结合起来看,都是猜测框的置信度丢失。第三个是有方针的时分,第四个是没有方针的时分,咱们知道,实际检测时 49 grid 中每个 grid 有方针和没方针也是个长尾问题,往往有方针的情况占少量,所以在这儿规划给了 obj = 5,noobj = .5 的权重平衡;

  (4) 第五个是类别丢失。

  原理就讲这么多,接下来是实践。

2、YOLOv1 完成

  github 地址:github.com/AlexeyAB/da…

  darknet 编译就不多说了,默许已经编译好了,这步不会的同学能够翻看我之前的文章,有相关介绍。

  下面介绍一下制造 VOC0712 交融数据集。

2.1 制造 VOC0712 交融数据集

  下载数据集

# download datasets
wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget https://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar
wget https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar

# 解压
tar xf VOCtrainval_11-May-2012.tar
tar xf VOCtrainval_06-Nov-2007.tar
tar xf VOCtest_06-Nov-2007.tar

  制造 imagelist:

# 生成label及train.txt、test.txt、val.txt
wget https://pjreddie.com/media/files/voc_label.py
python voc_label.py

# 装备 2012train、2007_train、2007_test、2007_val 为练习集,2012_val 为验证集
cat 2007_* 2012_train.txt > train.txt

  这个时分的目录结构是这样的:

     

极智AI | 目标检测实现分享一:详解 YOLOv1 算法实现

2.2 练习

  然后能够进行练习,这儿需求注意的是 YOLOv1 的练习指令和 YOLOv2 和 YOLOv3/v4 的不太相同,YOLOv1 的练习指令如下:

./darknet yolo train cfg/yolov1/yolo.train.cfg

  是不是稍微有点好奇,以上命令中并没有指定练习图片途径,这个途径是在代码内部写死的 (包含保存权重的途径 backup/ 也是写死的):

极智AI | 目标检测实现分享一:详解 YOLOv1 算法实现

  这个地方能够改成自己想指定的 train.txt 的途径,然后重新编译结构:

make clean
make -j32

  然后再履行练习指令,开端练习:

极智AI | 目标检测实现分享一:详解 YOLOv1 算法实现

  能够看到已经开端练习了,这儿咱们使用了默许的练习装备:

     

极智AI | 目标检测实现分享一:详解 YOLOv1 算法实现

  这儿的一些参数能够根据自己的需求进行相应的修正。

2.3 验证

  练习的过程比较绵长,等练习完毕能够测验一下练习结果:

./darknet yolo test cfg/yolov1/yolo.cfg backup/yolo.weights

     

极智AI | 目标检测实现分享一:详解 YOLOv1 算法实现

  在 Enter Image Path 中输入待检测图片,如 data/dog.jpg 能够看到检测作用:

   

极智AI | 目标检测实现分享一:详解 YOLOv1 算法实现

  这样就完成了 YOLOv1 数据集预备、练习到验证的整个环节。

  以上详细共享了 YOLOv1 的原理和实践,期望我的共享能对你的学习有一点帮助。


【公众号传送】 《【模型练习】方针检测完成共享一:详解 YOLOv1 算法完成》