Anchor-free应用一览:目标检测、实例分割、多目标跟踪

news2024/11/16 7:29:37

作者|杨阳@知乎
来源|https://zhuanlan.zhihu.com/p/163266388

本文整理了与Anchor free相关的一些工作。一方面是分享近期在目标检测领域中一些工作,另一方面,和大家一起梳理一下非常火热的网络模型CenterNetFCOS,当我们把他们迁移到分割多目标追踪等其他任务上时,大佬们是如何去设计的。

从去年5月开始,我一直对Anchor-free工作保持着一定的关注。本次借组内的paper reading分享的契机,整理了与Anchor free相关的一些工作。一方面是分享近期在目标检测领域中一些工作,另一方面,和大家一起梳理一下非常火热的网络模型CenterNet、FCOS,当我们把他们迁移到分割、多目标追踪等其他任务上时,大佬们是如何去设计的。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一、anchor free在目标检测中的应用

首先我们要回答为什么要有 anchor?在前几年,物体检测问题通常都被建模成对一些候选区域进行分类和回归的问题。在单阶段检测器中,这些候选区域就是通过滑窗方式产生的 anchor;在两阶段检测器中,候选区域是 RPN 生成的 proposal,但是 RPN 本身仍然是对滑窗方式产生的 anchor 进行分类和回归。

在这里插入图片描述
这里我列出的几种anchor-free 方法,是通过另外一种手段来解决检测问题的。CornetNet通过预测成对的关键点(左上角与右下角)来表征目标框;CenterNetFCOS通过预测物体中心点及其到边框的距离来表征目标框;ExtremeNet是通过检测物体四个极值点,将四个极值点构成一个物体检测框;AutoAssign也是近期的一篇论文,提出一种在anchor free检测器上,正负样本标签的新的分配策略;Point-Set是近期ECCV 2020的一个工作,提出来一个更加泛化的point-based的anchor表示形式,统一了目标检测、实例分割、姿态估计的三个大任务,后面我们会进一步展开。

在这里插入图片描述
首先我们来简单回顾一下FCOS的网络架构,其中C3, C4, C5表示骨干网络的特征图,P3到P7是用于最终预测的特征级别。这五层的特征图后分别会跟上一个head,head中包括了三个分支,分别用于分类、中心点置信度、回归的预测。整体的架构非常简洁,有很多人通过修改FCOS的输出分支,用于解决实例分割、关键点检测、目标追踪等其他任务。

下边我列出来原作者在更新论文版本时,做出的三点细节上的调整,一是使用了新的中心点采样的方式,在判断正负样本时,考虑了不同阶段的步长值,去调整了正样本所处框的大小。而非像FCOS v1中,直接判断其是否落在gt bbox里。这种新的center sampling方式,使得难判别的样本减少,是否使用center-ness branch造成的精度区别也减小了。二是将回归的loss换成了GIoU loss。三是FCOS v2 的不同特征层在回归参数的时候,使用了不同的reg范围(除以了stride)。(而在FCOS v1中,是用过乘以一个可以学习的参数,该参数在FCOS v2有保留,但重要性减小。)

在这里插入图片描述
为了提升fcos的效果,特别考虑到一些不稳定环境,由于传感器噪声或不完整的数据,目标探测器需要考虑定位预测的置信度,有人提出加入一个预测bbox的不确定度的分支。

这里的不确定度是通过预测bbox的四个offset的分布得到的。这里假设每一个示例都是独立的,用多元高斯分布的输出与协方差矩阵的对角矩阵去表征每一个bbox的offset。在FCOS的分类、中心点、回归的三个loss上,新增了一个衡量bbox offset的不确定度的loss。下边我们来具体看一下他的实现方式。

在这里插入图片描述
这里的box offsets我们用 ( l , r , t , b ) (l, r, t, b) (l,r,t,b) 来表示, θ \theta θ是网络的可学习的参数,B的维度是4。 μ B \mu_B μB是bbox的偏置,计算得到的多元高斯分布, ∑ B \sum_B B是之前提到的协方差矩阵的对角矩阵

带入网络设计的衡量bbox offset的不确定度的loss,我们可以着重关注红色线左边的这一项,当预测出的 u k u_k uk与真实的bbox的高斯分布 B x , y , w g B_{x,y,w}^g Bx,y,wg相差很大时,网络会倾向于得到一个很大的标准差 σ k \sigma_k σk也就是说这个时候的不确定度是很大的。当然它后边还有一个类似正则化的约束 σ k \sigma_k σk,去限制 σ k \sigma_k σk不要过大。

在这里插入图片描述
对比FCOS,同样使用ResNet-50的框架,它在coco数据集上AP能提升0.8个点。对比两个loss,其回归情况也是更好的。
在这里插入图片描述
下面我们来看看,《Point-Set Anchors for Object Detection, Instance Segmentation and Pose Estimation》这个point-based的网络,是如何使用回归的思路去统一Object Detection, Instance SegmentationPose Estimation三个大任务的。作者称这是统一这三大任务的第一人。

作者认为,在object detection领域,无论是若干个IOU大于一定阈值的anchor表示正样本,还是用物体的中心点来表示正样本。不论是anchor based或者anchor-free based的方法,对于正样本在原图的定位,都是基于回归的形式直接回归矩形坐标,或者是矩形长宽+矩形中心点offset。Anchor从某种程度上来说,表示的只是一种先验信息,anchor可以是中心点,也可以是矩形,同时它还可以提供更多的模型设计思路,如正负样本的分配,分类、回归特征的选择。所有作者的思路是,能不能提出更加泛化的anchor,泛化的应用于更多的任务中,而不只是目标检测中,并给出一个更好的先验信息。

对于Instance Segmentation和Object Detection,使用最左边的Anchor,其有两个部分:一个中心点和n个有序锚点,在每个图像位置,我们会改变边界框的比例和长宽比来形成一些anchor,这里和anchor-based的方法一样,涉及到一些超参数的设置。对姿态估计中的anchor,使用训练集中最常见的姿态。Object Detection的回归任务比较简单,用中心点或者左上/右下角点回归即可。对于Instance Segmentation来说,作者使用了特定的匹配准则去匹配右图中绿色的Point-set anchor中的anchor points和黄色的gt实例的points,并且转换为回归任务。

右边的三个图分别是将绿色与黄色的点,最近的相连;将绿色的点与最近的边缘相连;最右侧中时作者优化后的方式,对角点采用最近点的方法,根据角点得到的最近四个点将gt的轮廓划分成4个区域。将上边界与下边界上绿色的点,做垂线对应到有效的gt point(若不在区域内,则无效,例如图中的绿色空心点)。

在这里插入图片描述
总的来说,Point-set用它提出的新的anchor的设计方式代替传统的矩形anchor,并在头部附加一个并行的回归分支用于实例分割或姿态估计。图中展示了它的网络架构,和retinanet一样,作者使用了不同尺度的特征层,head包含了用于分类、分割姿态的回归、检测框的回归的子网络。每一个子网络都包含了四个3乘3的、stride为1的卷积层,只在姿态估计任务上使用的FAM模块,和一个输出层。下边的表格中,列出的是输出层的维度,分别对应了三个任务。
在这里插入图片描述
其损失函数非常简单,对分类使用focal loss,对回归任务使用L1 loss。
除了目标归一化和将先验知识嵌入anchor的形状之外,作者也提到了我们如何进一步用anchor去聚合特征,以保证特征变换不变性、并拓展到多阶段学习当中。

  • (1)我们将可变卷积中的可学习偏移量替换为point-based anchor中点的位置。
  • (2)由于人体形状的这个回归,是相对检测更加困难的。一方面是由于它对特征的提取要求非常大,另一方面是不同的关键点之间存在差异。所以作者提出,可以直接使用第一阶段的姿态预测作为第二阶段的anchor(分类、掩模或位姿回归、边界盒回归),使用额外的细化阶段进行姿态估计。

在这里插入图片描述

二、介绍三篇在实例分割领域的模型

它们都参考了FCOS的做法,将目标检测中anchor-free的思想,迁移到了实例分割的任务上。网络的具体细节不会展开讲,这里只会说到他们在解决实例分割任务时,在FCOS的整体架构上做了哪一些调整。

在这里插入图片描述
首先讲到的是CenterMask,把这个放在最前面是因为他的想法非常直接,这个结构可以理解成 FCOS + MaskRCNN 的 mask的分支。

在这里插入图片描述
我们可以将它和FCOS做一下对比,输入图像通过 FCOS 得到目标框,这一部分是一样的。之后类似 MaskRCNN,用 ROIAlign 把对应的区域 crop 出来,resize 到 14 x14 ,最后经过 mask branch 计算 loss。想法非常简单。

在这里插入图片描述

第二篇是EmbedMask,在保证近似精度的基础上,它的最快速度可以达到MaskRCNN的三倍。它采取了one-stage方法,相当于直接使用语义分割得到分割结果之后,在使用聚类或者一些手段将同一个实例的整合到一起,得到最终实例的分割结果
在这里插入图片描述
整个网络的结构如上图所示,还是一个FPN的结构,在分辨率最大的特征曾P3使用pixel的embedding,将每个pixel都embedding成一个D长度的向量,因此最后得到的是H_W_D的特征图。然后依次对每个特征图P3、P4、P5、P6、P7使用proposal head,也就是传统的目标检测的head,再其中的改进就是,对于每个proposal也都embedding成一个D长度的向量。使用一个margin来定义两个embedding之间的关联程度,如果小于这个embedding,就认为这个pixel和这个proposal是同一个instance。但是呢,文中提出使用一个人为定义的margin,会导致一些问题,因此呢,本文就提出了一个learnable margin,让网络自动学习每个proposal的margin,就如结果图中所示的proposal margin那条路径。对比FCOS,EmbedMask加入了图中蓝色的模块。

虽然EmbedMask和CenterMask等工作都是基于一阶段的检测算法,来做实例分割,但是它的核心要点,其实并没有变,都是基于一个足够好的detector来从proposal里面生成mask。事实证明这非常有效,基于一个足够好的detector的实例分割方法不仅仅有利于找到更多的mask,同时这些mask的生成反过来会提升detector本身的效果。所以你可以看到这两个实例分割的box AP都要比FCOS要高,当然这也是必然。

在这里插入图片描述
第三篇是PolarMask,它也是基于FCOS,把实例分割统一到了FCN的框架下。PolarMask提出了一种新的instance segmentation建模方式,在将极坐标的360度等分成36分,通过预测这36个方向上,边缘到极坐标中心的距离,从而得到物体的轮廓。

在这里插入图片描述
在这里插入图片描述

三、对多目标追踪领域的一些关注

这里主要对比了两篇基于CenterNet的扩展出的工作。首先简单介绍一下MOT(Multi-Object Tracking)的任务,它需要对视频中的每一帧进行物体检测,并对每一个物体赋予一个id,去追踪这个目标。

在这里插入图片描述
CenterTrack是CenterNet的原作者做的工作,在将目标检测任务扩展到多目标检测上时,作者通过追踪物体的中心点,来解决追踪问题。多目标检测任务有两个关键,一是我们需要把每一帧当中的物体检测出来,这里包括了遮挡物体;二是我们需要在时间维度上,对物体做id的匹配。
在这里插入图片描述
下边这张图中的红色区域是为了解决Track任务时,输入了t时刻的图像 I t I^t It、t-1时刻的图像 I t − 1 I^{t-1} It1以及在t-1时刻的检测出的所有物体 T t − 1 T^{t-1} Tt1,这里的红色区域是不同于目标检测任务的,新增了四个通道(其中三个通道是图像的输入、还有一个通道的计算会在后边展开)。

在输出部分,网络除了输出检测的中心峰值点的heatmap预测长宽的特征图之外,网络还输出了一个2通道的offset,这里的offset表示的是两帧之间,物体的移动距离

在这里插入图片描述
左边是网络的输入,右边是网络的输出。在数学上的表示I 为的是图像输入、T中的b表示的是bbox,右边分别是检测的中心峰值点、长宽的特征图、物体移动的偏移量。

在这里插入图片描述
以上是在网络训练时,其对应中心峰值点、长宽的特征图、物体移动的偏移量的三个损失函数的具体表现形式。在解决中心点预测的任务是,这里采用的是focal loss,x、y表示了点在heatmap上的位置,c是类别。Y是属于0,1的峰值图, R q R^q Rq渲染了高斯形状的凸起的峰值,对每一个位置,如果它在某个类别数存在中心点,在对应的channel上就会形成一个峰,我们对每个位置取出最大的坡高。其中p表示中心点,q为位置。我们得到这些最大坡高之后,放到1个通道的heatmap中,做为网络输入的一部分。和上一帧的三通道的图片,就组成了前面说的,在解决tracking任务时,新增的4个channel的输入。

对长宽和偏移量的损失计算,用的就是简单的L1 loss。有了足够好的偏移量预测,网络就可以去关联前一时刻的目标。对于每个检测位置p,我们将它与之前最近的物体赋予同一个id,如果在一个半径κ中,没有前一个时刻的目标,我们就生成一个新的追踪。
在这里插入图片描述
FairMOT也是基于CenterNet的工作,和CenterTrack是同期的。与CenterTrack引入目标框在前后帧中的移动距离偏置不同,它借鉴了重识别的想法,在检测的分支上,加入了一个Re-ID的分支,它将目标的id识别的embedding作为分类任务。在训练时,所有训练集中具有相同id的所有对象实例都被视为一个类。通过给特征图上的每一个点,附上一个128维的Embedding向量,最后将这个向量映射到每一个类的分数p(k)。其中k是类别数(即出现过的id), L i ( k ) L^i(k) Li(k) 是gt的one-hot的编码,最后用softmax 计算loss。

2020-7-24更新:可能有人会对这里的embedding映射到分类的做法,提出一些质疑,当在后续帧中出现大量新的人的时候,FairMot能给这些新的人赋予一正确的新id吗?作者在解决这个问题的时候,在训练的时候采用的是分类loss,测试阶段采取用cos距离做判断。并且,当reid不可靠的时候,就用bbox IOU来匹配。具体地,对 reid embedding没匹配上bbox,用IOU得到前一帧中可能的追踪框,计算他们之间的相似度矩阵,最后用匈牙利算法得到最后的结果

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/677051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux网络-数据链路层,MAC帧解析

目录 数据链路层VS网络层 以太网概念 以太网的帧格式(报文格式)(也可以称之为MAC帧) MAC地址的概念 MAC帧格式 局域网通信原理 MTU MTU说明 MTU对IP协议的影响 MTU对UDP协议的影响 MTU对TCP协议的影响 数据链路层VS网…

【Linux】应用层协议:HTTP和HTTPS

每个人都可以很喜欢每个人,但喜欢治不了病,喜欢买不了东西,喜欢不能当饭吃,喜欢很廉价… 文章目录 一、HTTP协议1.URL1.1 URL的组成1.2 urlencode && urldecode 2.HTTP协议格式2.1 http请求和响应的格式2.2 通过代码来进行…

[Eigen中文文档] 求解稀疏线性系统

文档总目录 本文目录 稀疏求解器列表内置直接求解器内置迭代求解器外部求解器的包装器 稀疏求解器概念计算步骤基准测试例程 英文原文(Solving Sparse Linear Systems) 在Eigen中,有多种方法可用于求解稀疏系数矩阵的线性系统。由于此类矩阵的特殊表示&#xff0c…

零基础速成simulink代码生成——结合CANOE的DBC文件CAN报文代码生成 移植到硬件4

零基础速成simulink代码生成——结合CANOE的DBC文件CAN报文代码生成 移植到硬件4 本次我们将讲解如何将代码放到嵌入式硬件上运行,本次例子将dbc文件导入simulink中,生成代码,不需要我们自己实现数据库的内容。 导入DBC文件 新建一个simulink模型 MCU_CAN.slx simulink具…

开源计算机视觉库OpenCV详解

目录 1、概述 2、OpenCV详细介绍 2.1、OpenCV的起源 2.2、OpenCV开发语言 2.3、OpenCV的应用领域 3、OpenCV模块划分 4、OpenCV源码文件结构 4.1、根目录介绍 4.2、常用模块介绍 4.3、CUDA加速模块 5、OpenCV配置以及Visual Studio使用OpenCV 6、OpenCV和OpenGL的区…

SpringBoot常用操作

SpringBoot常用操作 SpringBoot启动过程 1. 生成一个SpringApplication的对象1. webApplicationType 推测web应用类型(NONE、REACTIVE、SERVLET)2. 从spring.factories中获取BootstrapRegistryInitializer对象3. initializers 从spring.factories中获…

A brief taste of JIFA

JIFA 是阿里贡献给 Eclipse 的一个适用于 Java 应用的问题诊断应用。 它以图形化的方式展示 Heap Dump AnalysisGC Log AnalysisThread Dump Analysis 因为云环境/生产环境的一些限制,应用的问题可能不能被就地分析,所以Jifa provides a web solution…

关于运动模糊问题的分析及处理方法

1、问题背景 前段时间有做一个化妆镜项目,就是一面镜子上装有一个摄像头,用户对着镜子化妆时,可同时用来采集人脸信息,分析人脸用的。客户反馈抓拍静止的人脸图像时,画面正常,而当人脸稍微运动时&#xff…

java springboot整合MyBatis实现分页查询以及带条件的分页查询

之前的文章 java springboot整合MyBatis做数据库查询操作操作了springboot整合MyBatis,然后简单做了个按id查询的操作 那么 我们按上文搭建起的环境继续 我们直接在staffDao接口中声明一个分页函数 Select("select * from staff limit #{page},#{pageSize}&q…

【Vue】Vite 组件化开发

文章目录 组件化开发一、组件化开发思想二、Vue 组件的构成2.1 组件组成结构2.2 组件 template 节点2.2.1 在 template 中使用指令2.2.2 在 template 中定义根节点 2.3 组件的 script 模板 三、组件的基本使用3.1 组件的注册3.1.1 全局组件注册3.1.2 局部组件注册 3.2 组件样式…

ffmpeg命令参数

主要参数 -i 设定输入流 -f 设定输出格式(format) -ss 开始时间 -t 时间长度视频参数 -vframes 设置要输出的视频帧数 -b 设定视频码率 -b:v 视频码率 -r 设定帧率 -s 设定画面的宽与高 -vn 不处理视频 -aspect aspect 设置横纵比4:3 或16:9 或1.333或…

软件项目管理 第三章软件项目的启动过程课后习题参考答案——主编:李冰、张桥珍、刘玉娥

第三章 软件项目的启动过程 课后习题参考答案 1.选择题 (1)乙方在项目初始阶段的主要任务不包含以下哪一项(D)。 A. 项目分析 B. 竞标 C. 合同签署 D. 合同管理 (2)项目章程中不…

Spring Boot Configuration Annotation Processor not configured 问题解决

目录 问题抛出: ConfigurationProperties 问题抛出: 进行Spring Boot配置文件部署时,发出警告Spring Boot Configuration Annotation Processor not configured,但是不影响运行。 不过有时候springboot项目出错了并且排除了所有…

【裸机开发】中断系统 —— 中断向量表(设置中断向量偏移的原因)

之前的LED驱动不存在中断,也就不包含中断的初始化。如果程序包含了中断,我们应还需要初始化哪些内容?要解决这个问题,我们需要先了解一个中断系统包含了哪些内容。 ① 中断向量表:描述中断对应的中断服务函数&#xf…

C++笔记之stack、queue、priority_queue、deque

code review! C笔记之stack、queue、priority_queue、deque 文章目录 C笔记之stack、queue、priority_queue、deque一.cppreference介绍1.stack2.queue3.priority_queue4.deque 二.容器适配器三.stack详解1.创建一个不包含任何元素的 stack 适配器,并采用默认的 de…

Debian 12中再次安装R软件

上篇博客(地址:https://blog.csdn.net/my1114/article/details/131347147?spm1001.2014.3001.5501)中所述的,在Debian12中按默认方式编译安装R软件,有一定的局限性。 如下图所示: 因此,本…

Redis入门(2)-字符串

String是Redis最基础、最常见的类型,string类型的value中可存放任意数据,包括数值型、二进制的图片、音频、视频、序列化对象等。一个String类型的value最大是512M. 1.getset k v 若key存在返回之前的值,若不存在返回nil 2.strlen key 返…

【面试】标准库相关题型(三)

文章目录 1. unordered_map底层实现原理1.1 散列表1.2 STL 中的 unordered_map 的实现1.3 unordered_map 2. 迭代器底层实现原理及种类2.1 主要作用2.2 底层原理2.3 迭代器类型属性 3. 迭代器失效3.1 容器类别3.2 失效情况3.3 C11容器类别 4. STL容器的线程安全4.1 背景知识4.2…

Git分支使用方法

目录 前言 一、查看可用分支 二、创建新分支 三、切换到新分支 四、在新分支上进行工作 五、提交更改 六、切换回主分支 前言 分支是指在同一个代码仓库中的不同版本线。它们可以被用来同时开展不同的开发任务、修复bug或实现新功能,而不会影响到主要的代码…

【数据结构】栈和队列的应用

🎇[数据结构]栈和队列的应用🎇 🌟 正式开始学习数据结构啦~此专栏作为学习过程中的记录🌟 文章目录 🎇[数据结构]栈和队列的应用🎇🍰一.栈在括号表达式中的应用🚀1.原理&#x1f680…