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

2023-10-27

目标检测正负样本区分策略和平衡策略总结(一) - 知乎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

        

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

目标检测正负样本区分和平衡策略总结 的相关文章

随机推荐

  • [渗透&攻防] 二.SQL MAP工具从零解读数据库及基础用法

    这是最近学习渗透和网站攻防的文章 希望能深入地学习这部分知识 自己作为一个初学者 前一篇文章从数据库原理解读了防止SQL注入 这篇文章通过SQLMAP工具简单介绍SQL注入及用法 自己仍在慢慢探索网络攻防和渗透 希望文章对你有所帮助 尤其是
  • 九十二.字符串算法问题(一)

    题一 判断字符串中有无重复字符 实现一个算法 确定一个字符串的所有字符是否全都不同 import java util Scanner public class LianXi public static boolean checkdiffer
  • virt-manager创建虚机需要指定的设置

    如果使用默认设置 鼠标键盘都不能用 也不能通过宿主机访问外网 所以在创建的时候 需要 好了 等到安装完毕 鼠标键盘在vnc中都能正常使用 也可以上网了
  • MATLAB读写.wav和.raw音频文件

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 wav文件格式 二 matlab代码 1 fread读 wav文件 2 fread读 raw音频文件 3 wav转raw 3 raw转wav 5 更改音频
  • String,StringBuffer,StringBuilder三者之间的联系和区别

    一 String 和 StringBuffer StringBuilder 相同点 String StringBuffer StringBuilder都是可以用来存储字符串的 不同点 1 String存储的字符串是不可变的 StringBu
  • 编译原理课设-设计一个词法分析器

    设计课设时时间紧凑 难免有些错误 文末还有完整的word可以直接下载使用 也可以直接私信我发你 文章目录 摘要 二 设计内容 一 目的 二 整体框架 三 设计类 四 项目技术 1 守卫锁lock guard C 11 2 正则表达式 C 1
  • MVC 服务端Api接口的开发

    总结上一个项目的服务器API开发的流程 附带源码下载 实现效果 存储客户端上传的订单数据到数据表 并展示到前端界面 共分为两个模块 此模块主要显示服务端如何存储数据 如何发送数据到前端界面 前后端建立的都是MVC项目 使用DTO模式传输数据
  • windows多用户远程登录工具 RDPWrap配置

    目录 准备 配置 完 准备 下载 在https github com stascorp rdpwrap releases tag v1 6 2下载RDPWrap v1 6 2 zip 下载后解压 配置 install bat右键管理员运行
  • (未解决)selenium.common.exceptions.NoSuchWindowException: Message: no such window

    执行代码如下 from selenium import webdriver from time import sleep if name main driver webdriver Chrome driver implicitly wait
  • 【1day】​万户协同办公平台 ezoffice未授权访问漏洞学习

    注 该文章来自作者日常学习笔记 请勿利用文章内的相关技术从事非法测试 如因此产生的一切不良后果与作者无关 目录
  • vue3中hooks的介绍及用法

    大家好 今天这篇文章是介绍一下vue3中的hooks以及它的用法 本文内容主要有以下两点 什么是hooks vue3中hooks的使用方法 一 什么是hooks hook是钩子的意思 看到 钩子 是不是就想到了钩子函数 事实上 hooks
  • 告别了夸克,我已经找到了比你更强大的浏览器

    老实说 夸克真的是一款非常不错的浏览器 但是随着更新这个app越来越臃肿 还搞起了付费网盘 很多人转身选择其他浏览器 以前也给大家推荐过Alook浏览器 X浏览器等 今天 再给大家推荐3款浏览器 比夸克更牛 更好用 不信就往下看吧 1 多御
  • 【论文精读】360MVSNet

    今天读的是发表在WACV2023上的MVS文章 该文章提出了基于全景相机的MVS pipeline 文章链接 点击前往 代码链接 暂未开源 文章目录 Abstract 1 Introduction 2 Related works 3 Met
  • day28 回溯

    93 复原IP地址 本质上是分割问题 判断一个分割的值是否有效 回溯需要去掉 78 子集 收集每个树的节点 90 子集II 收集每个树的节点 树层去重 package algor trainingcamp import java util
  • pycharm中的 opencv-python 没有函数提示的解决方案

    pycharm中用 pip install opencv python 安装的cv2可能没有函数提示功能 ctrl 鼠标左键 也不会进入源代码 解决方案如下 1 找到cv2对应python编译器的安装路径 pycharm左下角 将鼠标放在编
  • 什么是页缓存(Page Cache)(转载)

    我们知道文件一般存放在硬盘 机械硬盘或固态硬盘 中 CPU 并不能直接访问硬盘中的数据 而是需要先将硬盘中的数据读入到内存中 然后才能被 CPU 访问 由于读写硬盘的速度比读写内存要慢很多 DDR4 内存读写速度是机械硬盘500倍 是固态硬
  • teamviewer 试用期到期以后怎么卸载然后安装使用

    1 1 退出TeamViewer远程软件 卸载软件 2 2 按键盘的 win R 组合键打开 运行 输入 appdata 3 3 在弹出的窗口中 找到并删除TeamViewer文件夹 4 4 按键盘的 win R 组合键打开 运行 输入 r
  • 降噪电路_TWS蓝牙耳机降噪要选对蓝牙晶振

    如今 越来越多的手机开始取消3 5mm耳机接口 转而采用USB C接口耳机或是无线蓝牙耳机 但消费者对音乐分辨率的要求却始终有增无减 一项调查显示 音质已成为消费者选择耳机或音箱产品时最看重的因素 76 的受访者为此投了赞成票 79 的受访
  • 启动指定用户docker

    有段时间没用docker了 都不记得怎么操作了 启动指定用户docker 方法如下
  • 目标检测正负样本区分和平衡策略总结

    目标检测正负样本区分策略和平衡策略总结 一 知乎0 简介本文抛弃网络具体结构 仅仅从正负样本区分和正负样本平衡策略进行分析 大体可以分为 正负样本定义 正负样本采样和平衡loss设计三个方面 主要是网络预测输出和loss核心设计即仅仅涉及网