YOLO系列-概述及YOLOv1

一、概述

目标检测的目的是将图片或者视频中感兴趣的目标提取出来。例如对于猫和狗的检测,我们不仅要用算法判断图片中是不是有猫和狗, 还要在图片中标记出它的位置, 用边框或红色方框把猫和狗圈起来。其中“定位”的意思是判断猫和狗在图片中的具体位置。

 

                                                                   图1.目标检测与其他计算机视觉任务示例

近几年来,目标检测算法取得了很大的突破。比较流行的算法可以分为两类,一类是基于Region Proposal的R-CNN系算法(R-CNN,Fast R-CNN, Faster R-CNN等),它们是two-stage算法,需要先算法产生目标候选框,也就是目标位置,然后再对候选框做分类与回归。而另一类是YOLO,SSD这类one-stage算法,其仅仅使用一个卷积神经网络CNN直接预测不同目标的类别与位置。第一类方法是准确度高一些,但是速度慢,但是第二类算法是速度快,但是准确性要低一些。如图2所示。

 

                                                      图2.几种常见目标检测算法速度与准确度比较(截止2016年)

 

 

二、YOLOv1

1.YOLO

YOLO:You Only Look Once,即你只需要看一次,就能够检测出目标。是目前最为先进的目标检测算法之一。

 

2.YOLOv1的核心思想

·YOLO 的核心思想就是利用整张图作为网络的输入,直接在输出层回归 bounding box(边界框)的位置及其所属的类别。

·Faster-RCNN中也直接用整张图作为输入,但是Faster-RCNN整体还是采用了RCNN 那种proposal+classifier的思想,也就是上面所说的two-stage。只不过提取proposal的步骤放在CNN中实现了,而YOLO则采用直接回归的思路。

 

3.YOLOv1实现步骤

                                                                                 图3.YOLOV1的实现步骤

 

(1)将图像resize到448*448作为神经网络的输入;

(2)运行神经网络,得到bounding box坐标、box中包含物体的置信度和class probabilities;

(3)进行非极大值抑制,得到最终结果。

 

4.YOLOv1具体流程

                                                                            图4-1.YOLOV1具体流程概图

                                                                            图4-2.YOLOV1具体流程详细图

 

将一幅图像分成 S*S 个网格(grid cell),如果某个 object 的中心落在这个网格中,则这个网格就负责预测这个 object。在论文当中将图片分成7*7,共49个区域。

每个网格要预测B个bounding box,每个bounding box除了要回归自身的位置之外,还要附带预测一个confidence值。 
这个confidence代表了所预测的box中含有object的置信度和这个box预测的精准度两重信息,其值是这样计算的:

其中如果有object落在一个grid cell里,第一项取1,否则取0。 第二项是预测的bounding box和实际的ground truth之间的IoU值。

同时每个bounding box要预测(x, y, w, h)和confidence共5个值,每个网格还要预测一个类别信息,记为C类。则S*S个网格,每个网格要预测B个bounding box还要预测C个categories(类别)。输出就是S *S * (5*B+C)的一个tensor。 

举个例子在PASCAL VOC(训练集)中,图像输入为448*448,取S=7,B=2,一共有20个类别(C=20)。则输出就是7*7*30的一个tensor。 

                                                                                          图5.YOLOV1示例

5.YOLOv1网络结构

YOLOv1的网络结构借鉴了 GoogLeNet 。24个卷积层,2个全链接层。用1×1 reduction layers 紧跟 3×3 convolutional layers 取代Goolenet的 inception modules 。

但在这里有一个小问题,就是在2015年的论文和2016年的论文中网络结构和注释有所不同,个人感觉2016年的标注在第一层网络处有细微问题,如图6-1和6-2所示。在本文中以2016年的论文为准。

                                                                          图6-1.YOLOV1网络结构(2015)

 

                                                                          图6-2.YOLOV1网络结构(2016)

6.损失函数

在实现中,最主要的就是怎么设计损失函数,让这个三个方面得到很好的平衡。作者简单粗暴的全部采用了sum-squared error loss来做这件事。 

这种做法存在以下几个问题: 

第一,8维的localization error和20维的classification error同等重要显然是不合理的; 

第二,如果一个网格中没有object(一幅图中这种网格很多),那么就会将这些网格中的box的confidence push到0,相比于较少的有object的网格,这种做法是over powering的,这会导致网络不稳定甚至发散。

针对上面的问题,作者提出了如下解决办法:

第一,更重视8维的坐标预测,给这些损失前面赋予更大的loss weight,记为λcoord,在Pascal VOC训练中取5; 

第二,对没有object的box的confidence loss,赋予小的loss weight,记为λnoobj,在Pascal VOC训练中取0.5;

第三,有object的box的loss和类别的loss的loss weight正常取1。

最终作者设计的损失函数如下:

每个grid有30维,这30维中,8维是回归box的坐标,2维是box的confidence,还有20维是类别。 其中坐标的x, y用对应网格的offset归一化到0-1之间,w, h用图像的width和height归一化到0-1之间。具体实例如图7所示。

                                                                                图7.YOLOV1损失函数分析

7.训练

预训练分类网络:在ImageNet 1000-class competition dataset上预训练一个分类网络,这个网络是YOLOv1的前20个卷积网络+average-pooling layer+ fully connected layer (此时网络输入是224*224)。

                                                                                图8.两个bounding box示意

      每一个网格不仅仅要预测2个bounding box(如图8所示)的坐标(x, y ,w ,h)以及confidence(置信度)。还要预测类别信息,在论文中有20个categories,计算出20个类别的概率,概率最大的即为对应的类别。

                                                                        图9.YOLOV1训练过程中20个分类示意

 

8.缺点

·YOLO对相互靠的很近的物体,还有很小的群体 检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类。

·对测试图像中,同一类物体出现的新的不常见的长宽比和其他情况是。泛化能力偏弱。

·由于损失函数的问题,定位误差是影响检测效果的主要原因。尤其是大小物体的处理上,还有待加强。

 

因为YOLO系列比较长,所以最后还是决定分成两个部分写,相关文献资料和参考链接会在下一篇放出!如果有问题,欢迎大家指正!

YOLOv2及YOLOv3:https://blog.csdn.net/lipengfei0427/article/details/103726333

猜你喜欢

转载自blog.csdn.net/lipengfei0427/article/details/103589165