谁人不识YOLOv1?

1,585 阅读5分钟

如需讲解视频,请关注我的个人微信公众号:小纸屑

麻烦大家给我点个赞,就是那种让我看起来,写的还不错的样子!😁😁😁😁😁

YOLOv1是继Faster R-CNN后,第一个one stage物体检测算法,开创了物体检测算法一个全新流派,自YOLOv1后,物体检测基本分为one stage和two stage两个流派。

下图是YOLO在整个物体检测算法历史上的坐标。

背景

可以看出,YOLOv1是在Faster R-CNN之后提出的,但查看首次上传arXiv的时间可知(见下图),YOLOv1和Faster R-CNN基本是同时提出的,因此YOLO作者动笔之时,Fast R-CNN是SOTA(state of the art),Faster R-CNN尚未出世,因此YOLO作者的主要对比对象是Fast R-CNN。当然,作者后续还是补充了与Faster R-CNN的对比结果做参考。

下面简单分析下Fast R-CNN的原理。

Fast R-CNN主要由四部分组成(如下图),首先是共用的Feature Extractor,然后是传统的Region Proposal算法,有了共用的Extracted Feature Map和ROI(Region Of Interest)后,将Extracted Feature Map上对应ROI部分截取出来,经过ROI Pooling,转成分辨率固定的Feature Map,输入到物体检测部分,以回归物体类别和bounding box,完成整个物体检测流程。

由于Fast R-CNN分为Extract Feature和Region Proposal两个过程,因此是two stage的,这导致了Fast R-CNN的常常准确度高,但速度做不到实时性。

YOLO的提出就是解决Fast R-CNN的缺点,将two stage合成为一个stage,从而达到实时性。

Idea

具体YOLO是如何将two stage合成为一个stage的呢?

1)首先,将输入图片划分为7x7的网格

2)然后,每一个网格cell输出两个bounding box的预测和一个共享的类别预测。如下图。 每一个bounding box的预测包含五个值C,x,y,w,h,其中C表示预测框的置信度,x,y,w,h表示预测框的位置和尺寸,p_ci表示预测框属于类别ci的概率。

可以看出,一个cell预测两个框,但输出的时候只能输出一个预测结果,一般取置信度C值大的那个预测框作为这个cell的预测结果,框的类别取p_ci最大的类别。 3)既然一个cell有两个预测框,那每个预测框的Ground Truth怎么计算呢? 首先,一个Ground Truth框分配给其center所在的cell,如下图,自行车的绿色Ground Truth框分配给粉色的cell,

其次,在一个cell内部,Ground Truth会分配给与其IOU最大的predictor,如下图,粉色cell中的两个预测框是红色框,绿色GT框会分配给宽矮的红色预测框。

有了输出,有了GT,再设计设计网络结构,即输入到输出的映射,就可以利用梯度下降进行训练了。

Network

下图是简化版的网络结构,

下图是详细的网络结构,

可以看出,图片先经由一个作者设计的24层的Feature Extractor,提取特征,然后再经过两个全连接层,就得到最后7x7x30的输出。

需要注意的是,这个7x7的输出的意义就是作者说的将网格划分为7x7的网格。

Loss

Loss主要分为三个部分,位置损失、置信度损失和类别损失。

上式中,SxS是输出结果的分辨率,也是cell的个数,B是一个cell中的预测框的个数,两个sigma意思是遍历所有cell的所有box求和,lambda是损失权重,1函数是指示函数,条件为真时取1,为假时取0。

1)位置损失

这里首要的是弄清楚给定一个predictor,其预测的x,y,w,h的含义,红色框住的是对应的标签。 x,y的含义是预测框的中心点相对cell左上角的相对坐标,其值在0~1之间。 w,h的含义是预测框的宽度与图片宽度的比值,预测框的高度与图片高度的比值,其值也在0~1之间。 也即predictor预测的x,y,w,h都是归一化后的的相对值,以下图为例,红色框是绿色GT框的预测框,则 预测的x=X/64,y=Y/64,w=W/448,h=H/448。 预测框x,y,w,h对应的标签也是相同的计算方法。

2)置信度损失

Ci预测的是Pr(object)*IOU,综合反映了预测框有object的概率和预测框与truth的IOU大小。 所以对于一个cell的C_i的标签的计算方法是:

3)类别损失

预测的p_ci是条件概率,即Object已知的情况下,Class_i的概率,如果GT的类别是ci,则p_ci的标签是1,其他p_ci的标签为0。

Training

YOLO模型训练采用了以下技巧: 1)数据增强 包括随机缩放,随机截取,随机调整曝光度和饱和度 2)dropout 估计是全连接层,使用了dropout,dropout rate取0.5 3)优化器 采用momentum优化器,超参数beta取0.9 4)weight decay 采用了权重衰减,系数为0.0005 5)batch size为64 6)learning rate

总共训练136个epoch,第一个epoch,学习率稳定从0.001升至0.01,接着保持0.01的学习率学习75个epoch,然后将学习率降至0.001训练30个epoch,再将学习率降至0.0001训练30个epoch。

Experiments

学习效果如上表,可以看到YOLO的速度成碾压态势,而准确率依然很高。

Error Analysis

作者还对YOLO进行了误差分析,对比了Fast R-CNN与YOLO的误差来源。 首先作者将识别结果分为五类:

  1. 正确分类:类别正确,IOU>0.5
  2. 位置错误:类别正确,0.1<IOU<0.5
  3. 近似错误:类别识别为近似类别,IOU>0.1
  4. 其他错误:类别错误,IOU>0.1
  5. 背景错误:IOU<0.1

Fast R-CNN与YOLO的误差组成如下图:

可以看出,Fast R-CNN以背景错误为主,YOLO以位置错误为主。

结论

YOLO开创性的提出了一步式算法,做到了实时检测和高准确率。