【论文阅读笔记】TOOD: Task-aligned One-stage Object Detection
论文代码:https://github.com/fcjian/TOOD
文章目录
- 论文小结
- 论文简介
- 论文方法
- Task-aligned Head(T-Head)
- T-Head伪代码解释
- Task Alignment Learning(TAL)
- Task-aligned Sample Assignment
- Task-aligned Loss
- 论文实验
- 消融实验
论文小结
本文的目标,主要是解决不同任务之间预测的不对齐问题。任务不对齐,简单来说,就是分类的最佳anchor(point)和回归的最佳anchor(point)不一定是同一个,亦或者同个grid point的分类和回归所预测的实例对象不是同一个。
为了解决这个问题,作者从模型结构的检测头或者训练策略中的标签分配中出发,分别设计了T-Head和TAL两个能相互结合的方案。其中TAL被后续文章和实践中较多使用。
TAL的主要思路就是不事先赋予无法改变的标签,而是结合分类的预测 s \mathcal{s} s 和回归的预测生成的IoU分数 u \mathcal{u} u来动态生成本次学习的标签。因此,TAL(Task Alignment Learning)中会有一个learning的说法。
本文的对比实验和消融实验室未充分训练的对比,大致训练12个epoch来对比的。
论文简介
由于分类和定位学习机制的差异,两个任务学习到的特征空间分布可能不同。当两个任务分支单独预测时,会导致一定程度的不对齐。如下图 1 1 1所示,上面行是ATSS算法预测的结果,下面行是本文TOOD算法预测的结果。图中黄色框是餐桌的label,分类任务的最佳位置是红色色块,其边框预测为红框;回归任务的最佳位置是绿色色块。从图 1 1 1可以容易看出,在原有方法训练管道得到的结果,可能会出现分类任务和定位任务的不对齐问题。

在原先的方法(比如FCOS和ATSS)的认知中,对象的几何中心附近更容易预测对象(anchor-based在grid上,anchor-point),给予靠近中心的正样本分配更高的分数,更高的权重。这种启发式的方法取得很好的效果,但可能带来两个局限性:
- 分类和定位的独立性。对象实例有重叠时,分类目标和定位目标不匹配;
- 任务不可知标签分配。标签都是按照定位的几何中心分配的,但即使是定位问题,几何中心都不一定是最合适预测的。更何况标签的分配没有考虑分类任务的概率图(probably map)。分类和定位的最佳anchor通常是不一致的,并且依据目标的形状和特种有较大差异。因此很难对两个任务作出准确而一致的预测。
为了解决分类任务和定位任务的不对齐问题,本文的贡献是提出了T-head和TAL两个方法。
T-head,大致是为了增加两个任务之间的交互,以及增强检测器学习对齐的能力。总得来说,就是设计了一个新的检测头。
TAL方法,目标是让两个任务的最佳anchor尽可能接近。其做法是设计一个简单的分配方案和任务对齐损失。样本分配通过每个anchor的任务对齐难度来收集训练的正负样本。而任务对其损失则在训练过程中逐渐统一预测分类和定位的最佳anchor。
基本做法如下图所示,产生了cls和loc预测,再获得对齐指标,放入TAL中,进行标签分配和反向传播。

论文方法
网络的整体设计也是按照“backbone - neck - head”结构来的。为简单和方便,TOOD在每个位置使用 1 1 1个anchor(anchor point/box)。如上图 2 2 2所示,T-Head和TAL可以协调地共同作用。原架构如下图 3 ( a ) 3(a) 3(a)所示,所提出的T-head如下图 3 ( b ) 3(b) 3(b)所示。

Task-aligned Head(T-Head)
T-Head的目标是增加分类任务和定位任务的交互,以及增加两个任务之间的预测对齐能力。
T-Head的架构图如上图 3 ( b ) 3(b) 3(b)所示,先通过多个卷积来堆叠任务交互特征,如公式(1)所示,然后再经过 2 2 2个TAP(Task-aligned Predictor),用于对齐分类和定位。TAP的架构图如上图 3 ( c ) 3(c) 3(c)所示。
X k i n t e r = { δ ( c o n v k ( X f p n ) ) , k = 1 , ∀ k ∈ { 1 , 2 , . . . , N } δ ( c o n v k ( X k − 1 i n t e r ) ) , k > 1 (1) X_k^{inter}=\begin{cases}\delta(conv_k(X^{fpn})),k=1, \ \ \ \ \forall k\in\{1,2,...,N\} \\ \delta(conv_k(X_{k-1}^{inter})),k>1\end{cases}\tag{1} Xkinter={δ(convk(Xfpn)),k=1, ∀k∈{1,2,...,N}δ(convk(Xk−1inter)),k>1(1)
由于TAP是一条单独的分支,任务交互特征不可避免地会在两个不同任务之间引入一定程度的特征冲突,所以作者提出来layer attention机制。通过在level级别动态计算任务特定特征,来鼓励任务分解,如公式(2)、(3),(4)。
X k t a s k = w ⋅ X k i n t e r , ∀ k ∈ { 1 , 2 , . . . , N } , (2) X_k^{task} = \mathcal{w}\cdot X_k^{inter}, \forall k\in \{1,2,...,N\}, \tag{2} Xktask=w⋅Xkinter,∀k∈{1,2,...,N},(2)
下面公式中的 δ \delta δ是全局池化层(GAP);
w = σ ( f c 2 ( δ ( f c 1 ( x i n t e r ) ) ) ) (3) \mathcal{w} = \sigma(fc_2(\delta(fc_1(x^{inter})))\tag{3}) w=σ(fc2(δ(fc1(xinter))))(3)
下面公式中的 δ \delta δ是ReLU非线性层;
Z t a s k = c o n v 2 ( δ ( c o n v 1 ( X t a s k ) ) ) (4) Z^{task}=conv_2(\delta(conv_1(X^{task})))\tag{4} Ztask=conv2(δ(conv1(Xtask)))(4)
如上图 3 ( c ) 3(c) 3(c)所示,对于预测的分类分数 P ∈ R H × W × 80 P\in\mathbb{R}^{H\times W \times 80} P∈RH×W×80,从交互特征中,学习一个空间概率图(spatial probability map) M ∈ R H × W × 1 M\in\mathbb{R}^{H\times W \times 1} M∈RH×W×1来调整分类预测,完成对齐: P a l i g n = P × M (5) P^{align}=\sqrt{P\times M} \tag{5} Palign=P×M(5)
同样的,对于预测的边框对象 B ∈ R H × W × 4 B\in\mathbb{R}^{H\times W \times 4} B∈RH×W×4,从交互特征中学习一个空间偏差图(spatial offset maps) O ∈ R H × W × 8 \Omicron\in\mathbb{R}^{H\times W \times 8} O∈RH×W×8来调整每个位置的bbox,完成对齐。 B a l i g n ( i , j , c ) = B ( i + O ( i , j , 2 × c ) , j + O ( i , j , 2 × c + 1 ) , c ) (6) B^{align}(i,j,c)=B(i+\Omicron(i,j,2\times c),j+\Omicron(i,j,2\times c+1), c)\tag6 Balign(i,j,c)=B(i+O(i,j,2×c),j+O(i,j,2×c+1),c)(6)
O \Omicron O和 M M M从交互特征学习的公式如下: M = c o n v 2 ( δ ( c o n v 1 ( X i n t e r ) ) ) (7) M=conv_2(\delta(conv1(X^{inter})))\tag7 M=conv2(δ(conv1(Xinter)))(7) O = c o n v 4 ( δ ( c o n v 3 ( X i n t e r ) ) ) (8) \Omicron=conv_4(\delta(conv3(X^{inter})))\tag8 O=conv4(δ(conv3(Xinter)))(8)
T-Head伪代码解释
依据作者的描述是能够平衡学习两个任务交互特征,实际上思路大致是在neck之后先使用统一的管道来tune特征,就像早期的cls head与reg head未解耦时的状态。然后使用一些启发性的架构,比如channel attention来“解耦”cls特征和reg特征,channel attention的权重初步由全局池化层(GAP)得到,再通过卷积对该权重进行学习(类似于AsConv),作为attention的自适应权重。在得到分类和回归的推理结果上,作者也有一些启发性的设计。比如,分类任务首先预测一个分类分数,然后再预测一个分类概率相结合;回归任务首先预测一个bbox的xywh,再预测一个offset来进行调整。
feat_0 = feat_fpn
feat_{i} = leaky_relu(bn(Conv(feat_{i-1}))) # use for both cls task and reg task.
feat = torch.cat(feat_{i,...,n})weight = GAP(feat)
weight_cls = sigmoid(conv2(relu(conv1(weight))) # 从这儿解耦分类和回归,conv1/2/3/4表示不同卷积
weight_reg = sigmoid(conv4(relu(conv3(weight)))feat_cls = channel_attention(weight_cls, feat)
feat_reg = channel_attention(weight_reg, feat)# get cls prediction
cls_sigmoid = Conv3(256 -> num_anchors * 80)[feat_cls] # input is feat_cls
cls_prob = Conv1(256*6 -> 64)[feat] => relu => Conv3(64 -> 1) # input is feat
cls_scores = \sqrt(cls_sigmoid.sigmoid() * cls_prob.sigmoid())# get reg prediction
reg_dist = Conv3(256 -> num_anchors * 4)[feat_reg].exp() # input is feat_reg
reg_bbox = dis2bbox(reg_dist)
reg_offset = Conv1(256*6 -> 64)[feat] => relu => Conv3(64 -> 8) # input is feat
bbox_pred = deform_Conv2d(reg_bbox, reg_offset) # a library from mmlab/mmcv,add reg_offset for reg_bbox map. details see the formule.
Task Alignment Learning(TAL)
在TAL中,主要有两点创新:
- 动态选择最适合的anchor(在一个设计好的指标下);
- 它同时考虑anchor分配和权重,包括一个样本分配策略和专门为调整两个任务而设计的新Loss。
anchor分配策略应该有如下 2 2 2个规则:(1)一个对齐良好的anchor应该同时能预测一个高的分类分数和一个精确的定位;(2)没对齐的anchor应该有交底的分数,随后被NMS抑制。
Task-aligned Sample Assignment
设定分类分数为 s s s,预测和GT的IoU值为 u u u,设计anchor级的对齐指标如下面公式,这样能同时衡量分类和定位的预测质量: t = s α × u β (9) t=s^\alpha\times u^\beta\tag9 t=sα×uβ(9)
对于每个实例,依据 t t t值进行排序,选择最大值的 m m m个anchors作为正样本,其他作为负样本。因此,每个训练迭代中,标签的分配都是动态赋予的。
Task-aligned Loss
分类目标上,作者使用 t t t值代替正样本anchor中的二元标签。
但作者也发现,随着 α \alpha α和 β \beta β的上升, t t t值标签就会变小,进而导致无法收敛。所以作者将 t t t进行正则化,标记为 t ^ \hat{t} t^,来代替正样本anchor中的二元标签。 t ^ \hat{t} t^的正则化应该遵循两项原则:(1)确保硬实例都能够高效地被学习(硬是难易样本的说法,比如Focal loss中的hard sample,此时所有的正anchor都只有很小的 t t t值标签);(2)根据预测框的精度来保持实例之间的等级。
因此,作者采用了一个简单的实例级的正则化 t ^ \hat{t} t^方法: t ^ \hat{t} t^的最大值等于每个实例的最大IoU值。(实际上就是换了个标签分配方案,可能为了方便写论文)。此时,经过BCE(Binary Cross Entropy)的损失函数为: L c l s _ p o s = ∑ i = 1 N p o s B C E ( s i , t ^ i ) (10) L_{cls\_{pos}}=\sum_{i=1}^{N_{pos}}BCE(s_i, \hat{t}_i)\tag{10} Lcls_pos=i=1∑NposBCE(si,t^i)(10)
在分类任务上,使用focal loss,分类损失如下:其中 γ \gamma γ是focal loss的超参数。 L c l s = ∑ i = 1 N p o s ∣ t ^ i − s i ∣ γ B C E ( s i , t ^ i ) + ∑ j = 1 N n e g s j γ B C E ( s j , 0 ) (11) L_{cls}=\sum_{i=1}^{N_{pos}}|\hat{t}_i-s_i|^\gamma BCE(s_i, \hat{t}_i) + \sum_{j=1}^{N_{neg}}s_j^\gamma BCE(s_j, 0)\tag{11} Lcls=i=1∑Npos∣t^i−si∣γBCE(si,t^i)+j=1∑NnegsjγBCE(sj,0)(11)
在定位任务上,作者通过关注对齐良好的anchors(具有较大的 t t t值),来提高任务对齐和回归精度,同时减少边框回归过程中不对齐anchors的影响。
基于 t ^ \hat{t} t^来为每个anchor的bbox的loss重新分配权重。使用的损失函数为GIoU Loss,回归的损失公式如下: L r e g = ∑ i = 1 N p o s t ^ i L G I o U ( b i , b i ˉ ) L_{reg}=\sum_{i=1}^{N_{pos}}\hat{t}_iL_{GIoU}(b_i, \bar{b_i}) Lreg=i=1∑Npost^iLGIoU(bi,biˉ)
论文实验
COCO数据集,trainval135k为训练集,minival set为验证集。
TOOD的backbone(ResNet-50,ResNet-101,ResNeXt-101-64x4d)都是在ImageNet上进行的预训练,检测头采用的是anchor-free的设计。本文实验中,anchor-based的组和anchor-free的性能相似。T-Head的连续卷积层数量 N = 6 N=6 N=6,Focal Loss的超参数 γ = 2 \gamma=2 γ=2。
消融实验
消融实验中,使用的backbone为ResNet-50,默认训练周期为 12 12 12个epochs(没有收敛完全)。
下表1展示了T-head的消融实验结果,能涨AP 0.7 − 1.9 0.7-1.9 0.7−1.9。

TAL的消融实验如下表所示:

Anchor-based和Anchor-free的消融实验如下:两者性能接近。

α \alpha α和 β \beta β的消融实验如下表所示: α = 1.0 \alpha=1.0 α=1.0, β = 6 \beta=6 β=6的情况下,得到的性能最好。

TOOD与其他一阶目标检测算法的对比结果如下:其中每个模型使用不同分辨率( 480 − 800 480-800 480−800)训练,训练 24 24 24个epochs。

TOOD整体结构的消融实验如下表所示:TOOD的设计 比 T-Head + ATSS 以及平行head + TAL的指标都好,表明T-head和TAL具有相辅相成的互补性。

相关文章:

【论文阅读笔记】TOOD: Task-aligned One-stage Object Detection
论文代码:https://github.com/fcjian/TOOD 文章目录 论文小结论文简介论文方法Task-aligned Head(T-Head)T-Head伪代码解释 Task Alignment Learning(TAL)Task-aligned Sample AssignmentTask-aligned Loss 论文实验消…...

类中的特殊内容
仿照string类,自己手动实现 My_string #include <iostream> #include <string.h> using namespace std;class My_string { private:int len;int size;char *ptr; public:My_string():size(15),len(0){ptrnew char[size];ptr[0]\0;}My_string(const char…...

network request to https://registry.npmjs.org/xxx failed, reason: connect ETIM
目录: 1、问题描述2、解决方案3、npm镜像仓库替换 1、问题描述 npm install 时,报错:npm ERR! network request to https://registry.npmjs.org/postcss-pxtorem failed, reason: connect ETIMEDOU npm ERR! code ETIMEDOUT npm ERR! errno…...

MQ入门(二):java客户端SpringAMQP
目录 1.SpringAMQP 1.1.导入demo工程 1.2.快速入门 1.2.1.消息发送 1.2.2.消息接收 1.2.3.测试 1.3.WorkQueues模型 1.4.交换机类型 1.4.1.Fanout交换机 1.4.2.Direct交换机 1.4.3.Topic交换机 1.5.声明队列和交换机 1.5.1.基于注解声明 1.6.消息转换器 1.6.1.测…...

软技能与AI技术的融合
一、引言 ---- 随着人工智能(AI)和生成式人工智能(AIGC)如ChatGPT、Midjourney、Claude等大语言模型的迅速崛起,AI辅助编程工具已经变得越来越普遍。这不仅意味着程序员的工作方式正在发生深刻的变革,同…...

在视频上绘制区域:使用Vue和JavaScript实现交互式画布
在数字时代,交互式媒体内容的创建和消费变得越来越普遍。特别是视频内容,它不仅提供了视觉信息,还允许用户与之互动,从而增强了用户体验。本文将介绍如何使用Vue.js框架和JavaScript创建一个交互式组件,该组件允许用户…...

31. RabbitMQ顺序消费
1. 前言 上个小节中我们介绍了 RabbitMQ 中如何防止消息丢失,即保证消息发送的 At Least Once 性质,除此之外,如何防止消息被重复消费,即保证消息消费的 Exactly Once 性质,也是业务逻辑中需要考虑的问题。 2. 消息消费顺序 面试官提问:业务中使用了 RabbitMQ 消息队列…...

BERT-BiLSTM-CRF模型实战
文章目录 BERT-BiLSTM-CRF模型项目结构数据预处理运行环境使用方法关于BERT-BiLSTM-CRF参考文章BERT-BiLSTM-CRF模型 使用谷歌的BERT模型在BiLSTM-CRF模型上进行预训练用于中文命名实体识别。 项目结构 bert_bilstm_crf_ner_pytorchtorch_nerbert-base-chinese --…...

npm 安装 与 切换 淘宝镜像
一、镜像源 npm默认镜像源是国外的,安装依赖速度较慢,使用国内的镜像源速度会快一些。 1、设置淘宝镜像源: #最新地址 淘宝 NPM 镜像站喊你切换新域名啦! npm config set registry https://registry.npm.taobao.org(弃用了&…...

在Windows系统上安装的 Arrow C++ 库
在Windows系统上安装的 Arrow C 库 正文第一步第二步第三步第四步注: 检查是否安装成功 吐槽 正文 第一步 git clone gitgithub.com:apache/arrow.git第二步 打开powershell (好像cmd也可以,不过我试了powershell中不报错,cmd中报错,不是很清楚为什么) 打开arrow的目录 cd …...

格雷母线电缆头安装方法视频-武汉正向科技
正向科技|格雷母线电缆头怎么处理? 正向科技格雷母线采用整体热压工艺生产,一次成型,防护等级 IP67,用在直线或环形位移检测,抗污染能力强,防水、油、灰尘、蒸汽等,能在强粉尘、高温的环境下稳定…...

统信服务器操作系统【Cron定时任务服务】
Cron定时任务服务服务介绍、服务管理、服务配置 文章目录 一、功能概述二、功能介绍1. Cron 服务管理2.Cron 服务管理3.Cron 服务配置run-parts一、功能概述 cron是一个可以用来根据时间、日期、月份、星期的组合来 调度对周期性任务执行的守护进程。利用 cron 所提供的功能,可…...

微前端中的路由加载流程
1. 初始化基座应用 基座应用:基座应用是微前端架构中的主应用,负责管理和协调各个子应用的加载和卸载。 初始化:基座应用在启动时会初始化路由配置,注册各个子应用的路由。 2. 注册子应用 子应用需要向基座应用注册自己的路由和…...

Axure大屏可视化模板:跨领域数据分析平台原型案例
随着信息技术的飞速发展,数据可视化已成为各行各业提升管理效率、优化决策过程的重要手段。Axure作为一款强大的原型设计工具,其大屏可视化模板在农业、园区、城市、企业数据可视化、医疗等多个领域得到了广泛应用。本文将通过几个具体案例,展…...

机器学习(1)——线性回归、线性分类与梯度下降
文章目录 线性回归线性分类线性可分数据线性不可分数据逻辑回归支持向量机 梯度下降批量梯度下降随机梯度下降批量随机梯度下降 线性回归 概述: 在一元线性回归中,我们假设目标变量y与特征变量x存在线性关系,模型表达式为: y …...

完整的端到端的中文聊天机器人
这段代码是一个完整的端到端的中文聊天机器人的实现,包括数据处理、模型训练、预测和图形用户界面(GUI),下面是对各个部分功能的详细说明: 1. 导入必要的库 import os os.environ[CUDA_LAUNCH_BLOCKING] = 1import torch import torch.nn as nn import torch.optim as o…...

【有啥问啥】Stackelberg博弈方法:概念、原理及其在AI中的应用
Stackelberg博弈方法:概念、原理及其在AI中的应用 1. 什么是Stackelberg博弈? Stackelberg博弈(Stackelberg Competition)是一种不对称的领导者-追随者(Leader-Follower)博弈模型,由德国经济学…...

【UI自动化】前言
系列文章目录 【UI自动化】前言 自动化不能代替手工测试,自动化都是以手工测试为基础,自动化测试实现的步骤要依赖手工; 文章目录 系列文章目录【UI自动化】前言 自动化测试的类型自动化解决的问题什么是UI测试测试分类一、使用UI自动化的…...

Unity对象池的高级写法 (Plus优化版)
唐老师关于对物体分类的OOD的写法确实十分好,代码也耦合度也低,但是我有个简单的写法同样能实现一样的效果,所以我就充分发挥了一下主观能动性 相较于基本功能,这一版做出了如下改动 1.限制了对象池最大数量,多出来的…...

vue3<script setup>中computed
在 Vue 3 中,<script setup> 语法糖是 Composition API 的一种简化写法,它允许你更简洁地编写组件逻辑。在 <script setup> 中使用 computed 与在普通 <script> 标签中使用 Composition API 的方式类似,但通常我们会借助 i…...

【已解决】使用JAVA语言实现递归调用-本关任务:用循环和递归算法求 n(小于 10 的正整数) 的阶乘 n!。
本关任务:用循环和递归算法求 n(小于 10 的正整数) 的阶乘 n!。 测试说明 平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试: 测试输入:1…...

BiRefNet 教程:基于 PyTorch 实现的双向精细化网络
BiRefNet 教程:基于 PyTorch 实现的双向精细化网络 BiRefNet 是一个图像分割网络,专注于复杂任务如背景移除、掩码生成、伪装物体检测、显著性目标检测等。该模型结合了编码器、解码器、多尺度特征提取、以及梯度监督机制,能够有效处理不同类…...

Oracle 数据库安装和配置指南(新)
目录 1. 什么是Oracle数据库? 2. 安装前的准备工作 2.1 硬件要求 2.2 软件要求 2.3 下载Oracle安装包 3. Oracle数据库的安装步骤 3.1 Windows系统安装步骤 3.2 Linux系统安装步骤 4. 配置Oracle数据库 4.1 设置环境变量(Linux) 4.…...

JavaScript的注释与常见输出方式
注释 源码中注释是不被引擎所解释的,它的作用是对代码进行解释。Javascript 提供两种注释的写法:一种是单行注释,用//起头;另一种是多行注释,放在/*和*/之间。 单行注释: //这是单行注释 多行注释: /*这是 多行 注…...

深入探索Android开发之Java核心技术学习大全
Android作为全球最流行的移动操作系统之一,其开发技能的需求日益增长。本文将为您介绍一套专为Android开发者设计的Java核心技术学习资料,包括详细的学习大纲、PDF文档、源代码以及配套视频教程,帮助您从Java基础到高级特性,再到A…...

vue3 选择字体的颜色,使用vue3-colorpicker来选择颜色
1、有的时候我们会用到颜色的选择器,像element-plus提供了,但是ant-design-vue并没有: 这个暂时没有看到: 但是Ant Design 5的版本有,应该不是vue的。 2、使用第三方提供的vue3-colorpicker:storybook/cli…...

windows C++ 并行编程-使用消息块筛选器
本文档演示了如何使用筛选器函数,使异步消息块能够根据消息的有效负载接受或拒绝消息。 创建消息块对象(例如 concurrency::unbounded_buffer、concurrency::call 或 concurrency::transformer)时,可以提供筛选器函数,用于确定消息块是接受还…...

【mysql技术内幕】
MySQL之技术内幕 1.MVCC模式2. 实现mvcc模式的基础点3.MySQL锁的类型4. 说下MySQL的索引有哪些吧?5. 谈谈分库分表6. 分表后的id咋么保证唯一性呢?7. 分表后非sharding key的查询咋么处理的? 1.MVCC模式 MVCC, 是multi-version concurrency c…...

快递物流单号识别API接口DEMO下载
单号识别API为用户提供单号识别快递公司服务,依托于快递鸟大数据平台,用户提供快递单号,即可实时返回可能的一个或多个快递公司,存在多个快递公司结果的,大数据平台根据可能性、单号量,进行智能排序。 应用…...

Jetpack——Room
概述 Room是谷歌公司推出的数据库处理框架,该框架同样基于SQLite,但它通过注解技术极大简化了数据库操作,减少了原来相当一部分编码工作量。在使用Room之前,要先修改模块的build.gradle文件,往dependencies节点添加下…...