YOLOv1
paper title:You only look once: Unified, real-time object detection
paper link:https://arxiv.org/pdf/1506.02640.pdf
oral presentation:https://www.youtube.com/watch?v=NM6lrxy0bxs
darknet YOLO: https://pjreddie.com/darknet/yolo/
YOLOv1(以下YOLO均指YOLOv1)实现了端到端的目标检测任务,无需进行候选框提取,速度很快。不同于R-CNN,Fast R-CNN将物体检测任务转化为分类问题,YOLO将物体检测看作一个回归问题,通过将图片划分为一些格子,使用网络预测在这些格子上的目标的Bounding box和类别。
。
基本思路:
YOLO将图片为成S*S
个格子,在每一个格子上预测目标的Bounding box和类别,每个格子上输出一个长度为B*5+K
的输出结果,其中B是每个格子上预测的Bbox的数目,包括五个维度x,y,w,h,C
,四个坐标值和一个分数,K
是分类目标的数目,最后的网络输出是S*S*(B*5+K)
的tensor。
在预测的Bbox的五个维度中x,y
是中心点坐标,这个中心点坐标指相对于格子左上角的相对坐标,并用格子的宽度进行归一化,也就是一个归一化的偏移量,;w,h
是Bbox的宽和高,是指用图像的宽和高进行归一化后的值;知道了Bbox坐标的这两个信息之后,就可以在预测时根据输出结果恢复Bbox在图像中的像素坐标位置。
C
是confidence score,这个分数体现了模型有多确定这个Bbox包含目标并且就是它要预测的那个。 当格子中包含物体的时候,希望这个分数等于预测的Bbox和truth Bbox 的IoU;当格子没有物体的时候,希望这个分数为0。
K
是分类的数目。K个值实际上对应目标物体属于每个类别的分数,YOLO文章中不管B为多少,即预测几个Bbox, 目标类别的分数只有一套。
网络结构:
YOLO的网络结构(参考了inceptionv1的网络结构,但是沒有使用inception模块,只是使用{3x3+1x1}的这样的结构):
最后网络输出的是一个7x7x30(dataset:Pascal VOC)的tensor, 7x7是一开始划分的格子的数目,30=(2*5+20),2个box,每个box有五个值x,y,w,h,C
,以及20个class。
网络训练: 在ImageNet 1000类的分类任务上对模型的前20个卷积层进行了预训练,预训练的时候卷积层后面接的是平均池化层和全连接层。网路使用Leaky ReLu(0.1x)作为激活函数;使用darknet框架进行训练;learning-rate的设置:第一个epoch从 1 0 − 3 10^{-3} 10−3缓慢升到 1 0 − 2 10^{-2} 10−2,然后使用 1 0 − 2 10^{-2} 10−2训练75个epoch,然后用 1 0 − 3 10^{-3} 10−3训练30个epoch, 1 0 − 4 10^{-4} 10−4训练30个epoch。Batch size 设置为64;使用momentum优化函数,参数设置为0.9;weight decay权重为0.005;
损失函数: 坐标损失[x,y,w,h
] + 目标信心(confidence)损失[C
] + 类别损失[p
]
L o s s ( x , y , w , h , C , p ) = λ c o o r d ∑ i = 0 s 2 ∑ j = 0 B 1 i j o b j [ ( x i j − x ^ i j ) 2 − ( y i j − y ^ i j ) 2 ] + λ c o o r d ∑ i = 0 s 2 ∑ j = 0 B 1 i j o b j [ ( w i j − w ^ i j ) 2 − ( h i j − h ^ i j ) 2 ] + ∑ i = 0 s 2 ∑ j = 0 B 1 i j o b j ( C i j − C ^ i j ) 2 + λ n o o b j ∑ i = 0 s 2 ∑ j = 0 B 1 i j n o o b j ( C i j − C ^ i j ) 2 + ∑ i = 0 s 2 1 i o b j ∑ c ∈ c l a s s ( p i ( c ) − p ^ i ( c )