YOLOv1
主要思想:
把目标检测看成一个回归问题。靠一个卷积网络完成整个检测任务,实现端到端的目标检测。速度相当的快:YOLO:45FPS,Fast YOLO: 155FPS
特点:
定位错误比较严重,但是对于背景的预测鲁棒性比较强。比如在绘画中完成预测。
与其他方法的简单比较:
滑动窗口法: 一个框一个框的滑动并进行图像分类
R-CNN:
先生成预选框
在这些预选框上进行图像分类
然后再优化修正
YOLO:
一次卷积网络完成所有任务。
预测框的位置、大小和物体分类都是通过CNN直接预测出来的。
网络采用GoogleNet,卷积层用来提取特征,全连接层用来预测类别概率和坐标。
YOLO如何进行预测
YOLO将图像划分为SxS的网格。如果物体中心落在某个格子,则这个格子负责检测它。每个格子预测B个bounding boxes, confidence和C个类别的概率。每个bounding box包含5个预测值:x, y, w, h, confidence。(x,y)值为与格子相对的box的中心坐标。宽和高的值是相对于整个图像的。confidence为格子中是否有物体和有物体的概率是多大。
c o n f i d e n c e : P r ( O b j e c t ) ∗ I O U p r e d t r u t h confidence : Pr(Object)*IOU^{truth}_{pred} confidence:Pr(Object)∗IOUpredtruth,C个类别的概率表示为 P r ( C l a s s i ∣ O b j e c t ) Pr(Class_i|Object) Pr(Classi∣Object)。如果格子中没有物体则confidence为0。无论有多少个bounding boxes,我们只预测一组C个类别的概率。
测试的时候我们将confidence和C个类别的概率相乘,得到的是每个box的class-specific confidence score。这个分数结合了某个类别的物体出现在格子中的概率和预测框的准确度:
$Pr(Class_i|Object) * Pr(Object)*IOU^{truth}{pred} = Pr(Class_i)*IOU^{truth}{pred} $
最后的预测结果为一个 S × S × ( B ∗ 5 + C ) S\times S\times(B*5+C) S×S×(B∗5+C)张量。
YOLOv1使用PASCAL VOC数据集,所以设置 S = 7 , B = 2 , C = 20 S = 7, B = 2, C = 20 S=7,B=2,C=20。
所以卷积层输出为7x7x30。
7x7表示把输入图片划分为7x7的网格,30 =(2*5+20)表示能预测2个框的5个参数(x, y, w, h, confidence)和20个类别。
网络结构:
修改自GoogLeNet。额外添加了四个卷积层和两个全连接层。
训练:
首先在ImageNet 1000-class比赛数据集上进行预训练
最后一层预测类别的概率和bounding box的坐标。我们用图像的宽和高来正则化bounding box的宽和高,这样他们的值在0到1之间。我们用grid cell的位置来正则化。bounding box的x,y坐标,这样他们的值也在0到1之间。
使用平方和差来作为损失函数,因为这样比较容易优化。如果直接把它们加起来,不是很好。高度的差值和类别的差值具有相同的损失并不是很理想。我们增加bounding box坐标预测的损失,然后减少未包含物体格子的confidence值的损失。 我们使用两个参数
λ
c
o
o
r
d
,
λ
n
o
o
b
j
\lambda_{coord}, \lambda_{noobj}
λcoord,λnoobj来实现这一点。
对大框的偏差量的惩罚应小于对小框的偏差量的惩罚。对这里宽和高开根号处理,来实现这一点。因为看如下图像,相当于把小的值变的比较大。
对损失函数的说明:
完成目标检测及NMS
从上面我们知道,卷积完成后我们得到了7x7x30的输出。下面我们来看是如何从中得到我们想要的输出框的。
首先我们更形象化地看一下这个7x7x30的输出。下图右边的两个5代表了两个bounding box的5个值x, y, w, h, confidence。还有20个Pr(Class_i|Object)。
下面将confidence和C个类别的概率相乘,得到每个box的class-specific confidence score。
每个格子有两个bounding box,所以每个格子有两组class scores。一共有7x7个格子,最后得到一共7x7x2=98组class scores。
首先,把这些值小于thresh值(0.2)的设为0。因为它们得分太小了。在这之后,依然有大量的互相重叠的框。我们使用NMS来选择最合适的框。
下面是一种NMS的策略:
以98组class scores中其中一行,预测类别为狗为例。
- 选择一个最高得分的框。
- 计算这个框和其他所有得分不为0的框的IOU,将IOU大于iou_thresh的其他框的得分设为0。
- 返回第一步,选择另一个最高得分的框。直到遍历完所有得分不为0的框完成NMS。
最后,遍历所有的98组class scores。如果某一组中最大得分大于零则将这个框输出作为预测结果。
总结:
-
给个一个输入图像,首先将图像划分成7 * 7的网格。
-
对于每个网格,每个网格预测2个bouding box(每个box包含5个预测量)以及20个类别概率,总共输出7×7×(2*5+20)=1470个tensor
-
根据上一步可以预测出7 * 7 * 2 = 98个目标窗口,然后根据阈值去除可能性比较低的目标窗口,再由NMS去除冗余窗口即可。
YOLOv1使用了end-to-end的回归方法,没有region proposal步骤,直接回归便完成了位置和类别的判定。种种原因使得YOLOv1在目标定位上不那么精准,直接导致YOLO的检测精度并不是很高。
YOLO的缺点:
对一群小物体的检测比较困难,比如一群小鸟。
对新的或不寻常的宽高比的物体检测比较困难。
使用相当粗糙的特征来预测框,微小的错误对于大框来说是微小的,但是对于小框来说就会导致很大的影响。这样导致定位的错误。
v2/v3还保留的特性:
-
Leaky ReLU,相比普通的ReLU,leaky并不会让负数直接为0,而是乘以一个很小的恒定系数,保留负数输出,但衰减负数输出。
y = { x x > 0 0.1 x o t h e r w i s e y = \begin{cases}x&x>0\\ 0.1x&otherwise \end{cases} y={x0.1xx>0otherwise
-
分而治之,用网格来划分区域,每块区域独立检测目标
-
端到端训练。损失函数的反响传播可以贯穿整个网络。
YOLOv2学习笔记:https://blog.youkuaiyun.com/JSerenity/article/details/88672337
参考:
Paper: https://pjreddie.com/media/files/papers/yolo_1.pdf
Slide: https://goo.gl/eFcsTv
https://blog.youkuaiyun.com/leviopku/article/details/82588059
https://blog.youkuaiyun.com/Jesse_Mx/article/details/53925356