论文笔记:YOLOv3: An Incremental Improvement

Yolov3论文链接:https://pjreddie.com/media/files/papers/YOLOv3.pdf

中心思想

  • 在原有的YOLO基础上加上一系列的细节改进从而使性能得到提升

相关改进:

  1. bbox的编码(转换):和YOLOv2采用相同的label坐标encode的方式如下,其中 ( b x , b y , b w , b h ) (b_x, b_y, b_w, b_h) (bx,by,bw,bh)分别是bbox的中心点以及宽高。

    • b x = σ ( t x ) + c x b_x = \sigma(t_x) + c_x bx=σ(tx)+cx,这里的 c x c_x cx表示输出Feature Map的坐标(最终网络的回归量,是以这个坐标点为基础的一个偏移量), σ ( ⋅ ) \sigma(\cdot) σ()表示的是sigmoid函数,意味着 σ ( t x ) \sigma(t_x) σ(tx)的结果在 ( 0 , 1 ) (0,1) (0,1)之间, σ ( t x ) + c x \sigma(t_x) + c_x σ(tx)+cx的范围也就在 [ c x , c x + 1 ) [c_x, c_x+1) [cx,cx+1)之间。需要注意的是这里的 [ c x , c x + 1 ) [c_x, c_x+1) [cx,cx+1)是在特定的尺度下的(比如1/8尺度),那最终的BBox坐标其实是在 b x b_x bx基础上乘以8,得到最终的取值范围 [ c x ∗ s c a l e , ( c x + 1 ) ∗ s c a l e ) [c_x * scale, (c_x+1) * scale) [cxscale,(cx+1)scale)
    • b y = σ ( t y ) + c y b_y = \sigma(t_y) + c_y by=σ(ty)+cy,原理同上
    • b w = p w e t w b_w = p_w e^{t_w} bw=pwetw,这里的 p w p_w pw表示anchor的宽高,需要注意的是这里只有bbox的宽高计算的时候用到了anchor值
    • b h = p h e t h b_h = p_h e^{t_h} bh=pheth,原理同上
    • 图例:论文笔记:YOLOv3: An Incremental Improvement_第1张图片
  2. GT和Anchor的匹配:每个GT和Anchor进行匹配,IOU最高的anchor被分配成正样本,否则按照一个阈值ignore_threshold进行分配。如果GT和Anchor的IOU大于ignore_threshold,则将该anchor分配成ignore样本,否则会被分配成负样本。这样做的话一个GT只会被分配到一个anchor上

  3. 分类Label的编码(转换)

    1. 和一些检测方法采用one-hot或者vinilla的方式进行编码做多分类的方式不同,YOLOv3将多分类的问题转换为多个二分类,然后用Binary Cross-entropy计算分类Loss。这样能够处理一个样本有属于多个Label(multi-label)分类的问题
    2. 用一个额外的通道来编码一个GT BBox是否为正/负样本(目标,Objectness)
  4. 多尺度(Multi-scale)

    1. 在三个尺度下分别用3个scale做训练/预测,假如某个scale的尺度的输出分辨率为 ( N ∗ N ) (N * N) NN,那么对应的FeatureMap输出为 ( N ∗ N ∗ ( C + 1 + 4 ) ) (N * N * (C + 1 + 4)) (NN(C+1+4))
    2. N = 16, 32, 64
    3. 用了类似于UNet的结构来对底层和顶层信息进行融合,详见:https://zhuanlan.zhihu.com/p/76802514
    4. Anchor:直接在COCO下通过K-Means聚类得到9个anchor,然后按照面积排序,从小到大地分配到不同的尺度下,小尺度用大anchor
  5. 作者做的一些没有效果的尝试

    • Focal Loss,作者尝试了但是没有效果:
      1. 一方面作者认为这是因为用了Objectness class(也即是那多余的一个类别),因此Focal Loss没有增益。
      2. 但另一方面我觉得可能跟分配正负样本有关系,比如IOU大于0.7是正样本,小于0.3是负样本,其余ignore。单纯使用0.5这个阈值也会偏高,导致负样本中包含很多和正样本很相似的样本,从而将判定面复杂化,削弱了Focal Loss的作用(本身是用来平衡正负样本的权重的,但正负样本压根都没分好,因此平衡不起作用也可以理解),详见:https://www.zhihu.com/question/293369755
    • 双阈值(比如IOU大于0.7是正样本,小于0.3是负样本,其余ignore):这个问题应该跟Anchor的调整有关系,作者使用了这种聚类的anchor方式,意味着和原来的anchor相比,哪怕阈值相同,正负样本的分布/数目就不同了。因此感觉继续调整相关参数
    • 去掉上述bbox的编码中的sigmoid函数,通过anchor宽高进行归一化,会导致几个点的AP下降
    • 不加sigmoid,也不用宽高归一化,也没有提升

你可能感兴趣的:(论文笔记)