yolo1解析

YOLO(You Only Look Once) 是可谓是第一个相对成功One-Stage物体检测,在2016年被提出,本着速度的优势一跃成为与RCNN系列并驾齐驱的物体检测框架。

YOLO V1指标:

YOLO V1 mAP和FPS对比

YOLO V1的速度和准确率在2016年时还是很“稳”的,所以很多重速度的系统,会优先考虑YOLO。我们也可以发现,YOLO V1不仅速度快,准确率也没比Faster RCNN低太多。

Faster RCNN与YOLO V1简单对比

这张截取自YOLO的论文,我们简单解释这张图,其中Correct指的是完完全全正确的;Loc指的是类别对了,但是IOU<0.5;Sim指的是类别相似,且IOU>0.1; Other指的是错了,且IOU>0.1; Background指的是背景类;

对比图中显示:在检测出的框中,Fast RCNN有更多的背景,所以YOLO V1的另一大优势是Fase Positive低(当然YOLO V1的Loc错的多,也暴露了它定位不准的缺陷);

YOLO V1的泛化能力

文中特意强调了YOLO V1的泛化能力很强,在美术画中,也可以正常工作:

总结如下,YOLO V1的三个优点:

1. 速度快(体现在很高的FPS);

2.误检少(体现在,检出的物体实际是背景的比较少);

3.泛化能力强(体现在可以检测美术画);

YOLO V1的运行过程:

这里我们看看YOLO V1的核心思想,我们通过下图简单描述:

这是文中的一张图,很好的诠释了YOLO V1运行过程:

1.输入一张图,然后Resize到448 x 448大小;

2.然后输入到CNN中(文中叫darknet);

3.输出结果,经过后处理,包括NMS,得到结果(框和类别);

其中CNN整体的结构是由24个卷积层和2个全链接层组成,激活函数为“Leaky ReLU”,最后输出的向量维度是1470 = 7 x 7 x 30,说明最后输出了 7 x 7组结果,每组结果由30维向量组成。网络结构如下:

原文中的图,需要注意的细节是输入图片 448 x 448,输出是 7 x 7,Feature Stride为64(这个值还是蛮大的)

YOLO V1的核心思想:

YOLO V1最核心的思想就是把图片分成S x S个网格(grid cell),然后每个网格负责检测“一个”框和类别,最后通过概率和NMS过滤,得到最终的结果。

通过上面的描述,不仅会产生几个疑问:

1)S是多少?

直接回答S=7,因为网格的数目需要跟最后的特征图尺寸一一对应,最后的特征图大小为 7 x 7,所以网格的数目也就是 S x S = 7 x 7。

2)为什么要分成S x S个网格?

用以预测的特征图大小为 7 x 7,有49个向量(这里有点像RPN),每个向量都要去预测“框”和“类别”,那么训练的时候,我们需要为每个向量分配类别以及是否需要负责预测框,如何分配,我们需要把49个点映射回原图,正好形成7 x 7个网格,然后根据每个网格跟Ground Truth之间的关系,来做后续分配。也就是为什么分成S x S个框了。

3)如何选择Grid Cell预测框?

我们知道每个Grid Cell会对应一组向量,用来预测,那么选择哪个Grid Cell来预测框呢?通俗一些,就是哪些Grid Cell是正例,哪些是负例(这个过程有点儿类似RPN,但是有很大区别),我们看文中的一段描述:

这句话给了我们答案,物体的“中心”落在哪个Grid Cell中,哪个Grid Cell就负责训练这个Ground Truth。这句话想必大家都能看懂,但是实际呢?我们看看下面这张图:

这张图,中心点被标出来了,其中“橘黄Grid Cell”包括了Ground Truth中心点,那么它就是所谓的正例,那么“绿Grid Cell”和“白Grid Cell”的标签(Label)是什么呢?这里就是与RPN最大的不同之处了,这里有且只有一个Grid Cell是正例,其余的就算与Ground Truth IOU很大,也是负例,所以“绿Grid Cell”和“白Grid Cell”Label为负,所以也就不用负责训练框了。

4)选好了Grid Cell,下一步计算x,y, w, h(用来预测和训练),它们是怎么计算的?

我们看看原文怎么说:

根据原文我们可以确定几点,第一:x,y指的是中心点,是物体框的中心点,不是Grid Cell的中心点;第二,w,h指的是物体框的宽高;第三,x, y, w, h都在0-1之间。我们在训练的时候,Loss Function计算的预测值与实际值的L2-Loss,预测值是通过网络,隐藏在30维向量中了(7 x 7 x 30),实际值是怎么算的呢?

比如图片的宽高为width,height,物体的中心点为x,y,宽高为w,h,那么根据论文的描述:

w = \frac{w}{width}

h = \frac{h}{height}

x,y最后的值是相对Grid Cell的偏移,但是是相对于Grid Cell的中心点还是左上角点的偏移呢?其实这个顾虑是多余的,因为在最后的 7 x 7的特征图上,Grid Cell仅仅是一个”点“,相对于它的偏移,我们需要把x,y映射到7 x 7的特征图上,然后与对应的Grid Cell的位置相减,然而我们不难发现,这个过程可以简化为:

x = \frac{x * S}{width} - int(\frac{x * S}{width} )

y = \frac{y * S}{height} - int(\frac{y * S}{height} )

根据”选取Grid Cell“的方法,我们知道中心点x,y在7 x 7特征图上的位置的整数部分就是对应的Grid Cell位置,因为它们在原图上距离也不会超过S,而且我们可以知道x - int(x) 在[0, 1]。

5)实际的训练过程中,需要分S x S个网格么?

根据上一个问题的答案,我们不难发现,实际的训练和预测的过程中,我们是不需要对原图划分网格的,论文中划分网格的目的主要是为了方便表达。

6)最后输出的30维向量,代表什么?

论文中说了,我们一共预测98个框,那么我们可以算出30维向量中是包含了2个框的信息,也就是两组(x, y, w, h)。由于是在Pascal VOC上训练的,所以还有20个类别信息,这样组合发现只有28个值,。。。难道大家就没有疑问,YOLO V1是如何区分背景的么?YOLO V1不仅预测了框的x, y, w, h,还预测了框的分数,用来判断是不是框,所以30维向量向量包括2组( x, y, w, h, score) + 20个类别概率。

7)框的分数是怎么算的?

预测的时候,分数是直接输出的,那么训练的时候呢?是不是选中的Grid Cell分数为1,没选中的为0,答案是NO,这也是YOLO V1的巧妙之处,YOLO V1计算了一个所谓的IOU分数,IOU指的是预测的框与实际框的IOU,这样在训练的时候,我们需要实时的计算这个IOU,作为输入到Loss Function中的“目标”,与预测的IOU分数做L2-Loss,举个例子,第一次迭代,网络会输出一个预测框P1,对应的真实框为G,程序会计算P1和G的IOU,然后继续做Loss。

8)为什么每个输出有两个框,实际却只负责一个框?

其中YOLO V1有一个细节,我画图描述一下:

其中,绿色的框P1与白色的框P2是网络预测的框,而红色的框G是真实值,YOLO V1会计算P1与G的IOU1,以及P2与G的IOU2,然后比较哪个IOU大,比如IOU2更大,那么P2的信息会输入到Loss Function中,P1被忽略掉??并不是100%被忽略,如果IOU1小于一个阈值,会作为负例,压向0值。

总结:

这篇博客主要讲了YOLO V1中存在的一些令人费解的细节,这里并没有详细讲Loss Function,可以读读论文,那部分容易理解,需要注意的是:为什么设置不同的权重,为什么把w,h开根号等等细节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值