• 损失函数与正负样本分配:YOLO系列


    目标检测算法最难理解的,设计最复杂的就是正负样本分配损失函数这块了,这两者将很大程度决定网络的训练效果,因此开帖对yolo系列做一总结,重点也在这两者,吸收他人优秀博客内容,进行整理。

    在这里插入图片描述

    YOLO v1:

    2016 CVPR有两个明星,一个是resnet,另一个就是YOLO。
    在这里插入图片描述
    上图是网络输出,注意里面每个格子预测两个Box,即论文中的B设置为2,但只有一组class probabilities,即每个格子只能预测一个物体,两个Box是为了让每个Box。

    论文中损失:
    在这里插入图片描述
    同济子豪兄的注释:
    在这里插入图片描述

    • 正负样本分配:某个grid cell的预测结果与gt中所有目标计算IoU,IoU最高的那个物体视为这个grid cell应该去预测的目标,即yolo的每个grid cell只负责预测一个物体,由于只有7*7个grid cell,所以yolo对密集排布的目标预测效果差。
    • 损失平衡系数 λ c o o r d \lambda_{coord} λcoord是正样本BBox损失的权重系数,论文中设置为5。而负样本不计算BBox损失,只计算是否存在目标的obj损失,其系数 λ n o o b j \lambda_{noobj} λnoobj设置为0.5,正样本的该损失权重设置为1,正样本的obj损失中标签 C ^ i \hat{C}_i C^i不是1,是目前预测结果与分配到的正样本的IoU,负样本该项为0。
    • x,y,w,h:w,h都相对输入尺寸归一化到0,1之间了,x,y是相对该grid cell位置的偏移量,也在0~1范围内。
    • 对w,h开根号的原因:我们对BBox预测的评价指标是IoU,但IoU相同时,大框的w、h所求得的损失肯定是比小框要高的开根号可以认为是为了增加sum-squared error (L2 loss)的尺度不变性。
    • 对分类也是用L2损失:根据我调研的几个第三方的代码实现,这个 p i ( c ) p_i (c) pi(c)和前式中的 C i C_i Ci也没做过softmax(我没有看到)或sigmoid,网络最后一层是线性层,而 p ^ i ( c ) \hat{p}_i (c) p^i(c)的正样本和负样本标签分别为1和0,这样如果初始化不好,刚开始训练就有可能梯度爆炸吧,不知道我的理解对不。

    YOLO v2:

    相比v1,在backbone上有更新,加入了BN层,且检测头多了一个passthrough layer的短接,但最后的检测头还是只有一个,并且使用了anchor box机制,因为预测偏移量比直接预测更好学习,锚框的shape和大小是根据k-means聚类得到了5种锚框。论文标题的9000意思是可以使用文中的方法使yolov2实现9000种目标的检测。
    BN层:
    在这里插入图片描述
    每个grid cell(网格)可以最多预测5个物体,5代表五种不同的anchor:
    在这里插入图片描述
    预测时的计算方式:在这里插入图片描述
    其中的sigmoid函数使得每个cell的预测结果的中心位置都是落在该cell中。
    损失函数:
    在这里插入图片描述
    上图是网友根据yolov2的代码整理的损失函数,式子中 b i j k o b_{ijk}^{o} bijko是obj置信度, b i j k r b_{ijk}^{r} bijkr是预测的BBox位置信息,其中 r ∈ ( x , y , w , h ) , b i j k c r\in (x,y,w,h),b_{ijk}^{c} r(x,y,w,h)bijkc是预测的框所属类别。 p r i o r k r prior_{k}^{r} priorkr是anchor的位置,因为每个cell中的五个anchor都是一样的,所以下角标只需要知道anchor属于这五个anchor的哪一个信息。 t r u t h r truth^{r} truthr是标注框的位置信息。 t r u t h c truth^{c} truthc是标注框的类别信息。 I O U t r u t h k IOU_{truth}^{k} IOUtruthk是anchor与标注框的IOU。

    loss由三部分组成,其中标黄的部分非0即1。

    第一部分标黄部分,为负样本惩罚,表示预测框与标注框的IOU如果小于阈值0.6,那视作这个预测框是与负样本匹配了,取值1,反之为0,后面的部分表示标签0与置信度 b i j k o b_{ijk}^{o} bijko的L2损失。这个IoU的计算是只根据大小和形状来计算的,与位置无关,即先将某个grid cell所属的anchor和gt(ground truth)中心位置重合,再计算IoU。

    第二部分标黄部分,表示是在12800次迭代前,将anchor与预测框位置误差加入损失,可以使模型能够在前期学会预测anchor位置,使得输出的 t x , t y , t w , t h t^{x},t^{y},t^{w},t^{h} tx,ty,tw,th更稳定;(这一项自己的理解不是很清晰)

    第三部分标黄部分,表示预测框是否负责预测物体,该anchor与标注框的IoU最大对应的预测框负责预测物体(IOU>0.6但非最大的预测框忽略不计),其中第一项表示预测框与标注框的定位误差,第二项表示预测框的置信度与标注框和anchor的IoU的误差,表示预测框的所属分类结果与标注框的类别信息的误差,这个预测类别结果我看到的代码都是做了softmax的。

    图中还有五个 λ \lambda λ, 表示每一个损失的平衡系数。

    YOLO v3:

  • 相关阅读:
    Unity脚本判断场景内物体是否为Root Prefab的方法
    Typescript的基本使用
    编程学:关于同类词的等长拼写问题
    免费开源的地图解析工具【快速上手】
    java基础(2)
    20240628每日前端---------解决vue项目滥用watch
    前端入门学习笔记三十三
    贪吃蛇和俄罗斯方块
    8.0、软件测试——缺陷(定义和标准)
    C - Association for Control Over Minds(并查集维护额外信息)
  • 原文地址:https://blog.csdn.net/kill2013110/article/details/125545685