阅读YOLOv3论文的一些记录、问题、解答

YOLOv3论文链接: https://arxiv.org/abs/1804.02767

问题:

  1. 网络实际学习的是 t x 、 t y 、 t w 、 t h t_{x}、t_{y}、t_{w}、t_{h} txtytwth这4个offsets, t x 、 t y t_{x}、t_{y} txty是预测的坐标偏移值, t w 、 t h t_{w}、t_{h} twth是预测的尺度缩放,为什么不让网络直接学习 b x 、 b y 、 b w 、 b h b_{x}、b{y}、b_{w}、b_{h} bxbybwbh

  2. YOLOv3一共产生了3中特征图,分别是13*13、26*26、52*52,那么最终的网格分割都是13*13吗,还是分别划分为13*13、26*26、52*52 个网格?解答:通过查看别人的博文,确定了是分别划分为了13*13、26*26、52*52个grid.

  3. 关于YOLOv3边框预测分析中的几个问题:

    1. 为什么YOLOv3中每个grid cell在feature map中的宽和高均为1?自己结合博文的理解:原图像经过一系列卷积之后产生一个feature map,比如416*416的图像经过DarkNet-53之后生成13*13的feature map,而在feature map的基础上,又将其划分为了13*13个grid,所以每一个grid的宽和高均为1(不知道是否正确).

    2. 在Faster R-CNN中, t x 、 t y t_{x}、t_{y} txty的预测公式分别为 t x = ( G x − P x ) / P w t_{x} = (G_{x} - P_{x}) / P_{w} tx=(GxPx)/Pw t y = ( G y − P y ) / P h t_{y} = (G_{y}-P_{y})/P_{h} ty=(GyPy)/Ph,而在YOLOv3中, t x 、 t y t_{x}、t_{y} txty的预测公式变为了 t x = G x − C x 、 t y = G y − C y t_{x} = G_{x}-C_{x}、t_{y} = G_{y} - C_{y} tx=GxCxty=GyCy,不同于Faster R-CNN,YOLOv3不需要除以 P w 、 P h P_{w}、P_{h} PwPh了,为什么?自己结合博文的理解: C x 、 C y C_{x}、C_{y} CxCy是方格grid左上角的坐标值,而在YOLOv3论文中规定:如果ground truth的坐标落在了某一个grid中,这个grid就负责来预测这个object,所以在这里自己认为 G x 、 G y G_{x}、G_{y} GxGy C x 、 C y C_{x}、C_{y} CxCy的距离一定小于1,不需要除以 P w 、 P h P_{w}、P_{h} PwPh来消除不同anchor box尺度的影响 但是 t x 、 t y t_{x}、t_{y} txty仍有可能出现大幅度的变动,所以在YOLOv3的论文中,使用了Sigmoid函数对其进行了约束。

    3. Faster R-CNN和YOLOv3中的 t w 、 t h t_{w}、t_{h} twth都是通过对数所求出来的,博文中对此的解释是:将尺度缩放到对数空间,是怕训练会带来不稳定的梯度,为什么不加对数会带来不稳定的梯度?

    4. 在YOLOv3中, b w 、 b h b_{w}、b_{h} bwbh的公式分别是 b w = p w e t w 、 b h = p h e t h b_{w} = p_{w}e^{t_{w}}、b_{h} = p_{h}e^{t_{h}} bw=pwetwbh=pheth t w 、 t h t_{w}、t_{h} twth分别是由公式 t w = l o g ( G w / P w ) 、 t h = l o g ( G h / P h ) t_{w} = log(G_{w}/P_{w})、t_{h} = log(G_{h}/P_{h}) tw=log(Gw/Pw)th=log(Gh/Ph)求出来的,那么经过指数e之后, b w 、 b h b_{w}、b_{h} bwbh就分别变为了 G w 、 G h G_{w}、G_{h} GwGh,那这样做就不对了,为什么公式是这样的?经过阅读博客之后做出的解释:首先, t w 、 t h 、 t x 、 t y t_{w}、t_{h}、t_{x}、t_{y} twthtxty都是由网络直接预测出来的, t w 、 t h t_{w}、t_{h} twth并不是由公式 t w = l o g ( G w / P w ) 、 t h = l o g ( G h / P h ) t_{w}=log(G_{w}/P_{w})、t_{h}=log(G_{h}/P_{h}) tw=log(Gw/Pw)th=log(Gh/Ph)计算出来的, l o g ( G w / P w ) 、 l o g ( G h / P h ) log(G_{w}/P_{w})、log(G_{h}/P_{h}) log(Gw/Pw)log(Gh/Ph)是原本就存在的固定的常量,在论文中我们表示为 t ^ w 、 t ^ h \widehat{t}_{w}、\widehat{t}_{h} t wt h,也就是说这个在训练的过程中对应于每一个ground truth是不变的,同样的, G x − C x 、 G y − C y G_{x}-C_{x}、G_{y}-C_{y} GxCxGyCy在论文中表示为 σ ( t ^ x ) 、 σ ( t ^ y ) \sigma(\widehat{t}_{x})、\sigma(\widehat{t}_{y}) σ(t x)σ(t y),这个也是原本就存在的固定的常量。可以结合损失函数来理解上述的内容,损失函数如下(损失函数不是绝对正确的,这里自己认为不是绝对正确的原因:原论文中明确说了在分类预测中使用的是交叉熵损失,但是下面的损失函数未使用。这是一篇博主所写的):

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fBTWXmFt-1605014783098)(C:\Users\云之遥\AppData\Roaming\Typora\typora-user-images\image-20201110193106738.png)]

  4. YOLOv3使用logistic回归来预测每一个bbox为物体的置信度,为什么要用logistic回归来预测?

笔记:

  1. 论文中的 A P 50 AP_{50} AP50解释: A P 50 AP_{50} AP50对应的是IOU以0.5作为阈值所计算的全类别平均的精确率,也就是说当预测框与真实框的IOU值大于0.5时,即可当做正样本,同理 A P 60 、 A P 70 AP_{60}、AP_{70} AP60AP70分别对应IOU大于0.6作为正样本和IOU大于0.7作为证样本的AP值。
  2. 论文中mAP的计算方式: m A P = ( A P 50 + A P 55 + . . . + A P 90 + A P 95 ) / 10 mAP = (AP_{50}+AP_{55}+...+AP_{90}+AP_{95})/10 mAP=(AP50+AP55+...+AP90+AP95)/10,经过1和2的说明,我们可以推断出,随着 A P n AP_{n} APn中的n的增大, A P n AP_{n} APn的值是越来越小的。
  3. 论文中YOLOv3的mAP为28.2,相比于RetinaNet-50、RetinaNet-101差了很多,而YOLOv3的 A P 50 AP_{50} AP50却和RetinaNet-50、RetinaNet-101性能相当,所反映出的问题是:YOLOv3所生成的检测框难以与真实框完美重合(重合度相比于RetinaNet低了许多),YOLOv3的检测框与真实框会大部分重合,但是离着完美重合还差一些距离。
  4. anchor box的解释(原博客解释:当我们只对图片中一个对象(且图片中只有一个对象)进行box回归时,我们只需要一个box回归器,但是当我们对图片中多个对象进行回归时(甚至一个类别会有多个对象),这时使用多个box回归器预测多个对象位置时就会发生冲突,因为每个预测器都可能不受约束地预测图片中任何一个对象的位置和类别。这时,我们就可以使用anchor来对每个回归器进行约束,只让每个回归器负责一块独立区域内的对象box回归。以YOLO算法举例,每个grid cell的位置其实也可以看做是anchor的位置(这不同于SSD或者Faster RCNN的anchor),如果最终的输出为13x13,也即有13x13个grid cell,每个grid cell有三个anchor的话,整个模型就有13x13x3个回归器,每个回归器只负责相应grid cell附近的对象预测。
  5. YOLOv2中每个grid cell只负责预测一个对象(在YOLOv2中,每个grid中有3个anchor box,如果有一个anchor box预测到对象,其他的anchor box就不能再预测对象(博文中看到的,自己论文中还没有认真核实)),但是YOLOv3中取消了YOLOv2之前每个grid cell只负责预测一个对象的限制,也就是说grid cell中的三个bounding box都可以预测对象,他们对应不同的ground truth。
  6. YOLOv3在为某一个ground truth选择bbox的时候,首先按照bbox与ground truth的重叠区域进行排序,选择重叠区域最高的bbox并将其置信度置为1,其他重叠区域大于设定的阈值(一般设定为0.5)将其忽略(也就是说不参与计算任何损失),其他重叠区域低于设定的阈值的作为负样本,只计算置信度损失,置信度标签为0。论文中为什么会这样做?一篇博文中所做的解释:
    1. 忽略样例是Yolov3中的点睛之笔。由于Yolov3使用了多尺度特征图,不同尺度的特征图之间会有重合检测部分。比如有一个真实物体,在训练时被分配到的检测框是特征图1的第三个box,IOU达0.98,此时恰好特征图2的第一个box与该ground truth的IOU达0.95,也检测到了该ground truth,如果此时给其置信度强行打0的标签,网络学习效果会不理想。
    2. 笔者实验结果:如果给全部的忽略样例置信度标签打0,那么最终的loss函数会变成 L o s s o b j Loss_{obj} Lossobj L o s s n o o b j Loss_{noobj} Lossnoobj的拉扯,不管两个loss数值的权重怎么调整,或者网络预测趋向于大多数预测为负例,或者趋向于大多数预测为正例。而加入了忽略样例之后,网络才可以学习区分正负例。

探究:

  1. YOLOv3中未使用softmax作为最终的分类依据,而是使用Sigmoid函数用于进行分类,这里的原因(猜测)是:由于在目标检测中,一个box中可能存在多个物体(包含一些小物体) 一个对象可以被预测为多个类别(比如说猫即可以被预测为猫,也可以被预测为动物),softmax预测的种类是两两互斥(使用softmax假设各个类别是互斥的),而box中因为可能含有多个物体,所以用softmax显然不合适(用在火焰目标检测中呢?),所以这里用Sigmoid(在原论文中也提到了不使用softmax的原因:Each box predicts the classes the bounding box may con-tain using multilabel classification(多标签分类) )。
  2. YOLOv3相比于YOLOv1而言产生的问题:以往的YOLOv1是难以检测小的物体,对大的物体的检测效果相对好一点,而YOLOv3因为多尺度训练的原因,对中等和大的物体检测效果相对差一点,对小的物体检测相对好一点。

参考:

  1. 关于YOLOv3的一些细节
  2. 超详细的YOLOv3边框预测分析
  3. Why does Faster R-CNN use anchor boxes?
  4. [论文解读]YOLO三部曲解读——YOLOv3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值