文章目录

  • 1 FCOS是什么
    • 1.1 核心思想
    • 1.2 Anchor-Based缺点
    • 1.3 FCOS优点
  • 2 FCOS 网络总解
    • 2.1 初始版本网络结构
    • 2.2 分支改进后网络结构
    • 2.3 损失函数
  • 3 正样本、负样本、模糊样本的定义
  • 4 特征图上的点映射回原图
  • 5 锚点回归目标值
  • 6 模糊样本的处理
  • 7 Center-ness分支
  • 8 后续改进
    • 8.1 center sampling
    • 8.2 centerness 分支的 centerness计算
    • 8.3 regression分支的loss
    • 8.4 bbox loss weight
    • 8.5 norm on bbox
    • 8.6 开发板上部署时优化策略
  • 9 感谢链接

1 FCOS是什么

FCOS发表于ICCV 2019,是常用的无需锚框(先验框、anchor)的目标检测算法之一。

1.1 核心思想

核心思想:将铺设锚框变为铺设锚点,进行物体检测。

所谓铺设锚框,又称为Anchor-Based,是指在输出特征图上的每个像素的位置,放置几个预先定义的anchor框,在网络训练过程中,对这些anchor框进行分类与回归。
通过GT框和这些anchor框计算IoU,依据设定的阈值条件来定义正负样本,典型的有YOLOv3。

所谓铺设锚点,又称为Anchor-free,如下图所示,将原有的 对锚框进行分类与回归,变为对锚点进行分类与回归,其中回归是预测锚点到检测(GT)框上下左右四条边界的距离,典型的有FCOS。

1.2 Anchor-Based缺点

  • Anchor-Based方式,检测性能对于anchor的大小、数量、长宽比 都非常敏感,通过改变这些超参数Retinanet在COCO benchmark上面提升了4%的MAP。
  • 固定size和aspect ratio的anchor损害了检测器的普适性,导致对于不同任务,anchor可能需要重新设置大小和长宽比。
  • 为了达到更高的召回率(查全率),需要生成大量的anchor(FPN约18万个),但是大部分的anchor在训练时标记为负样本(negative),造成了样本不均衡问题。
  • 在训练中,需要计算所有anchor与真实框的IoU,这样会消耗大量内存和计算资源。

1.3 FCOS优点

  • 检测问题被统一到 FCN-solvable 的问题,可以简单地重用其他任务的idea,如语义分割。
  • anchor-free方式,不需要像anchor-based那样大量调整参数,使训练更为简单。
  • 由于不需要计算IoU,节省了大量算力和内存。
  • 提出了一些关于交叠区域的解决方法和思考。
  • 模型部署会受到两种限制,一种是计算量的限制,一种是I/O 带宽的限制。anchor-free方式相比于anchor-based方式,对部署更友好一些。

2 FCOS 网络总解

2.1 初始版本网络结构

早期的FCOS网络结构如下图所示:

FCOS采用FPN结构,backbone的C3、C4、C5特征层作为FPN的输入,FPN生成P3,P4,P5,P6,P7特征图,送入后续的检测头Head。

每个Head包含3个分支:

  • classification分支:预测类别,图中的C表示类别数,相当于C个二分类
  • regression分支:回归位置,图中的4表示:l,t,r,b,预测锚点到检测框上下左右四条边界的距离
  • center-ness:中心度,一个锚点对应一个中心度,用于锚点相对于检测框中心性的判断

在检测子网络Head中,分类分支和回归分支都先经过了4个卷积层进行了特征强化。

早期版本,在分类分支中,既包含 正、负样本锚点的 类别预测分支,又包含正、负样本锚点中心性判断的center-ness分支,用来强化检测结果;

回归分支 用来回归正样本锚点到检测框上、下、左、右四个边界的距离 。

2.2 分支改进后网络结构

center-ness分支,早期版本是和classification分支一起,如上图所示,后来大家发现center-ness分支和regression分支一起效果更好,如下图所示。

感谢 太阳花的小绿豆 画的更详细的网络结构图:

2.3 损失函数

以最新版本损失函数为例,Head总共有三个输出分支:Classification、Regression和Center-ness。故损失由分类损失LclsL_{cls}Lcls​、定位损失LresL_{res}Lres​以及center-ness损失LctrnessL_{ctrness}Lctrness​三部分共同组成:

分类损失LclsL_{cls}Lcls​采用 BCELoss + Focal Loss ,计算损失时所有样本都会参与计算(正样本和负样本)。
定位损失LresL_{res}Lres​采用GIoU loss(早期采用 IoU loss),计算损失时只有正样本参与计算。
center-ness损失LctrnessL_{ctrness}Lctrness​采用 BCELoss,计算损失时只有正样本参与计算。

更详细的centerness分支可在第7节中看到。

3 正样本、负样本、模糊样本的定义

使用候选框进行目标检测时,也就是anchor_based方式,候选框中是否包含目标就是判断正负样本的的准则。
有目标的就是正样本,没有目标的就是负样本。

对于使用anchor_free方式的FCOS,它是把特征图上的每个点作为一个样本,如果这个点落在任何一个GT框内,它就是正样本,否则它就是负样本。

在正样本中,存在一个点落在多个GT框中的情况,如下图所示,这个点称之为模糊样本(ambiguous)。

此时,有两个问题:

  • 特征图上的点怎么知道它是在原图上的GT框内还是外呢?
    回答:见第4节分析。
  • 一个点恰好只落在一个框内,此时它就去负责预测这个GT框,那模糊样本预测谁呢?怎么处理呢?
    回答:一个点落在多个GT框中,取最小的那个GT框作为回归目标,此外,利用FPN进行多尺度预测会极大程度上减少这种情况的发生。具体细节在第6节介绍。

下面分别回答。

4 特征图上的点映射回原图

对于特征图 Fi∈RH×W×CF_i \in R^{H \times W \times C}Fi​∈RH×W×C,其相对于输入图片的stride定义为 sss (举个例子,特征图宽高是40x40,输入图片宽高是320x320,那么 s 等于8)。

另外记GT框的信息为 BiB_iBi​,Bi={x0(i),y0(i),x1(i),y1(i),c(i)}B_i=\{ x_0^{(i)},y_0^{(i)},x_1^{(i)},y_1^{(i)},c^{(i)} \}Bi​={x0(i)​,y0(i)​,x1(i)​,y1(i)​,c(i)},其中 (x0(i),y0(i))(x_0^{(i)},y_0^{(i)})(x0(i)​,y0(i)​) 和 (x1(i),y1(i))(x_1^{(i)},y_1^{(i)})(x1(i)​,y1(i)​) 分别表示GT框的左上角和右下角顶点坐标, c(i)c^{(i)}c(i) 是GT框的类别。

对于特征图FiF_iFi​上的每个点坐标(x,y)(x,y)(x,y) ,可以用如下公式把它映射到原输入图像上:
(⌊s2⌋+xs,⌊s2⌋+ys)(\lfloor \frac{s}{2} \rfloor + xs, \lfloor \frac{s}{2} \rfloor + ys) (⌊2s​⌋+xs,⌊2s​⌋+ys)

5 锚点回归目标值

注意: 锚点落在任何GT框的内部,就认为这个锚点是正样本,并负责预测这个GT框,在映射回原图后的该点直接回归目标框,而不是把这个点看成目标框的中心点进行回归。

锚点的回归目标值计算公式如下图所示,其中(l∗,t∗,r∗,b∗)(l^*,t^*,r^*,b^*)(l∗,t∗,r∗,b∗)是锚点距离物体真实标注框左、上、右、下边界的距离。
在regression分支中,每个锚点预测一个4维向量,即(l∗,t∗,r∗,b∗)(l^*,t^*,r^*,b^*)(l∗,t∗,r∗,b∗)。

网络能把每个锚点距离真实标准框的距离预测的越准,说明网络检测效果越好。

此处的(x,y)(x,y)(x,y)应该是特征图上的锚点映射到原图上的位置。
这里用stride (上图中的s) 进行缩放,使得不同尺度的物体,回归目标值都在一定范围内,避免训练过程中可能出现的梯度爆炸。
由于4个回归值要大于0,最后的输出采用ReLU来保证回归值的范围为(0, +∞)。

6 模糊样本的处理

锚点落在多个GT框的区域内,则称其为模糊样本(ambiguous)。

以一个像素落在两个GT框的情况为例,选择的原则是:选择面积最小的一个GT框作为它训练用的回归目标。
为什么选面积最小的GT框作为它的回归目标?我的理解是:回归小框的像素点本来就少,大的GT框肯定有更多的点去回归的!

思考: 有点草率了,应该先有点什么限制或减少这种情况出现!
回答: 模糊样本的出现,大部分是由于物体重叠造成的,但是重叠的物体多数大小是不同的,所以 FPN特征金字塔 闪亮登场。

启发于anchor-based方法,采用FPN时会将不同大小的anchor放置在不同大小的特征图上,特征图越小,感受野相应更大,用来检测更大的物体。同样地,这种设计理念可以用在FCOS模型上。

FCOS采用5个大小不同的特征图 P3,P4,P5,P6,P7P_3, P_4, P_5, P_6, P_7P3​,P4​,P5​,P6​,P7​,其对应的stride分别是8,16,32,64,128。辅助理解:2i2^i2i。

为了减少尺度差异大的物体重叠,对于anchor-based方法,由于是根据anchor和GT框的IoU来进行匹配,所以很自然地将大小不同的GT框分配到不同的特征图。

而FCOS直接通过限制不同特征图上目标回归值来达到这一目的。
具体来说,每个特征图 PiP_iPi​ 会设定一个回归值的下限值 mi−1m_{i-1}mi−1​ 和上限值 mim_{i}mi​ ,作为其回归距离限制。

对于特征图FiF_iFi​上的每个点坐标(x,y)(x,y)(x,y) ,满足max(l∗,t∗,r∗,b∗)>mimax(l^*,t^*,r^*,b^*)>m_imax(l∗,t∗,r∗,b∗)>mi​ 或 min(l∗,t∗,r∗,b∗)<mi−1min(l^*,t^*,r^*,b^*)<m_{i-1}min(l∗,t∗,r∗,b∗)<mi−1​,那么在这个特征层就将其视为负样本,不再进行回归。论文中 m2,m3,m4,m5,m6,m7m_2, m_3, m_4, m_5, m_6, m_7m2​,m3​,m4​,m5​,m6​,m7​ 分别设定为0,64,128,256,512,+∞。
也就是特征图 P3P_3P3​ 覆盖的是[0,64]之间的目标回归值,而 P7P_7P7​ 则是负责512以上的目标回归值。

7 Center-ness分支

作者在使用了多尺度检测后发现仍然和anchor-based的检测器有很大差距,发现FCOS存在大量的低质量的检测框。这是由于把中心点的区域扩大到整个物体的边框,经过模型优化后可能有很多中心离GT box中心很远的预测框。

于是,FCOS在regression分支的末尾添加了一个额外的center-ness分支(早期放在classification分支,但是放在regression分支效果更好)来抑制一些检测框:由偏离目标中心的锚点 所预测的低质量检测框。

中心性预测分支center-ness,动机在于如果一个锚点距离物体标注框中心点越近,锚点的回归目标值(锚点距离标注框左、上、右、下四个边界的距离)就越一致,回归难度较低,回归效果会越好。

center-ness分支只预测一个值:当前位置与要预测的物体中心点之间的归一化距离,值在[0, 1]之间,距离物体中心点越近,得分越高。下图给出了可视化效果,其中红色和蓝色值分别1和0,其它颜色介于两者之间,从物体中心向外,center-ness从1递减为0。

给定回归的target=(l∗,t∗,r∗,b∗)target=(l^*,t^*,r^*,b^*)target=(l∗,t∗,r∗,b∗),center-ness的target label定义为centerness∗centerness^*centerness∗:

由于centerness∗centerness^*centerness∗值在0~1之间,训练过程中可以采用 BCE损失函数 进行优化。

可以看出,当loss越小时,centerness就越接近1,也就是说回归框的中心越接近真实框。

注意: 在测试阶段,最终的置信度为center-ness和分类概率的乘积

8 后续改进

8.1 center sampling

  • 原始论文:GT bbox 内的点,分类时均作为正样本(下图上面小图的所有黄色区域)。
  • 改进 trick:只有 GT bbox 中心附近的 radius * stride 内的小 bbox(可以叫 sub box)内的点,分类时才作为正样本(下图下面小图的黄色和绿色区域)。


也就是要落在:(x−rs,y−rs,x+rs,y+rs)(x-rs,y-rs,x+rs,y+rs)(x−rs,y−rs,x+rs,y+rs)这个框内,作者通过消融实验发现在coco数据集上 r 取1.5效果最好。

8.2 centerness 分支的 centerness计算

  • 原始论文:利用 l,t,r,b 计算 centerness。小目标的 centerness 值比较小,最终 cls 分数很容易被阈值卡掉。
  • 改进 trick:直接用 IoU

8.3 regression分支的loss

  • 原始论文:IoU loss
  • 改进 trick:GIoU loss

8.4 bbox loss weight

  • 原始论文:平权
  • 改进 trick:用 centerness 分支的 target,即离gt中心越近,权重越大。

8.5 norm on bbox

  • 原始论文:reg分支最后使用exp操作
  • 改进 trick:reg分支最后使用relu操作

8.6 开发板上部署时优化策略

  • 使用轻量型网络,例如mobilenetv2,Efficientnet对backbone进行替换。
  • 使用BiFPN替换FPN。BIFPN给各个层赋予了不同权重去进行融合,让网络更加关注重要的层。BIFPN还减少了一些不必要的 层的结点连接。
  • 将Efficientnet中的swish激活函数替换成ReLu,去掉backbone中的sigmoid结构

9 感谢链接

https://zhuanlan.zhihu.com/p/468494402
https://zhuanlan.zhihu.com/p/156112318
https://zhuanlan.zhihu.com/p/443367551
https://zhuanlan.zhihu.com/p/104236411
https://zhuanlan.zhihu.com/p/62869137
https://blog.csdn.net/qq_37541097/article/details/124844726

【FCOS】FCOS理论知识讲解相关推荐

  1. 和与余数的和同余理解_5 同余 ——数论入门知识讲解系列

    数学竞赛 数论是纯粹数学的分支之一,主要研究整数的性质,按研究方法分为初等数论和高等数论.中学生(甚至小学生)课外数学兴趣小组的许多内容是属于初等数论的,各级别数学竞赛也会把初等数论作为重点内容进行考 ...

  2. 用VC进行COM编程所必须掌握的理论知识

    用VC进行COM编程所必须掌握的理论知识 这篇文章是给初学者看的,尽量写得比较通俗易懂,并且尽量避免编程细节.完全是根据我自己的学习体会写的,其中若有技术上的错误之处,请大家多多指正. 一.为什么要用 ...

  3. 课程理论知识、教学实施

    目录 第一章 课程理论知识 一.学科核心素养 二.教学目标 三.教学环节 第二章 教学实施 第一节 新课导入类 第二节 教学方法类 第三节 教师实施原则类 第四节 设计意图类 第一章 课程理论知识 出 ...

  4. 计算机性能指标ppt,计算机网络—评价网络的性能指标知识讲解.ppt

    <计算机网络-评价网络的性能指标知识讲解.ppt>由会员分享,提供在线免费全文阅读可下载,此文档格式为ppt,更多相关<计算机网络-评价网络的性能指标知识讲解.ppt>文档请在 ...

  5. 《个人理财》书中的精髓:如何通过金融学理论知识的学习,建立更加完善的金融体系,让自己更加富有。

    <个人理财>书中的精髓:如何通过金融学理论知识的学习,建立更加完善的金融体系,让自己更加富有. 对于很多人来说,个人理财是他们接触到的第一门也是唯一一门理财课程,对于没有系统掌握理财知识的 ...

  6. 《STM32从零开始学习历程》——DMA直接存储区访问理论知识

    <STM32从零开始学习历程>@EnzoReventon DMA-直接存储区访问理论知识 本文主要介绍STM32F4 DMA直接存储区的理论知识部分,本文主要参考手册为: [野火Embed ...

  7. python实现录音并去燥_Python实现电脑录音(含音频基础知识讲解)

    Python实现电脑录音(含音频基础知识讲解) 前言 今天开始进入近期系列文章的第一篇,如何用 Python 来实现录音功能. 在开始"造轮子"之前,个人一直强调一个观点,如果有些 ...

  8. python classmethod知识_python基础知识讲解——@classmethod和@staticmethod的作用

    python基础知识讲解--@classmethod和@staticmethod的作用 在类的成员函数中,可以添加@classmethod和@staticmethod修饰符,这两者有一定的差异,简单来 ...

  9. 关于mpi的理论知识以及编写程序来实现数据积分中的梯形积分法。

    几乎所有人的第一个程序是从"hello,world"程序开始学习的 #include "mpi.h" #include <stdio.h> int ...

最新文章

  1. Linux下遍历文件夹的实现
  2. 机器人抓取领域性能评估标准
  3. LeGO-LOAM学习
  4. 嵌入式Linux操作系统的版本查询
  5. 软件项目开发流程以及人员职责
  6. getinfo怎么用php,PHP的函数curl-curl_getinfo
  7. linux查看显卡型号
  8. 1102: 韩信点兵
  9. diybox路由器设置教程_tp link无线路由器设置图文教程
  10. 地震勘探原理(二)之时距曲线
  11. 图解电动汽车:电动汽车充电接口
  12. 一些杂乱的知识点(二)
  13. 【LeetCode-SQL每日一练】—— 181. 超过经理收入的员工
  14. 2017-2018-1 20155227 《信息安全系统设计基础》第一周学习总结
  15. python实现键盘记录木马
  16. 《《《翻译》》》pointfusion三维包围盒
  17. Cameralink转SDI接口转换器 产品模块
  18. Linux网络服务(中)FTP服务配置
  19. C语言”%p”的意思
  20. 创建Spring boot项目运行出现报错: java: 无效的源发行版: 14

热门文章

  1. vue2 扩展雪碧图
  2. mysql绿化,MySQL 的绿化与使用
  3. python列表之典型案例
  4. 为什么我们缺少特立独行的人生态度——萧功秦
  5. python hexdump_细说Linux中怎么用hexdump命令
  6. java根据商品编号查找商品_查询商品分类下的所有商品(分类级别不限)
  7. pythonfor循环遍历字符串_Day3--Python--字符串,for循环,迭代
  8. 自动生成拼音(汉字反查到拼音)
  9. 现在很多的企业都有自己的线上商城,那该怎么运营企业自己的线上商城呢?
  10. jni-jobject操作对象