CVPR2020中的文章ATSS揭露到anchor-based和anchor-free的目标检测算法之间的效果差异原因是由于正负样本的选择造成的。而在目标检测算法中正负样本的选择是由gt与anchor之间的匹配策略决定的。因此我们研究一下目前现有的匹配策略,并根据现状给出改进思路。

faster rcnn或者retinanet或者ssd算法

  • 采用的分配策略是max iou assigner,即:对于每个gt,将高于正样本阈值的并且是max iou位置的anchor设置为正样本;将低于负样本阈值的anchor设置为负样本,考虑到有些gt和anchor的iou不高,故还设置了最小正样本阈值,当某个gt和anchor的max iou大于最小正样本阈值时候,则依然将该anchor设置为正样本。

yolo系列

  • 是对于每个gt,将max iou位置的anchor设置为正样本,不管阈值多大(先要确定哪一预测层负责预测),这种操作对anchor设置要求较高,因为如果anchor设置不合理,就只能用大量低质量anchor负责回归了。对于正样本附近的anchor预测值,其可能和gt的iou也很高,故需要将这些位置的anchor预测值设置为忽略样本,默认阈值是0.7。可能滤除一些正样本。

fcos

  • 第一步也是和yolo一样,要确定某个Gt在第几个层负责预测(采用minsize 和 max size),第二步是需要确定在每个输出层上面,哪些空间位置是正样本区域,哪些是负样本区域。原版的fcos的正负样本策略非常简单粗暴:在bbox区域内的都是正样本,其余地方都是负样本,而没有忽略样本区域。可想而知这种做法不友好,因为标注本身就存在大量噪声,如果bbox全部区域都作为正样本,那么bbox边沿的位置作为正样本负责预测是难以得到好的效果的,显然是不太靠谱的(在文本检测领域,都会采用shrink的做法来得到正样本区域),所以后面又提出了center sampling的做法来确定正负样本,具体是:引入了center_sample_radius(基于当前stride参数)的参数用于确定在半径范围内的样本都属于正样本区域,其余区域作为负样本,依然没有定义忽略样本

Guided Anchoring

论文思想是通过图像特征来指导 anchor 的生成。通过预测 anchor 的位置和形状,来生成稀疏而且形状任意的 anchor,并且设计了 Feature Adaption 模块来修正特征图使之与 anchor 形状更加匹配,在使用 ResNet-50-FPN 作为 backbone 的情况下,Guided Anchoring 将 RPN 的 recall(AR@1000) 提高了 9.1 个点,将其用于不同的物体检测器上,可以提高 mAP 1.2 到 2.7 个点不等。

论文实现方式如下图:

匹配策略:将整个 feature map 的区域分为物体中心区域,外围区域和忽略区域,大概思路就是将 ground truth 框的中心一小块对应在 feature map 上的区域标为物体中心区域,在训练的时候作为正样本,其余区域按照离中心的距离标为忽略或者负样本,具体设计在 paper 里讲得比较清楚。通过位置预测,我们可以筛选出一小部分区域作为 anchor 的候选中心点位置,使得 anchor 数量大大降低。在 inference 的时候,预测完位置之后,我们可以采用 masked conv 替代普通的 conv,只在有 anchor 的地方进行计算,可以进行加速。

ATSS

1)对于每个GT,找到候选的正anchor集合:

在每个金字塔层级(共L层)上,选择topk个离GT中心距离最近的anchor boxes作为候选anchor, 那么每个GT就会有k*L个候选正anchor。

(2)计算自适应阈值:

计算候选anchor与GT之间的IoU Dg,计算均值

和标准差
,其阈值为:

(3)确定最终的正anchor:

选择

,且中心点在GT边框内部的anchor作为最终的正样本,如果一个anchor box被分配给了多个GT,选择IoU最高的那个GT。

ATSS的意义:

  • 根据目标统计特征,自动调整正负样本选取方式。如图(a),当

    越大,表示候选样本质量很高,可以选取一个高的IoU阈值。如图(b),
    越小,表示绝大多数的候选样本较差,应当选取一个较低的阈值来确保GT可以匹配到anchor。如图3(a),
    较大时,往往意味着有一个FPN层出现了较高的IOU,说明该层非常适合这个物体的预测,因此
    加起来得到一个较高的阈值,我们只从这一层选取正样本。如图3(b),
    较小意味着存在多个适合该目标的金字塔层,因此
    加起来得到一个较低的阈值,会在这些层级上选取正样本。
  • 每个目标匹配anchor数量相对均匀。

HAMBox

匹配策略:

  1. 将每张脸匹配到那些与它的iou大于某个阈值的anchor,对于outer face不进行补偿。
  2. 在训练的每次前向传播之后,每个anchor通过回归得到的坐标计算出回归框,我们将这些回归框记作
    ,异常脸outer face记作
    。最后,对于每个outer face,我们计算它与
    的IOU值,然后对每张outer face补偿N个unmatched anchor。记所有的IOUs为
    , 这些补偿的N个anchor通过下面方式选择:

(a)IOU要大于阈值T(在线正anchor匹配阈值)

(b)对(a)中得到的anchor进行排序,选择IOU最大的top-K 个anchor做补偿。K是一个超参数,表示每个outer face能matched的最多anchor数目。使用M表示在步骤1中已经匹配的anchor数目。如果N > K-M,则选取top(K-M)个unmatched anchor来补偿。

T和K是通过实验选择的超参数。具体算法细节见下 Algorithm 1,该算法在训练的每次前向传播后执行一次.

Algorithm1具体见下:

/*
输入:B,X,T,K,D,L,R,A
B 是一组回归后的框,格式为(x0, y0, x1, y1)
X 是一组ground truth, 格式为(x0, y0, x1, y1)
T 是上述算法中在线anchor挖掘中定义的阈值
K 是每个outer face能匹配到的最多anchor数目
D 是一个字典,key是ground_truth, value是HAMBox第一步中该gt能match到的anchor数,即matched_anchor的数目
L 是一个字典,key是anchor index, value是该anchor在HAMBox中最终分配的label
R 是一个字典,key是anchor index, value是该anchor经过普通anchor matching后的编码后的坐标
A 是一个字典,key是anchor index, value是该anchor的坐标,格式为(x0, y0, x1, y1)输出:经过HAMBox后的R和L
*/
// 伪代码见下
for x_i in x doif D(x_i) >= K thencontinueend ifcompensatedNumber = K - D(x_i)onlineIoU = IoU(x_i, B),AnchorIdx sortedOnlineIoU = sorted(onlineIoU, key = IoU, reverse = True)for IoU, AnchorIdx in sortedOnlineIoU doif(L(AnchorIdx) = 1) thencontinueendifif(IoU < T) thencontinueendifcompensatedNumber -= 1L(AnchorIdx) = 1R(AnchorIdx) = encoded(A(AnchorIdx), x_i)if compensatedNumber = 0 then  breakendifendfor
endfor
return R, L

找不到匹配的key exchange算法_目标检测--匹配策略相关推荐

  1. 基于haar特征的adaboost算法_目标检测算法介绍

    什么是目标检测 目标检测是指从图像中找出目标,包括检测和识别两个过程,现实中由于环境的复杂性以及各类物体的形状.外观以及光照,遮挡等因素的干扰,所以目标检测一直也是计算机视觉最常见的挑战之一. 目标检 ...

  2. keras优化算法_目标检测算法 - CenterNet - 代码分析

    代码出处 吃水不忘打井人,分析github上的基于keras的实现: xuannianz/keras-CenterNet​github.com 代码主体结构 模型训练的主函数流程如下所示,该流程也是使 ...

  3. YOLODet最新算法的目标检测开发套件,优化到部署

    向AI转型的程序员都关注了这个号???????????? 人工智能大数据与深度学习  公众号:datayx YOLODet-PyTorch是端到端基于pytorch框架复现yolo最新算法的目标检测开 ...

  4. DL之SSD:基于tensorflow利用SSD算法实现目标检测(21类)

    DL之SSD:基于tensorflow利用SSD算法实现目标检测(21类) 目录 输出结果 SSD代码 输出结果 VOC_LABELS = {'none': (0, 'Background'),'ae ...

  5. .net 多个dll 封装成一个dll_C#封装YOLOv4算法进行目标检测

    C#封装YOLOv4算法进行目标检测 概述 官网:https://pjreddie.com/darknet/ Darknet:[Github] C#封装代码:[Github] YOLO: 是实现实时物 ...

  6. c 语言 封装dll_C#封装YOLOv4算法进行目标检测

    C#封装YOLOv4算法进行目标检测 概述 官网:https://pjreddie.com/darknet/ Darknet:[Github] C#封装代码:[Github] YOLO: 是实现实时物 ...

  7. YOLOv7如何提高目标检测的速度和精度,基于优化算法提高目标检测速度

    目录 一.学习率调度 二.权重衰减和正则化 三.梯度累积和分布式训练 1.梯度累积 2.分布式训练 四.自适应梯度裁剪 大家好,我是哪吒. 上一篇介绍了YOLOv7如何提高目标检测的速度和精度,基于模 ...

  8. 路面裂痕检测YOLO算法、目标检测算法实现地面裂缝检测

    道路裂纹检测YOLO算法,目标检测,目标识别,裂纹检测 路面裂痕检测YOLO算法.目标检测算法实现地面裂缝检测 车头定位 交通标志识别 车道线识别 自己标注数据,训练模型,效果很好4360063193 ...

  9. redis删除过期key的算法_面试官别再问我Redis内存满了该怎么办了

    概述 Redis的文章,我之前写过一篇关于「Redis的缓存的三大问题」,累计阅读也快800了,对于还只有3k左右的粉丝量,能够达到这个阅读量,已经是比较难了. 这说明那篇文章写的还过得去,收到很多人 ...

最新文章

  1. CUDA Samples: Long Vector Add
  2. bioskey的用法
  3. 饿了么外卖商家版电脑版_为什么有些美团、饿了么外卖商家生意那么好,单子也不少,但是却倒闭了?...
  4. 微信小程序_基础组件学习02
  5. oracle的监听器是什么,Oracle监听器,让你监听想要的东东
  6. 不同的模块中定义同样的宏为不同的值合法吗_如何创建自定义的建模规范
  7. Socket、Http、TCP/IP、UDP的联系与区别
  8. Mysql数据库drop表不用跑路,表空间传输助你恢复数据
  9. phinx数据库脚本迁移工具
  10. 一步一步使用标c编写跨平台图像处理库
  11. abaqus对应python版本_Abaqus里应用Python的一些技巧
  12. PySide2嵌入外部程序
  13. Android 角标设置
  14. 【一】欧式空间、欧式变换
  15. 没有捷径!没有捷径!没有捷径!
  16. 被繁杂的数据搞到头大?让 Google Cloud 大数据平台帮你实现快准狠!
  17. 24点纸牌游戏,c语言实现
  18. 瞬时测频接收机matlab_瞬时测频接收机
  19. java面试题----选择题02
  20. 讯飞webapi语音合成多音字处理

热门文章

  1. 本博客弃用,请移步http://ningios.com查看最新
  2. Javascript基础系列之(五)条件语句(比较操作符)
  3. dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.Gold;第一次无效
  4. C# 把字符串类型日期转换为日期类型
  5. ASP.NET Web Pages 的冲突版本问题
  6. dubbo管理控制台安装和使用
  7. JavaWeb学习总结(三十五)——使用JDBC处理Oracle大数据
  8. ASP.NET GetPostBackEventReference
  9. 使用 Feign 调用分页接口报错:Method has too many Body parameters(亲测)
  10. 如何用Python从数据库里面获取数据?4个步骤就能轻松实现