当前位置: 首页 > news >正文

【目标检测】36、OTA: Optimal Transport Assignment for Object Detection

文章目录

    • 一、背景
    • 二、方法
      • 2.1 Optimal Transport
      • 2.2 OT for label assignment
      • 2.3 Center prior
      • 2.4 Dynamic k Estimation
    • 三、效果

论文:Optimal Transport Assignment for Object Detection

代码:https://github.com/Megvii-BaseDetection/OTA

出处:CVPR2021

在这里插入图片描述
贡献:

  • 提出了一种基于优化策略的标签分配方式,Optimal Transport Assignment (OTA),将 gt 看做 label 供应商,anchor 看做 label 需求方。对于正样本,将分类和回归的 loss 加权和作为传输花费,对于负样本,传输花费就为分类 loss,通过最小化该花费,让网络自己学习最优的标签分配方式。
  • 免去了手工选定参数的方式来实现标签分配,让网络自己选择每个 gt 对应的 anchor 数量,而非提前设定,也能够较好的解决模棱两可的 anchor 分配问题,提高网络对这部分 anchor 的处理效果
  • 在 COCO 上实现了 40.7% AP

一、背景

在这里插入图片描述

Label assignment 在目标检测中非常重要,是一个预定义的规则,能够分配每个 anchor 的正负。RetinaNet 使用 IoU 来实现,FCOS 根据每个点是否在 gt box 内部来确定其正负。

这些方法忽略了一个问题:不同大小、形状、遮挡程度的目标,其 positive/negative 的判定条件应该是不同的。

所以就有一些方法使用动态的分配方法,来实现 label assignment。

  • ATSS 根据统计信息,来分配正负样本
  • Freeanchor、AutoAssign 等通过使用预测的 confidence score 来动态分配正负

作者认为,独立的给每个 gt 分配 pos/neg 不是最优的方法,缺失了上下文信息,当处理那些模棱两可的 anchor 时(如图 1 中的红色点,一个点处于多个 gt 中),上面的方法是靠手工的特征来选定属于哪个 gt 的(如 max-IoU、min-Area 等)

DETR 是首个从 global 层面考虑 label assignment 的方法,使用 Transformer 代替了 CNN 头,实现了 one-to-one 的 assignment。而 CNN 的方法,是 one-to-many 的形式,也就是一个 gt 会对应多个 anchor。

本文作者为了从 global 的层面来实现 CNN 中的 one-to-many assignment,将 label assignment 问题变成了一个 Optimal Transport(OT)问题,线性规划的一个特殊形式。

二、方法

2.1 Optimal Transport

OT 是这样的一个问题:

  • 假设有 m 个供货商,n 个需求方
  • 第 i 个供货商保留 s i s_i si 单元的货物,第 j 个需求方需要 d j d_j dj 单元的货物
  • 每个单元的货物从供货商 i 到需求方 j 的 Transporting cost 是 c i j c{ij} cij
  • OT 问题的目标是寻找一个 transportation plan π,让这个 Transporting cost 最小

在这里插入图片描述

2.2 OT for label assignment

在目标检测的上下文中,假设有 m 个 gt,n 个 anchor,把 gt 看做 positive labels 的供货商,供应 label,anchor 看做需求方,需要 label。

把一个 unit 的 positive label 从 g t i gt_i gti 传递到 anchor a j a_j aj 的花费为 c f g c^{fg} cfg,则该花费就是 cls 和 reg loss 的加权和(分类可用 Focal loss,回归可用 IoU loss 等):

在这里插入图片描述

除过 positive assignment,还有很大一部分 anchor 是负样本,所以还引入了一个供应商——背景,来提供 negative labels。

标准的 OT 问题中,供货商和需求方的数量应该是一样的,所以,背景可以提供的 negative labels 的数量就是 n − m × k n-m \times k nm×k,将一个单元的 negative label 从 background 传递到 anchor 的花费如下,只有分类的 loss:

在这里插入图片描述

  • ϕ \phi ϕ 表示背景类

c b g ∈ R 1 × n c^{bg}\in R^{1\times n} cbgR1×n c f g ∈ R m × n c^{fg} \in R^{m \times n} cfgRm×n concat 起来,就得到了最终的花费 c ∈ R ( m + 1 ) × n c \in R^{(m+1) \times n} cR(m+1)×n,供应商 s 可以被更新为:

在这里插入图片描述

有了花费、供应商、需求方后,最优传递方案 π*可以使用 off-the-shelf Sinkhorn-Knopp Iteration 方法解该 OT 问题来得到。

得到了 π* 之后,可以通过把每个 anchor 分配到能给他供货最多(即提供 label 数量最多)的 gt 上去来实现最优 label assignment。

OT 的计算只需要矩阵乘法,可以使用 GPU 来加速,提高了约 20% 的训练时间,在测试时候是无多消耗的。

OTA 的结构如下:

在这里插入图片描述

在这里插入图片描述

2.3 Center prior

1、Center prior

一般更关注 gt 中心区域采样的方法可以称为 center prior,OTA 是基于 global 的优化方法。理论上说 OTA 能够将任何处于 gt box 内部的 anchor 分配为正样本,但为了让模型更关注潜在的正样本区域(如 center area)来稳定训练过程,OTA 中也引入了 Center prior 的先验。

如何在 OTA 中引入 center prior 的先验:

  • 引入的方法是在 cost matrix 中拼接了 center prior
  • 对每个 gt,在每个 FPN level,选择距离 gt 中心 r 2 r^2 r2 内的 anchor 作为正样本
  • r 2 r^2 r2 之外的 anchor,会降低其被分配为正样本的可能性

2、不同大小的 r 的效果对比如下:

在这里插入图片描述

  • 小的 r 表示只有很少的 anchor 会被分配为正,能够让网络更关注有用的信息
  • 大的 r 表示会有更多的 anchor 会被分配为正,但会给网络带来一些不稳定因素
  • 当 r 分别为 3/5/7 时,对应的 anchor 分别为 45/125/245(anchor 数量= r 2 r^2 r2 * FPN levels)
  • OTA 对 r 的大小是很敏感的。当 r=5 时,表现较好。

3、对模棱两可的 anchor 的处理方式对比

当多个目标重叠或距离很近的时候,就会出现一个 anchor 和多个 gt 相交的情况,之前的方法 Min area、Max IoU、Min loss 等方法都是使用手工选定的规则来处理的。

作者分别计算了 ATSS、PAA、OTA 中模棱两可 anchor 的数量,并且计算了不同 r 下对应的性能,见表 2。

在这里插入图片描述

  • ATSS:随着 r 从 3 →7,模棱两可 anchor 的数量增长了很多,对应的 AP 从 39.4%→37.2%
  • PAA:模棱两可 anchor 的数量和 r 不是很相关,但 AP 也下降了 0.8%,这应该是由于 PAA 使用了 Max IoU,对这些模棱两可的 anchor 不是很友好
  • OTA:当多个 gt 都想要把自己的 label 传递给这个模棱两可的 anchor 的时候, OT 规则会根据 “最小全局花费” 的规则来解决这些冲突。所以 OTA 中的模棱两可的 anchor 数量少,且随着 r 没有很大的改变

图 3 中,红色箭头和虚线椭圆标明了模棱两可的位置,由于缺乏上下文和全局信息,ATSS 和 PAA 表现较差,OTA 在这里分配了很少的正样本,但有理由相信都是优质的样本。

在这里插入图片描述

2.4 Dynamic k Estimation

一般来说,每个 gt 对应的 anchor 数量应该是根据其尺寸、大小、遮挡比例等因素而改变的,所以难以直接根据这些因素建立一个映射关系来确定 gt 对应的 anchor 个数。

如何解决这种映射?——Dynamic k Estimation

作者提出了一个粗略的基于 IoU 的方法来估计每个 gt 对应的 positive anchor 数量。即选择 IoU 最大的前 q 个 anchor,将这 q 个 IoU 值相加,用做 anchor 的个数。

原理是什么呢?

作者认为,一个 gt 对应的合适的 anchor 个数和它周围的 well-regress 的 positive anchor 个数是正相关的,对比了动态的 k 和固定的 k 的效果如下:

不同大小 k 的效果对比如下:

当将 k 设置为固定数值时,随着 k 由小变大,AP 值是由小变大再变小的。

当 k=1 时,可以看做 one-to-one assigning strategy,但效果却不好,这说明是需要 one-to-many 的形式来实现好的效果的。

在这里插入图片描述

三、效果

1、实验设置

OTA 是一种 label assignment 的方法,是能够同时适用于 anchor-free 和 anchor-based 方法的,所以大多实验是基于 FCOS 的,还有一些基于 RetinaNet 等。

2、OTA 和其他方法结合的效果

OTA 超越了普通 FCOS 0.9%AP,和其他使用 IoU branch 等方法没差很大,使用 Dynamic k 提升到了 40.7%AP。在这里插入图片描述
3、和 SOTA 的对比

在这里插入图片描述

相关文章:

  • 判断时间范围是否重叠(原理)
  • RS笔记:深度推荐模型之WideDeep [2016.6 谷歌]
  • Shell脚本函数简介及运用
  • Java并发 | 16.[基础] synchronized简述
  • 一体化伺服电机在新能源汽车充电设备中的应用
  • Java并发 | 15.[基础] 线程安全分析
  • 【web-攻击应用程序框架】(12.1)分层架构:攻击与保障
  • java计算机毕业设计技术交流网站源码+数据库+系统+lw文档+mybatis+运行部署
  • iPhone没有收到iOS16最新版的推送,如何升级系统?
  • 人工神经网络算法的应用,人工神经网络算法步骤
  • 极智Paper | YOLOv7 更高 更快 更强
  • 大型在线考试答题系统源码 B/S架构
  • Uniswap 顶流之路:机制、决策与风险分析
  • Human-level control through deep reinforcement learning
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • 【347天】每日项目总结系列085(2018.01.18)
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • E-HPC支持多队列管理和自动伸缩
  • gulp 教程
  • JavaScript 基础知识 - 入门篇(一)
  • Java到底能干嘛?
  • Java的Interrupt与线程中断
  • k个最大的数及变种小结
  • Python socket服务器端、客户端传送信息
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • QQ浏览器x5内核的兼容性问题
  • Redis字符串类型内部编码剖析
  • 看域名解析域名安全对SEO的影响
  • 两列自适应布局方案整理
  • 前端相关框架总和
  • 如何使用 JavaScript 解析 URL
  • 思考 CSS 架构
  • 赢得Docker挑战最佳实践
  • ${factoryList }后面有空格不影响
  • %@ page import=%的用法
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (9)STL算法之逆转旋转
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (安卓)跳转应用市场APP详情页的方式
  • (笔试题)分解质因式
  • (二)斐波那契Fabonacci函数
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (七)Java对象在Hibernate持久化层的状态
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)winform之ListView
  • .NET 事件模型教程(二)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET中 MVC 工厂模式浅析
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • 。Net下Windows服务程序开发疑惑
  • @Transient注解