YOLOV1

因一些需要,对经典的检测模型YOLOV1进行了学习,以下是自己对YOLOV1的一些见解,如有错误,还请大佬指正。

对于目标检测任务,江湖上主要有两大流派:1.two stage策略(即proposal+classifier的方法),经典模型有rcnn、fast-rcnn、faster-rcnn、mask-rcnn;2、用one stage策略(即输入整幅图像,直接在输出层回归 bounding box(边界框) 的位置及其所属的类别),经典模型有YOLOv1、YOLOv2、YOLOv3、CornerNet、CenterNet。

论文地址:https://arxiv.org/abs/1506.02640

1.YOLOv1核心思想

 

YOLOv1巧妙的将传统CNN所擅长的分类任务应用到目标检测任务,利用整张图作为网络的输入,直接在输出层回归 bounding box(边界框) 的位置及其所属的类别。

YOLOv1相比于RCNN系列模型少了proposal这一步骤,因此YOLOv1的检测速度更快。其次,由于YOLOv1使用整幅图像作为输入,因此YOLOv1相对于RCNN系列模型(RCNN模型对生成的proposal部分图像进行预测)可以更加充分的利用目标物体的背景信息。

2.YOLOv1的实现方法

由于网络中使用了全连接层,所以图片的尺寸需reshape固定大小输入到CNN中(原文中reshape后的尺寸为448*448),然后将其将划分成SxS的网格(原文中S=7),如果某个 object 的中心落在这个网格中,则这个网格就负责预测这个 object。 

目标检测学习之路——YOLOv1

每个网格要预测B个bounding box(原文中B=2),每个bounding box的回归预测结果有5个值( x,y,w,h,confidence),这里的( x,y,w,h,confidence)是都被归一化到[0,1]区间。此外,每个网格还要预测C个类别的分数(原文中C=20,因为pascal voc数据集只要20类物体),注意这里是为每个网格预测C个类别,而不是为每个预测的bounding box都要进行C个类别分数预测。

x,y:一般是相对于单元格左上角坐标点的位置偏移,利用预测出的偏移量可以计算出object的中心坐标。以原文为例,输入数据为448*448,被划分为7*7的网格单元,每个网格单元的尺寸为64*64。其中某一网格单元的左上角坐标为目标检测学习之路——YOLOv1,模型预测的坐标偏移量为(x,y),则模型预测object的中心坐标为:目标检测学习之路——YOLOv1,目标检测学习之路——YOLOv1

w,h:检测框真实宽高相对于整幅图像的比例(注意这里不是实际的bounding box的宽和高)。以原文为例,输入数据为448*448。模型预测的object宽和高为(w,h),则模型预测的object宽和高为:目标检测学习之路——YOLOv1目标检测学习之路——YOLOv1

confidence:代表了预测框中含有目标的置信度和这个预测框预测的准确度的双重信息,公式和说明如下:

目标检测学习之路——YOLOv1

置信度confidence值只有2种情况,要么为0(网格中不包含目标,目标检测学习之路——YOLOv1),要么为预测框与标注框的IOU。因为目标检测学习之路——YOLOv1的取值只有0或1,两种可能,当网格中含有object时,那么P(object)=1,否则为0,不存在(0,1)区间中的值。第二项是预测的 bounding box 和实际的 groundtruth 之间的 IoU 值。

测试阶段,每个网格预测的 class 信息和 bounding box 预测的 confidence信息相乘,就得到这个bounding box是这类object的概率,公式如下所示。目标检测学习之路——YOLOv1就是每个网格预测的类别i的分数,第二、三项就是每个 bounding box 预测的 confidence。这个乘积即表示了预测的 bounding box 属于某一类的概率,也有该 bounding box准确度的信息。

目标检测学习之路——YOLOv1

3.YOLOv1网络结构

目标检测学习之路——YOLOv1

最后一层全连接层用线性**函数,即没采用任何**函数,输入是什么输出就是什么,darknet的linear activation function定义如下所示:

目标检测学习之路——YOLOv1

其余层采用leak RELU**函数,**函数公式如下所示:

目标检测学习之路——YOLOv1

 

4.YOLOv1的损失函数

这里的损失函数,是针对某一object计算的loss函数,现实计算时需要对每个object进行loss计算,最后再求和。

目标检测学习之路——YOLOv1

目标检测学习之路——YOLOv1:取值为0或1,即第i个网格预测的第j个bounding box是否负责预测这个object(第一个条件为object的中心是否落在这个网格中;第二个条件为当前boundingbox与object的真实bounding box IOU 值,是该网格预测的B个bounding box中与真实bounding box的IOU值为最大的。当满足上述两个条件,则为1,否则为0)。

目标检测学习之路——YOLOv1:取值为0或1,即第i个网格中是否含有这个object(当网格中含有这个object则为1,否则为0)。

一个object有与之唯一对应的网格(即object的中心落在这个网格,该网格对这个object唯一负责),但是会有很多网格中出现过这个object,而且也会出现一个网格中出现过多个object的现象,但是对这个object负责的网格确是惟一的。

YOLOv1对坐标误差,confidence误差,分类误差均使用了均方差作为损失函数,三个误差在损失函数中所占的权重也不同。

坐标误差:一个网格预测2个bounding box,在计算损失函数的时候,只取与ground truth bounding box中IoU大的那个预测框来计算损失,权重系数最大(为5)。

当两个object的中心落在同一个网格时,该网格需要对两个object的坐标进行loss值进行计算。但是相同的位置误差对大目标和小目标的影响是不同的,相同的偏差对于小目标来说影响要比大目标大,故作者选择将预测的bounding box的w,h先取其平方根,再求均方差损失。

存在目标的网格预测的bounding box的confidence损失和分类损失,权重系数均为1。

由于一副图像中没有目标的网格占大多数,有目标的网格占少数,所以损失函数中对没有目标的网格中预测的bounding box的confidence误差给予小的权重系数(为0.5)。

5.YOLOv1的缺陷

每个单元格最多只能预测一个object,若单个单元格中含有多个object中心,但是只能检测出其中的一个,导致小目标漏检,因此YOLOv1对小目标检测效果不好。

同一类物体出现的新的不常见的长宽比和其他情况时,泛化能力偏弱。

虽然YOLOv1中损失函数中位置误差,对预测的w,h取平方根处理再求均方差,来缓解相同位置误差对大目标,小目标影响不同的弊端,但是作用甚微,没有根本解决问题对于小物体。小的目标的 置信度误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。

由于网咯结构中使用了全连接层,因此在检测时,YOLOv1 模型只支持与训练图像具有相同分辨率的图片。

 

相关文章: