目标检测正负样本区分和平衡策略总结

目标检测正负样本区分策略和平衡策略总结(一) - 知乎0 简介本文抛弃网络具体结构,仅仅从正负样本区分和正负样本平衡策略进行分析,大体可以分为 正负样本定义、正负样本采样和平衡loss设计三个方面,主要是网络预测输出和loss核心设计即仅仅涉及网络的head部分。所…https://zhuanlan.zhihu.com/p/138824387目标检测正负样本区分策略和平衡策略总结(二) - 知乎0 简介本文抛弃网络具体结构,仅仅从正负样本区分和正负样本平衡策略进行分析,大体可以分为 正负样本定义、正负样本采样和平衡loss设计三个方面,主要是网络预测输出和loss核心设计即仅仅涉及网络的head部分。所…https://zhuanlan.zhihu.com/p/138828372目标检测正负样本区分策略和平衡策略总结(三) - 知乎0 简介本文抛弃网络具体结构,仅仅从正负样本区分和正负样本平衡策略进行分析,大体可以分为 正负样本定义、正负样本采样和平衡loss设计三个方面,主要是网络预测输出和loss核心设计即仅仅涉及网络的head部分。…https://zhuanlan.zhihu.com/p/144659734        

        在看完二阶段的faster rcnn,cascade rcnn和一阶段的retinanet,centernet,fcos,atss以及yolo系列1-x之后,再来总结一下正负样本分配和平衡策略,探究影响目标检测的核心问题。

1.faster rcnn and cascade rcnn

        faster rcnn和cascade rcnn的正负样本分配和采样完全一致,在mmdet中都是MaxIouAssigner和RandomSampler,在二阶段算法中,分为rpn和rcnn两部分,两部分主要是控制正负样本的阈值不同,

    train_cfg=dict(
        rpn=dict(
            assigner=dict(
                type='MaxIoUAssigner',
                pos_iou_thr=0.7,
                neg_iou_thr=0.3,
                min_pos_iou=0.3,
                match_low_quality=True,
                ignore_iof_thr=-1),
            sampler=dict(
                type='RandomSampler',
                num=256,
                pos_fraction=0.5,
                neg_pos_ub=-1,
                add_gt_as_proposals=False),
            allowed_border=-1,
            pos_weight=-1,
            debug=False),
        rpn_proposal=dict(
            nms_pre=2000,
            max_per_img=1000,
            nms=dict(type='nms', iou_threshold=0.7),
            min_bbox_size=0),
        rcnn=dict(
            assigner=dict(
                type='MaxIoUAssigner',
                pos_iou_thr=0.5,
                neg_iou_thr=0.5,
                min_pos_iou=0.5,
                match_low_quality=False,
                ignore_iof_thr=-1),
            sampler=dict(
                type='RandomSampler',
                num=512,
                pos_fraction=0.25,
                neg_pos_ub=-1,
                add_gt_as_proposals=True),
            pos_weight=-1,
            debug=False)),

MaxIoUAssigner:1.将每个anchor和所有gt的最大iou小于neg_iou_thr的设为负样本,2.将每个anchor和所有gt的最大iou大于等于pos_iou_thr的设为正样本,3.2的操作可能会导致部分gt没有anchor,iou低于pos_iou_thr,每个gt和所有anchor最大iou的那个anchor,如果其iou大于min_pos_iou,则设为正样本,4.剩下的所有样本为忽略样本。

这里面假设只有2个gt,1个anchor,anchor和第一个gt的iou为0.75,和第二个gt的iou为0.45,则在2中其为gt1正样本,但是在3分配其变成gt2正样本,可见3会有一些副作用,会引入一些低质量的正样本,需要match_low_quality=True.

在上述配置中可见在rcnn中,pos_iou_thr和neg_iou_thr都是0.5,说明没有忽略样本了。

RandomSampler:num = 256 表示采样后每张图片的样本总数,pos_fraction表示其中的正样本比例,具体是正样本采样 128 个,那么理论上负样本采样也是 128 个,neg_pos_ub表示负和正样本比例上限,用于确定负样本采样个数上界,例如打算采样 1000 个样本,正样本打算采样 500 个,但是可能正样本才 200 个,那么正样本实际上只能采样 200 个,如果设置neg_pos_ub=-1那么就会对负样本采样 800 个,用于凑足 1000 个,但是如果设置了neg_pos_ub比例,例如 1.5,那么负样本最多采样 200x1.5=300 个,最终返回的样本实际上不够 1000 个,默认情况neg_pos_ub=-1,add_gt_as_proposals=True是防止高质量正样本太少而加入的,可以保证前期收敛更快、更稳定,属于训练技巧,在 RPN 模块设置为 False,主要用于 R-CNN,因为前期 RPN 提供的正样本不够,可能会导致训练不稳定或者前期收敛慢的问题。

2 libra rcnn

libra rcnn中的CombinedSampler和balanced l1 loss.

CombinedSampler:随机对正负样本采样是不合理的,正样本没什么影响,因为正样本都是iou大于等于pos_iou_thr的,但是负样本因为多,随机采样后的iou都是偏小的,难负样本过小,由于负样本本身iou的不平衡,当采用随机采样后,会出现难负(iou 0.5附近)和易负(iou接近0)样本不平衡采样,导致后面性能不好。作者发现了如果是随机采样的话,随机采样到的样本超过70%都是在IoU在0到0.05之间的,都是易学习负样本,作者觉得是不科学的,而实际统计得到的事实是60%的hard negative都落在IoU大于0.05的地方,但是随机采样只提供了30%,实在是太少了,iou balanced sampling操作会尽量保证各个iou区间内都会采样到。 由于该操作比较简单,就不贴论文公式了。核心操作是对负样本按照iou划分k个区间,每个区间再进行随机采样,保证易学习负样本和难负样本比例尽量平衡。

balanced l1 loss:faster rcnn的rcnn head,使用的回归loss是smooth l1,作者认为这个依然存在不平衡。作者分析是:loss解决Classification和Localization的问题,属于多任务loss,那么就存在一个平衡权重,一般来说回归权重会大一些,但一味的提高regression的loss其实会让outlier的影响变大(类似于OHEM中的noise label),outlier外点样本这里作者认为是样本损失大于等于1.0,这些样本会产生巨大的梯度不利于训练过程,小于的叫做inliers。平衡回归loss的目的是既不希望放大外点对梯度的影响,又要突出内点中难负样本的梯度,从而实现对外点容忍,对内点区分难负样本的作用。为此作者在smooth l1的基础上进行重新设计,得到Balanced L1 Loss。核心操作就是想要得到一个当样本在 |x|<1附近产生稍微大点的梯度的函数。

 3.focal loss

    train_cfg=dict(
        assigner=dict(
            type='MaxIoUAssigner',
            pos_iou_thr=0.5,
            neg_iou_thr=0.4,
            min_pos_iou=0,
            ignore_iof_thr=-1),
        allowed_border=-1,
        pos_weight=-1,
        debug=False),

retinanet中min_pos_iou=0,表明每个gt都至少有一个anchor与之对应,retinanet不采用正负样本采样,分配上和fasterrcnn类似,主要通过focal loss来对不同样本进行处理。

4.yolov1-x

       yolov1-3中正负样本的分配几乎完全一致,它和MaxIoUAssigner还是不同的。v1中没有anchor的概念,每个网格单元预测两个边界框,边界框和gt的iou最大的负责预测该gt,其余的均作为负样本,v2-v3中引入了anchor,每个网格单元有3个anchor,但是只有和gt的iou最大的anchor才负责预测gt,计算loss,但是由于v2中的边界框其实比v1多,此时定了一个iou阈值,anchor和gt的iou小于iou阈值的才是负样本,如果在iou阈值和最大iou之间的样本均作为忽略样本,v3中也是这么操作的,这个就和rpn比较类似了,但是yolo系列的正样本还是很少的,v4中作者其实是有做尝试的设定一个正样本的iou阈值,用多个anchor去预测gt,但是复现的pytorch版本几乎都没这么做,依然是v3的最大iou匹配机制,v5在正负样本匹配上做了很大改动,首先,不再通过iou去选正样本,而是通过宽高比,自然也没有忽略样本了,正样本的选择也不再是一个网格单元,而是临近的三个网格单元,不再采用分层预测,而是多层预测,v5还是极大的增加了正样本,不过也会引入一些低质量的正样本,yolox的话,在正负样本分配上更接近atss和fcos那一套了,yolox把fcos的正负样本用在yolo上做anchor-free是涨点的,yolox通过simota来给不同的gt分配正样本,首先通过中心采样的原则,预测框落在gt框内的和以gt为中心,边长为5的范围内的左右的预测框均为候选正样本,计算所有候选正样本和所有gt的iou,分类和回归损失,利用回归和分类损失得到cost值,cost类似于候选正样本质量的一个指标,给每个gt调整k个iou最大的值,其和即为正样本个数,再根据cost值将候选框相应位置的正样本选出来作为gt的预测框,全程是anchor-free的。

5.ssd

        ssd增加了非常多的anchor,正负样本定义仍然采用MaxIoUAssigner,且没有忽略样本,在损失设计上通过ohem+ce loss和smooth l1 loss。ssd因为用了ohem,因此也没有正负样本采用的操作。

    train_cfg=dict(
        assigner=dict(
            type='MaxIoUAssigner',
            pos_iou_thr=0.5,
            neg_iou_thr=0.5,
            min_pos_iou=0.,
            ignore_iof_thr=-1,
            gt_max_assign_all=False),
        smoothl1_beta=1.,
        allowed_border=-1,
        pos_weight=-1,
        neg_pos_ratio=3,
        debug=False),

6.fcos

        首先是正负样本的分配,fcos的原版本中是落在gt框内即为正样本,在gt框外即为负样本,这种做法显而易见是不友好的,因为标注本身就含有大量噪声,如果gt全部区域都是正样本,那么在gt的边缘区域作为正样本预测是很难获得好结果的,在文本检测领域,都会采用shrink获取正样本区域,因此后面又提出了center_sample_radius,用于确定在半径范围内的样本都属于正样本区域,其余区域作为负样本,没有忽略样本,在预测是,根据回归分支输出的点到gt四边的距离的最大值来确定其预测的fpn层。

        在loss设计上分类分支用了focal loss,回归用iou loss,centerness用ce.

7.centernet

     centernet是gt中心落在哪个位置,那个位置就是正样本,其余位置都是负样本,对于centernet,其正负样本定义非常简单,可以看出会造成极其严重的正负样本不平衡问题,然后也无法像two-stage算法一样设计正负样本采样策略,那么平衡问题就必须要在loss上面解决。 对于offset和宽高预测分支,其只对正样本位置进行监督,故核心设计就在平衡分类上面。 对于分类平衡loss,首选肯定是focal loss了,但是还不够,focal loss的核心是压制大量易学习样本的权重,但是由于我们没有设置忽略区域,在正样本附近的样本,实际上非常靠近正样本,如果强行设置为0背景来学习,那其实相当于难负样本,focal loss会突出学这部分区域,导致loss难以下降、不稳定,同时也是没有必要的,因为我们的label虽然是0或者1的,但是在前向后处理时候是当做高斯热图(0~1之间呈现2d高斯分布特点)来处理的,我们学到最后的输出只要满足gt bbox中心值比附近区域大就行,不一定要学习出0或者1的图。基于上述设定,在不修改分类分支label的情况下,在使用focal loss的情况下,作者的做法是对正样本附近增加惩罚,基于2d高斯分布来降低这部分权重,相当于起到了类似于忽略区域的作用。还有个问题,centernet中对中心点的预测是很重要的,因为wh是依赖于中心点,wh和offset的监督仅仅在gt中心位置,回归的性能好不好,就看分类分支学的怎么样,中心定位不准,宽高也会不准。

8.atss

        atss明确提出正负样本的定义和分配是影响目标检测的核心因素,atss是有anchor的,只不过它的anchor本身可以参与计算,也可以不参与计算loss。我们以mmdet中的atss的backbone以retinanet为例,其anchor是参与loss的,不过atss不需要MaxIoUAssigner这一套正负样本定义,其不需要iou阈值和fcos中的分层fpn范围定义,几乎是自适应的正负样本分配,atss中也像fcos一样,每个像素就是一个anchor,不过此像素点乘了个scale,然后在每一层上根据距离像素点距离选择了k个anchor,然后计算这k个anchor的iou均值和标准差,在这个之和上的为正样本,之和下的为负样本。

9.spad:soft anchor-point object detection

10.guided anchoring

11.yolo-asff

        

版权声明:本文为CSDN博主「Kun Li」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012193416/article/details/122233221

Kun Li

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

局部对比度结合区域显著性红外弱小目标检测

《局部对比度结合区域显著性红外弱小目标检测》 作者提出了一种区域局部对比度算法,仅在图像的显著性区域中进行局部对比度计算,而非遍历整幅图像。 首先进行基于图像信息熵和局部相似性的红外图像区域显著性度量&#xff0

yolov5目标框预测

yolov5目标检测模型中,对模型结构的描述较多,也容易理解。但对如何获得目标预测方面描述较少,或总感觉云山雾罩搞不清楚。最近查阅一些资料,并加上运行yolov5程序的感受,