FCOS 论文学习

1. 解决了什么问题?

之前的目标检测器如 RetinaNet、SSD、YOLOv3 都依赖于 anchors。基于 anchors 的检测器有如下三个缺点:

  • 检测表现对于 anchors 的大小、宽高比和数量等超参数很敏感;
  • 即使精心设计了 anchors,但由于大小和宽高比都是固定的,检测器很难处理形状变化很大的物体,比如小目标;
  • 为了提高召回率,基于 anchor 的检测器会在输入图像上放置大量的 anchor boxes。训练时,这里面的大多数都是负样本,造成

正负样本不均衡;

  • Anchor boxes 会带来复杂的计算,如计算 anchor box 和 gt box 的 IOU。

之前的基于 FCN 的框架有以下几个问题:

  • 全卷积网络在语义分割、深度估计、关键点检测等任务上效果不错,唯独目标检测任务很少用全卷积、逐像素预测的架构;
  • DenseBox 利用了全卷积网络的架构,但是在图像金字塔上完成检测,与 FCN 思想相悖,对于重叠目标的检测效果不好,无法分辨重叠区域内像素属于哪个边框。

2. 提出了什么方法?

将目标检测任务以逐像素预测的方式解决,提出了一个无需 anchor、无需 proposal 的检测方法。

2.1 全卷积单阶段目标检测器

主干 CNN 网络的第 i i i层特征图记做 F i ∈ R H × W × C F_i\in \mathbb{R}^{H\times W\times C} FiRH×W×C s s s是到当前层的总步长。输入图像的 ground-truth 边框记做 { B i } \lbrace B_i\rbrace {Bi},其中 B i = ( x 0 ( i ) , y 0 ( i ) , x 1 ( i ) , y 1 ( i ) , c ( i ) ) ∈ R 4 × { 1 , 2 , . . . , C } B_i=(x_0^{(i)},y_0^{(i)},x_1^{(i)},y_1^{(i)},c^{(i)})\in \mathbb{R}^4 \times \lbrace 1,2,...,C\rbrace Bi=(x0(i),y0(i),x1(i),y1(i),c(i))R4×{1,2,...,C}。这里 ( x 0 ( i ) , y 0 ( i ) ) (x_0^{(i)},y_0^{(i)}) (x0(i),y0(i)) ( x 1 ( i ) , y 1 ( i ) ) (x_1^{(i)},y_1^{(i)}) (x1(i),y1(i))表示边框左上角和右下角的坐标。 c ( i ) c^{(i)} c(i)是该边框内目标的类别, C C C是类别数。

特征图 F i F_i Fi上的每个点 ( x , y ) (x,y) (x,y)可以映射回输入图像的坐标 ( ⌊ s 2 ⌋ + x s , ⌊ s 2 ⌋ + y s ) (\lfloor \frac{s}{2}\rfloor+xs,\lfloor \frac{s}{2}\rfloor+ys) (⌊2s+xs,2s+ys),位于 ( x , y ) (x,y) (x,y)感受野的中心附近。Anchor-based 检测器将输入图像上的每个位置看作 anchor boxes 的中心点,然后根据这些 anchor boxes 回归出目标框,而 FCOS 是直接回归目标框。FCOS 将每个位置都看作为训练样本,这与语义分割里面的 FCN 一样。
在这里插入图片描述

如果位置 ( x , y ) (x,y) (x,y)落在任意一个 ground-truth 框内,则认为它是正样本,该位置的类别标签 c ∗ c^* c就是 ground-truth 框的类别。否则,该位置就是负样本,类别标签 c ∗ = 0 c^*=0 c=0(背景类)。此外,该位置还有一个 4D 向量 t ∗ = ( l ∗ , t ∗ , r ∗ , b ∗ ) \mathbf{t}^*=(l^*,t^*,r^*,b^*) t=(l,t,r,b)作为回归目标。 l ∗ , t ∗ , r ∗ , b ∗ l^*,t^*,r^*,b^* l,t,r,b分别是该位置到边框四条边的距离。如果一个位置落在多个边框内,则认为它是模糊样本。选择面积最小的边框作为回归目标。通过多层级预测,模糊样本数量能大幅降低,因此很难影响检测表现。如果一个位置 ( x , y ) (x,y) (x,y)与边框 B i B_i Bi关联,则该位置的训练回归目标写作:
l ∗ = x − x 0 ( i ) , t ∗ = y − y 0 ( i ) l^*=x-x_0^{(i)},\quad\quad t^*=y-y_0^{(i)} l=xx0(i),t=yy0(i)
r ∗ = x 1 ( i ) − x , b ∗ = y 1 ( i ) − y r^*=x_1^{(i)}-x,\quad\quad b^*=y_1^{(i)}-y r=x1(i)x,b=y1(i)y

FCOS 能利用尽可能多的前景样本来训练回归任务,而基于 anchor 的检测器只会将与 ground-truth 框 IOU 足够大的样本作为正样本。
在这里插入图片描述

网络输出

最后一层预测一个 80 80 80维向量 p p p的分类标签,以及一个 4 4 4维的向量 t = ( l , t , r , b ) \mathbf{t}=(l,t,r,b) t=(l,t,r,b)的边框坐标。它没有训练一个多类别分类器,而是训练 C C C个两类别的分类器。在主干网络特征图后面,加了4个卷积层,分别用于类别预测和坐标回归。因为回归的目标总是正数,故而在回归分支上使用了 exp ⁡ ( x ) \exp(x) exp(x)将任意实数映射到 ( 0 , ∞ ) (0,\infty) (0,)范围。FCOS 的输出变量要比基于 anchor 的检测器少了 9 × 9\times 9×,因为基于 anchor 的检测器一般会在每个位置使用 9 9 9个 anchor boxes。

损失函数

损失函数定义为:
L ( { p x , y } , { t x , y } ) = 1 N p o s ∑ x , y L c l s ( p x , y , c x , y ∗ ) + λ N p o s ∑ x , y I { c x , y ∗ > 0 } L r e g ( t x , y , t x , y ∗ ) L(\lbrace p_{x,y}\rbrace,\lbrace t_{x,y}\rbrace)=\frac{1}{N_{pos}}\sum_{x,y}L_{cls}(p_{x,y},c^*_{x,y})+\frac{\lambda}{N_{pos}}\sum_{x,y}\mathbb{I}_{\lbrace c^*_{x,y}>0\rbrace L_{reg}(t_{x,y},t^*_{x,y})} L({px,y},{tx,y})=Npos1x,yLcls(px,y,cx,y)+Nposλx,yI{cx,y>0}Lreg(tx,y,tx,y)
L c l s L_{cls} Lcls是 focal loss, L r e g L_{reg} Lreg是 IOU 损失。 N p o s N_{pos} Npos是正样本个数, λ = 1 \lambda=1 λ=1是平衡 L r e g L_{reg} Lreg的权重。对特征图 F i F_i Fi所有的点进行计算求和。 I { c i ∗ > 0 } \mathbb{I}_{\lbrace c_i^*>0\rbrace} I{ci>0}是指标函数,当 c i ∗ > 0 c^*_i>0 ci>0则为 1 1 1,不然为 0 0 0

推理

FCOS 推理很直接。给定输入图像,经过网络得到特征图 F i F_i Fi上每个位置的分类得分 p x , y p_{x,y} px,y和回归目标 t x , y t_{x,y} tx,y,将 p x , y > 0.05 p_{x,y}>0.05 px,y>0.05的当作正样本,进而得到预测框。

2.2 FPN 多层级预测

有两类问题可以通过 FPN 多层级预测得到解决。

  • CNN 最后一层的输出特征图如果步长很大,会造成很低的召回率。对于 FCOS,看上去似乎其召回率要低于 anchor-based 方法,因为大步长可能造成有些物体无法出现在最后一层特征图上。但本文发现,FCOS 的召回率并不低。此外,有了 FPN 加持,其召回率能进一步得到提升。
  • Ground-truth 边框重叠可能引起一定歧义,重叠区内的一个点应该属于哪个目标框?通过多层级预测,这类歧义可以被有效解决。

根据 FPN,我们可以在不同层级特征图上检测出不同大小的目标。可以使用的特征图有 { P 3 , P 4 , P 5 , P 6 , P 7 } \lbrace P_3,P_4,P_5,P_6,P_7\rbrace {P3,P4,P5,P6,P7} P 3 , P 4 , P 5 P_3,P_4,P_5 P3,P4,P5是对主干网络的 C 3 , C 4 , C 5 C_3,C_4,C_5 C3,C4,C5特征图使用 1 × 1 1\times 1 1×1卷积和 top-down 连接得到。对 P 5 P_5 P5使用一个步长为 2 2 2的卷积得到 P 6 P_6 P6,再对 P 6 P_6 P6使用一个步长为 2 2 2的卷积得到 P 7 P_7 P7。因此 P 3 , P 4 , P 5 , P 6 , P 7 P_3,P_4,P_5,P_6,P_7 P3,P4,P5,P6,P7的步长分别是 8 , 16 , 32 , 64 , 128 8,16,32,64,128 8,16,32,64,128

Anchor-based 检测器会为不同的特征层级分配不同大小的 anchor boxes,而 FCOS 直接约束每个层级的边框回归大小的范围。

  • 首先计算所有的特征层级上每个位置的回归目标 l ∗ , t ∗ , r ∗ , b ∗ l^*,t^*,r^*,b^* l,t,r,b
  • 然后,如果一个位置满足 max ⁡ ( l ∗ , t ∗ , r ∗ , b ∗ ) > m i \max(l^*,t^*,r^*,b^*)>m_i max(l,t,r,b)>mi max ⁡ ( l ∗ , t ∗ , r ∗ , b ∗ ) < m i − 1 \max(l^*,t^*,r^*,b^*)<m_{i-1} max(l,t,r,b)<mi1,它就设为负样本,不用再回归边框。

m i m_i mi是某一特征层级 i i i回归的最大距离。本文, m 2 , m 3 , m 4 , m 5 , m 6 , m 7 m_2,m_3,m_4,m_5,m_6,m_7 m2,m3,m4,m5,m6,m7分别设为 0 , 64 , 128 , 256 , 512 , ∞ 0,64,128,256,512,\infty 0,64,128,256,512,。这样,不同大小的物体会分到不同的特征层级上,大多数的重叠物体的尺度也不相同。如果一个位置仍然被分配到了多个 ground-truth 边框内,我们直接选择面积最小的 ground-truth 框作为目标。

不同的特征层级共享 heads,不仅可以节省了参数,也能提高表现。但是,作者发现不同特征层回归不同的大小范围,因此对不同特征层级使用相同配置的 heads 并不合理。于是,作者使用了 exp ⁡ ( s i x ) \exp(s_ix) exp(six)代替了 exp ⁡ ( x ) \exp(x) exp(x) s i s_i si是一个可训练的标量,自动调节 P i P_i Pi特征层级的 exp ⁡ \exp exp函数,可提高检测表现。

2.3 Center-ness

仍然会出现许多的低质量预测框,这些低质量预测框的位置距离目标中心点较远。作者提出了一个简单有效的办法来抑制这些低质量预测框。增加了一个分支来预测位置的 center-ness,它只有一层,与分类分支并行。Center-ness 表示某个位置到其对应的目标中心点的归一化距离。给定某位置的回归目标 l ∗ , t ∗ , r ∗ , b ∗ l^*,t^*,r^*,b^* l,t,r,b,center-ness 目标定义为:
centerness ∗ = min ⁡ ( l ∗ , r ∗ ) max ⁡ ( l ∗ , r ∗ ) × min ⁡ ( t ∗ , b ∗ ) max ⁡ ( t ∗ , b ∗ ) \text{centerness}^*=\sqrt{\frac{\min(l^*,r^*)}{\max(l^*, r^*)}\times \frac{\min(t^*,b^*)}{\max(t^*, b^*)}} centerness=max(l,r)min(l,r)×max(t,b)min(t,b)

使用 \sqrt{} 来降低 center-ness 衰减的速度。Center-ness 的范围在 0 0 0 1 1 1之间,可用 BCE 损失训练,该损失加到上面损失函数里面。测试时,将预测 center-ness 得分和相应的分类得分乘起来,得到最终得分。Center-ness 可以降低远离目标中心点的边框的得分。这样 NMS 就可过滤掉这些低质量边框,提升检测表现。
在这里插入图片描述

如果不用 center-ness 得分,可以将 ground-truth 边框的中间一块区域当作正样本,但这就需要一个超参数了。

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

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

相关文章

EasyCVR告警类型设置后首页需要刷新才能更新的问题优化

EasyCVR视频融合平台基于云边端一体化架构&#xff0c;可支持多协议、多类型设备接入&#xff0c;包括&#xff1a;NVR、IPC、视频编码器、无人机、车载设备、智能手持终端、移动执法仪等。平台具有强大的数据接入、处理及分发能力&#xff0c;可在复杂的网络环境中&#xff0c…

Zabbix 自动发现及注册

1、依次选择 Configuratio、Discovery、Create discovery rule&#xff08;配置、自动发现、创建发现规则&#xff09; 创建客户端发现规则 2、zabbix客户端安装 agent zabbix客户端一键安装脚本 脚本参考链接 #!/bin/bash #Zabbix-Agent 5.0Zabbix_Service192.168.63.20#安…

【PHP面试题44】PHP5的版本和PHP7之间有哪些区别

文章目录 一、前言二、底层调整2.1性能提升2.2 新的引擎2.3 数据类型改进2.4 错误处理改进2.5 语言特性增加 三、应用层差异3.1 兼容性3.2 类和方法改进3.3 错误处理机制3.4 性能优化3.5 新的扩展支持 四、一些语法糖示例4.1 标量类型声明示例4.2 新增了Spaceship操作符&#x…

win11中的pagefile.sys

在C盘系统下&#xff0c;有一个命名为pagefile.sys的文件占用C盘太大的空间&#xff0c;不少用户怕删除pagefile.sys文件之后会对系统造成影响&#xff0c;而不少用户想要将pagefile.sys文件移动到D盘中。那么pagefile.sys是什么文件&#xff1f;Win10系统下pagefile.sys文件太…

【C++】list的模拟实现

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

5. MySQL - JDBC SQL 注入 博客系统(万字详解)

目录 1. 介绍 2. 使用 JDBC 连接数据库 2.1 如何使用 JDBC 连接数据库 2.2 导入的各个类 2.3 DataSource 对象的创建 2.4 从 DataSource 对象中得到 Connection 对象 2.5 创建 Statement 对象 2.6 从 ResultSet 中遍历每行结果&#xff0c;从每行中获取每列的值 2.7 代…

EIK+Filebeat+Kafka

目录 Kafka 概述 为什么需要消息队列&#xff08;MQ&#xff09; 使用消息队列的好处 消息队列的两种模式 Kafka 定义 Kafka 简介 Kafka 的特性 Kafka 系统架构 Partation 数据路由规则&#xff1a; 分区的原因 部署 kafka 集群 1.下载安装包 2.安装 Kafka 修改配…

B072-项目实战-用户模块--前台登录 三方登录

目录 前台登录-账号登录前端完成左上角显示用户信息配置前置拦截器、后置拦截器和不受限资源拦截器 三方登录-微信登录概述流程图用法代码实现步骤分析:实现准备代码前端login.htmlcallback.html 后端LoginController-微信登录LoginServiceImpl-微信登录解决回调域名不能跨域绑…

安达发|某大厂使用APS计划排程真实成功案例

在很多群里、朋友圈、公众号上可以看到&#xff0c;很多精益咨询老师认为&#xff0c;不仅ERP不啥用&#xff0c;APS更是无聊之举&#xff0c;而且肯定是用不好的。但&#xff0c;事实上可能还真不是这样的。 一个深圳的客户&#xff0c;用了APS以后&#xff0c;不仅装配的齐套…

桥梁监测需要哪些设备?

随着我国经济的发展&#xff0c;我国桥梁建设也迈上了新的台阶。截至2022年底&#xff0c;我国的公路桥梁总数达到了103.32万座。然而&#xff0c;随着在役桥梁使用时间的增长&#xff0c;承载能力受到荷载、环境以及结构退化等因素的影响&#xff0c;桥梁安全问题日益凸显。桥…

vue3和gin框架实现简单的断点续传

vue3和gin框架实现简单的断点续传 前端代码 Test.vue <template><div><inputtype"file"ref"uploadRef"change"upload"multiple/><templatev-for"item in fileList":key"item.key"><br><…

spring复习:(39)注解方式的ProxyFactoryBean

一、定义接口 package cn.edu.tju.study.service;public interface MyService {void myMethod(); }二、定义实现类&#xff1a; package cn.edu.tju.study.service;public class MyServiceImpl implements MyService{Overridepublic void myMethod() {System.out.println(&qu…

Redis 读写分离 使用redisTemplate执行lua脚本时,报错处理

项目框架说明 项目配置 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.4</version></parent>....<dependency><groupId>org.springfra…

(学习笔记-TCP基础知识)TCP与UDP区别

UDP UDP不提供复杂的控制机制&#xff0c;利用IP提供面向[无连接]的通信服务。 UDP协议非常简单&#xff0c;头部只有8个字节(位)&#xff0c;UDP的头部格式如下&#xff1a; 目标和源端口&#xff1a;主要是告诉UDP协议应该把报文发给哪个进程包长度&#xff1a;该字段保存了…

TinyKv流程梳理三

split流程 处理协程启动 func (bs *Raftstore) startWorkers(peers []*peer) {ctx : bs.ctxworkers : bs.workersrouter : bs.routerbs.wg.Add(2) // raftWorker, storeWorkerrw : newRaftWorker(ctx, router)go rw.run(bs.closeCh, bs.wg)sw : newStoreWorker(ctx, bs.store…

基于Web API drap事件的简单拖拽功能

基于Web API drap事件的简单拖拽功能 效果示例图代码示例 效果示例图 代码示例 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style type"text/css">* {padding: 0px;margin: 0px;box-s…

uniapp动态获取列表中每个下标的高度赋值给另一个数组(完整代码附效果图)

uniapp实现动态获取列表中每个下标的高度&#xff0c;赋值给另一个数组。 先看效果图&#xff1a; 完整代码&#xff1a; <template><div class""><div class"">我是A列表&#xff0c;我的高度不是固定的</div><div class&qu…

MySQL 坐标批量计算及优化

文章目录 1、坐标计算2、优化 现在有一个需求&#xff0c;就是找出距离某用户最近的一些点&#xff0c;一种实现方法就是调用地图的api来计算筛选&#xff0c;另外一种就是在数据库中计算&#xff0c;考虑到地图api有并发量限制&#xff0c;所以选用数据库计算的方式。 1、坐标…

ThunderScope开源示波器

简介 4CH&#xff0c;1GSa/S 开源示波器。前端很简洁&#xff0c;BUF802LMH6518&#xff0c;ADC是HMCAD1511&#xff0c;用Xilinx A7 FPGA进行控制&#xff0c;数据通过PCIE总线传输到上位机处理。目前这个项目已经被挂到了Xilinx官网&#xff0c;强。 设计日志&#xff1a;h…

Unity自定义后处理——Vignette暗角

大家好&#xff0c;我是阿赵。   继续说一下屏幕后处理的做法&#xff0c;这一期讲的是Vignette暗角效果。 一、Vignette效果介绍 Vignette暗角的效果可以给画面提供一个氛围&#xff0c;或者模拟一些特殊的效果。 还是拿这个角色作为底图 添加了Vignette效果后&#xff0…