FCOS3D Fully Convolutional One-Stage Monocular 3D Object Detection 论文学习
论文地址:Fully Convolutional One-Stage Monocular 3D Object Detection
Github地址:Fully Convolutional One-Stage Monocular 3D Object Detection
1. 解决了什么问题?
单目 3D 目标检测由于成本很低,对于自动驾驶任务非常重要。但是由于天然缺乏深度信息,它要比传统的 2D 场景更加困难。虽然 2D 目标检测取得一些进展,但要把它们适配到 3D 任务上没那么轻松。现有的 3D 检测算法背后都有一个基础问题,即如何使用 2D-3D 的对应关系,将 3D 目标分配到 2D 空间,然后做预测。
2. 提出了什么方法?
FCOS3D 是一个全卷积、单阶段的检测器,首先将 7 自由度的 3D 目标框投影到 2D 图像空间,得到所谓的 3D 中心点,区别于之前的 2D 中心点。有了这个投影后,3D 中心点就包括了 2.5D 信息,即 2D 位置和深度信息。2D 位置可以简化成距离图像上某一点的 2D 偏移,作为 2D 属性使用。3D 属性则包括了深度、3D 尺寸和朝向信息。然后依据它们的 2D 尺度分配这些目标到不同的特征层级,训练时只根据投影后的 3D 中心点来给每个样本分配回归目标。FCOS 用点到四条边的距离来计算 centerness,而 FCOS3D 则基于 3D 中心的位置,使用 2D 高斯分布来重新定义 3D 的 centerness。
单目 3D 检测需要预测 3D 边框,需要将其解耦、转换到 2D 图像平面上。
2.1 架构概述
全卷积单阶段检测器一般包括三个组成:用于特征提取的主干网络、多层级分支的 necks 和做密集预测的 heads。
主干网络
使用带可变形卷积的预训练的 ResNet-101 来提取特征,平衡准确率和效率,固定第一个卷积模块的参数来降低内存占用。
Neck
FPN 能帮助模型在不同的尺度上检出目标。作者延续了 FCOS 的设计,使用 P3 到 P5 层级,用 2 个卷积模块对 P5 层级做下采样得到 P6 和 P7。这 5 个特征图负责不同尺度的预测。
检测 Head
共享的检测 head 有两个亟需解决的问题。第一个是如何分配目标到不同的特征层级和不同的点。第二个是如何设计网络结构。作者遵循了 FCOS 和 RetinaNet,每个共享 head 包括 4 个共享的卷积模块,以及实现不同目标的小型 heads。从经验来讲,解耦后的 heads 对回归目标更加有效,因此每个任务都有一个小 head,如下图所示。
为了充分利用 2D 特征提取器,作者延续了 2D 检测器的主干和 neck 设计。在检测 head 内,首先用 center-based 范式重新表示 3D 目标,解耦为多任务学习。此外,作者改进了多层级目标分配和中心采样,使该框架能更好地处理重叠 GT 框和尺度变化问题。
回归目标
作者首先回顾了 anchor-free 检测算法 FCOS。给定主干网络的第 i i i层特征图,记做 F i ∈ R H × W × C F_i\in \mathbb{R}^{H\times W\times C} Fi∈RH×W×C,基于该特征图的每个点来预测目标,这些特征点对应着原输入图像上均匀分布的像素点。对于特征图 F i F_i Fi的每个点 ( x , y ) (x,y) (x,y),假定到第 i i i层的总步长是 s s s,那么输入图像上对应的位置就是 ( s x + ⌊ s 2 ⌋ , s y + ⌊ s 2 ⌋ ) (sx+\lfloor\frac{s}{2}\rfloor,sy+\lfloor\frac{s}{2}\rfloor) (sx+⌊2s⌋,sy+⌊2s⌋)。FCOS 没有用到 anchor,它评判一个点是前景还是背景不是依靠 anchors 和 GT 框的 IoU。只要一个点距离边框中心点足够近,FCOS 就认为它是前景样本。
如下图,在 2D 任务中,模型预测点到四条边的距离 t , b , l , r t,b,l,r t,b,l,r。而在 3D 任务中,回归点到 3D 框六个面的距离是很麻烦的。一个更加直观的办法就是将 7 自由度的回归目标转换为 2.5D 中心点和 3D 尺寸。使用相机内参矩阵,很容易将 2.5D 中心点转换回 3D 空间。2.5D 中心点回归可以进一步简化为某一前景点到边框中心点的偏移 Δ x , Δ y \Delta_x,\Delta_y Δx,Δy 及对应的深度值 d d d。
为了进一步预测目标的朝向,将它分为两个部分:周期为 π \pi π的角度 θ \theta θ和 2-bin 方向分类。第一部分自然地建模了预测框和 GT 框的 IOU,第二部分则关注两个框具有相反朝向的场景。这种角度编码对模型很有帮助,朝向准确率高于 CenterNet。下图展示了该旋转角度编码。在 2-bin 边界上,方向相反的两个目标有着相同的旋转偏移量。为了区分开它们,回归分支额外预测一个方向类别。
除了这些与目标坐标和朝向相关的回归目标,作者也回归一个二值目标 centerness c c c。它作为一个软二值分类器来判断哪些点离中心点近一些,从而抑制低质量预测框。
回归分支需要预测 Δ x , Δ y , d , w , l , h , θ , v x , v y \Delta_x,\Delta_y,d,w,l,h,\theta,v_x,v_y Δx,Δy,d,w,l,h,θ,vx,vy、方向类别 C θ C_\theta Cθ和 centerness c c c,分类分支需要输出目标的类别标签和属性标签。
Loss
对于回归和分类目标,分别定义其损失,加权得到总的损失。首先,分类损失使用 Focal Loss:
L c l s = − α ( 1 − p ) γ log p L_{cls}=-\alpha(1-p)^\gamma \log p Lcls=−α(1−p)γlogp
p p p是预测框的类别概率,采取既有的设定 α = 0.25 , γ = 2 \alpha=0.25,\gamma=2 α=0.25,γ=2。对于属性分类,使用一个简单的 softmax 分类损失,记做 L a t t r L_{attr} Lattr。
对于回归分时,使用加权的 smooth L1 损失,
L l o c = ∑ b ∈ ( Δ x , Δ y , d , w , l , h , θ , v x , v y ) SmoothL1 ( Δ b ) L_{loc}=\sum_{b\in(\Delta_x,\Delta_y,d,w,l,h,\theta,v_x,v_y)}\text{SmoothL1}(\Delta_b) Lloc=b∈(Δx,Δy,d,w,l,h,θ,vx,vy)∑SmoothL1(Δb)
其中, Δ x , Δ y , w , l , h , θ \Delta_x,\Delta_y,w,l,h,\theta Δx,Δy,w,l,h,θ的权重是 1 1 1, d d d的权重是 0.2 0.2 0.2, v x , v y v_x,v_y vx,vy的权重是 0.05 0.05 0.05。使用 exp ( x ) \exp(x) exp(x)来预测深度,在原始的深度空间计算损失,而非 log \log log空间,这样预测的深度更加准确。方向分类使用 softmax 分类损失,记做 L d i r L_{dir} Ldir。centerness 回归使用 BCE 损失,记做 L c t L_{ct} Lct。整体损失为:
L = 1 N p o s ( β c l s L c l s + β a t t r L a t t r + β l o c L l o c + β d i r L d i r + β c t L c t ) L=\frac{1}{N_{pos}}(\beta_{cls}L_{cls}+\beta_{attr}L_{attr}+\beta_{loc}L_{loc}+\beta_{dir}L_{dir}+\beta_{ct}L_{ct}) L=Npos1(βclsLcls+βattrLattr+βlocLloc+βdirLdir+βctLct)
其中 N p o s N_{pos} Npos是预测的正样本个数, β c l s = β a t t r = β l o c = β d i r = β c t = 1 \beta_{cls}=\beta_{attr}=\beta_{loc}=\beta_{dir}=\beta_{ct}=1 βcls=βattr=βloc=βdir=βct=1。
推理
推理时,将给定的图片输入网络,得到边框及类别得分、属性得分、centerness 预测。将类别得分与 centerness 相乘,作为每个预测结果的置信度,在 BEV 视角做 NMS 得到最终的结果。
2.2 2D 引导的多层级 3D 预测
要想训练一个带金字塔网络的检测器,我们需要设计如何分配目标到不同的特征层上。FCOS 研究了两个问题:
- 如何使 anchor-free 检测器取得与 anchor-based 检测器相似的召回率;
- 消除 GT 框重叠引发的歧义。
FPN 能提升召回率,取得比 anchor-based 方法更好的效果。该方法也能应用在 3D 场景。第二个问题就要牵扯入回归目标的具体设定。
原 FCOS 在不同的特征层级检测不同大小的目标,将不同大小的 GT 框分配到不同层级的特征图。首先计算每个特征层级上每个位置的 2D 回归目标 l ∗ , r ∗ , t ∗ , b ∗ l^*,r^*,t^*,b^* l∗,r∗,t∗,b∗。那些满足 max ( l ∗ , r ∗ , t ∗ , b ∗ ) > m i \max(l^*,r^*,t^*,b^*)>m_i max(l∗,r∗,t∗,b∗)>mi 或 max ( l ∗ , r ∗ , t ∗ , b ∗ ) < m i − 1 \max(l^*,r^*,t^*,b^*)<m_{i-1} max(l∗,r∗,t∗,b∗)<mi−1的点将作为负样本, m i m_i mi表示第 i i i个特征层级最大的回归范围。FCOS3D 也延续了该设计,但 2D 检测框只用于标签分配时过滤无效目标。完成目标分配之后,回归目标就只剩下 3D 相关的了。根据投影后的 3D 边框的外矩形框,就能计算得到 2D 框,因此不再需要 2D 检测标注或先验知识。
下面介绍如何消除歧义。一个点若处在同一特征层级的多个 GT 框内,这个点应该分配到哪一个 GT 框呢?常用的方法是根据 2D 框的面积选择。面积小的框作为该点回归的目标框。这种机制叫做 area-based 标准,有着明显的缺陷:这样处理后,大目标得到的注意力就少许多。于是,作者提出了 distance-based 标准,选择中心点离回归目标近的边框。该机制与定义回归目标的 center-based 机制是一致的。距离目标中心点越近,局部特征就越全面、均衡,越容易产生高质量预测框。如下图,该机制能明显提升大目标的召回率和 mAP,也能提升整体 mAP。
[图片]
除了使用 center-based 方法,作者也使用了 3D 中心点来判断前景点,距离中心点足够近的点才被看作为正样本。作者定义了一个超参半径来定义中心区域。距离目标中心点小于 radius × stride \text{radius}\times \text{stride} radius×stride的点都是正样本,本文中 radius = 1.5 \text{radius}=1.5 radius=1.5。
将不同回归分支的输出 x x x替换为 s i x s_i x six,区分不同特征层级的共享 heads。这里 s i s_i si是一个可训练标量,调节层级 i i i的 exp \exp exp函数,能带来表现的小幅提升。
2.3 2D 高斯分布表示 3D Centerness
在原 FCOS,centerness c c c定义为:
c = min ( l ∗ , r ∗ ) max ( l ∗ , r ∗ ) × min ( t ∗ , b ∗ ) max ( t ∗ , b ∗ ) c=\sqrt{\frac{\min(l^*,r^*)}{\max(l^*,r^*)}\times \frac{\min(t^*,b^*)}{\max(t^*,b^*)}} c=max(l∗,r∗)min(l∗,r∗)×max(t∗,b∗)min(t∗,b∗)
l ∗ , r ∗ , t ∗ , b ∗ l^*,r^*,t^*,b^* l∗,r∗,t∗,b∗是 2D 回归的目标。由于回归目标变为了 3D 中心的范式,使用 2D 高斯分布来定义 centerness,原点是投影后的 3D 中心点。2D 高斯分布简化为:
c = e − α ( Δ x 2 + Δ y 2 ) c=e^{-\alpha(\Delta_x^2+\Delta_y^2)} c=e−α(Δx2+Δy2)
α = 2.5 \alpha=2.5 α=2.5用于调节从中心点到外围的衰减强度。将 c c c作为 centerness 的 GT 值,用回归分支来预测它,过滤掉低质量的预测框。Centerness 阈值在 0 0 0到 1 1 1之间,于是采用 BCE 损失训练该分支。
相关文章:
FCOS3D Fully Convolutional One-Stage Monocular 3D Object Detection 论文学习
论文地址:Fully Convolutional One-Stage Monocular 3D Object Detection Github地址:Fully Convolutional One-Stage Monocular 3D Object Detection 1. 解决了什么问题? 单目 3D 目标检测由于成本很低,对于自动驾驶任务非常重…...
Xpath学习笔记
Xpath原理:先将HTML文档转为XML文档,再用xpath查找HTML节点或元素 什么是xml? 1、xml指可扩展标记语言 2、xml是一种标记原因,类似于html 3、xml的设计宗旨是传输数据,而非显示数据 4、xml标签需要我们自己自定义 5、x…...
网络编程之 Socket 套接字(使用数据报套接字和流套接字分别实现一个小程序(附源码))
文章目录 1. 什么是网络编程2. 网络编程中的基本概念1)发送端和接收端2)请求和响应3)客户端和服务端4)常见的客户端服务端模型 3. Socket 套接字1)Socket 的分类2)Java 数据报套接字通信模型3)J…...
What Are Docker Image Layers?
Docker images consist of multiple layers that collectively provide the content you see in your containers. But what actually is a layer, and how does it differ from a complete image? In this article you’ll learn how to distinguish these two concepts and…...
范数详解-torch.linalg.norm计算实例
文章目录 二范数F范数核范数无穷范数L1范数L2范数 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 范数是一种数学概念,可以将向量或矩阵映射到非负实数上,通常被…...
postgresdb备份脚本
以下是一个简单的postgresdb备份脚本示例: 复制 #!/bin/bash # 设置备份目录和文件名 BACKUP_DIR/path/to/backup BACKUP_FILEdb_backup_$(date %F_%H-%M-%S).sql # 设置数据库连接参数 DB_HOSTlocalhost DB_PORT5432 DB_NAMEmydatabase DB_USERmyusername DB_PA…...
MATLAB程序员投简历的技巧解析,如何写出有亮点的简历
如果你想在简历中展示你的项目经验,一定要有亮点。一个导出的 Excel 文件过大导致浏览器卡顿的例子就是一个很好的亮点。你可以在简历中写明这个例子。如果面试官问起,可以用浏览器的原理来解释。浏览器内核可以简单地分为以下 5 个线程:GUI …...
颜色空间转换RGB-YCbCr
颜色空间 颜色空间(Color Space)是描述颜色的一种方式,它是一个由数学模型表示的三维空间,通常用于将数字表示的颜色转换成可见的颜色。颜色空间的不同取决于所选的坐标轴和原点,以及用于表示颜色的色彩模型。在计算机…...
年薪40万程序员辞职炒股,把一年工资亏光了,得了抑郁症,太惨了
年薪40万的程序员辞职全职炒股 把一年的工资亏光了 得了抑郁症 刚才在网上看了一篇文章 是一位北京的一位在互联网 大厂上班的程序员 在去年就是股市行情比较好的时候 他买了30多万股票 结果连续三个月都赚钱 然后呢 他是就把每天就996这种工作就辞掉了 然后在家全是炒股 感觉炒…...
10分钟如何轻松掌握JMeter使用方法?
目录 引言 安装jmeter HTTP信息头管理器 JMeter断言 HTTP请求默认值来代替所有的域名与端口 JSON提取器来替换变量 结语 引言 想要了解网站或应用程序的性能极限,JMeter是一个不可或缺的工具。但是,对于初学者来说,该如何上手使用JMe…...
[NLP]如何训练自己的大型语言模型
简介 大型语言模型,如OpenAI的GPT-4或Google的PaLM,已经席卷了人工智能领域。然而,大多数公司目前没有能力训练这些模型,并且完全依赖于只有少数几家大型科技公司提供技术支持。 在Replit,我们投入了大量资源来建立从…...
LeetCode1047. 删除字符串中的所有相邻重复项
1047. 删除字符串中的所有相邻重复项 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一…...
3。数据结构(3)
嵌入式软件开发第三部分,各类常用的数据结构及扩展,良好的数据结构选择是保证程序稳定运行的关键,(1)部分包括数组,链表,栈,队列。(2)部分包括树,…...
QT停靠窗口QDockWidget类
QT停靠窗口QDockWidget类 QDockWidget类简介函数和方法讲解 QDockWidget类简介 QDockWidget 类提供了一个部件,它可以停靠在 QMainWindow 内或作为桌面上的顶级窗口浮动。 QDockWidget 提供了停靠窗口部件的概念,也称为工具面板或实用程序窗口。 停靠窗…...
【LeetCode】139. 单词拆分
139. 单词拆分(中等) 思路 首先将大问题分解成小问题: 前 i 个字符的子串,能否分解成单词;剩余子串,是否为单个单词; 动态规划的四个步骤: 确定 dp 数组以及下标的含义 dp[i] 表示 s…...
【三维重建】NeRF原理+代码讲解
文章目录 一、技术原理1.概览2.基于神经辐射场(Neural Radiance Field)的体素渲染算法3.体素渲染算法4.位置信息编码(Positional encoding)5.多层级体素采样 二、代码讲解1.数据读入2.创建nerf1.计算焦距focal与其他设置2.get_emb…...
IntelliJ IDEA 社区版2021.3配置SpringBoot项目详细教程及错误解决方法
目录 一、SpringBoot的定义 二、Spring Boot 优点 三、创建一个springboot的项目 四、使用IDEA创建SpringBoot失败案例 一、SpringBoot的定义 Spring 的诞⽣是为了简化 Java 程序的开发的,⽽ Spring Boot 的诞⽣是为了简化 Spring 程序开发的。 Spring Boot 翻…...
Qt中QDebug的使用
QDebug类为调试信息(debugging information)提供输出流。它的声明在<QDebug>中,实现在Core模块中。将调试或跟踪信息(debugging or tracing information)写出到device, file, string or console时都会使用QDebug。 此类的成员函数参考:https://doc…...
vue使用路由的query配置项时如何清除地址栏的参数
写vue项目时,如果想通过路由的query配置项把参数从一个组件传到另一个组件,但是又不希望?idxxx显示在地址栏(如:http://localhost:8080/test?idxxx的?idxxx),该怎么做: 举一个案例࿱…...
Redis-列表(List)
Redis列表(List) 介绍 单键多值Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)它的底层实际是个双向链表,对两端的操作性能很高,通过索…...
ripro主题修改教程-首页搜索框美化教程
先看效果图: 我们来看怎么实现: 1、找到wp-content/themes/ripro/assets/css/diy.css并将下面的内容整体复制进去并保存 /*首页搜索框*/ .bgcolor-fff {background-color: #fff; } .row,.navbar .menu-item-mega>.sub-menu{margin-left:-10px;margin-right:-10px;} .home…...
写作业用白光还是暖光?盘点色温4000K的护眼台灯
台灯的白光或者暖光指的是台灯的色温,低色温的光线看起来发黄发红,高色温的光线发白发蓝。 如果灯光的光源是高品质光源,本身没有蓝光问题,那么色温的选择对护眼的影响是比较少的,更多的是对人学习工作状态,…...
Java时间类(一)-- SimpleDateFormat类
目录 1. SimpleDateFormat的构造方法: 时间模式字母: 2. SimpleDateFormat的常用方法: “工欲善其事,必先利其器”。学习时间类之前,需要先学习SimpleDateFormat类。 java.text.SimpleDateFormat类是以与语言环境有关的方式来格式...
07 Kubernetes 网络与服务管理
课件 Kubernetes Service是一个抽象层,用于定义一组Pod的访问方式和访问策略,其作用是将一组Pod封装成一个服务,提供一个稳定的虚拟IP地址和端口号,以便于其他应用程序或服务进行访问。 以下是Kubernetes Service YAML配置文件的…...
并发编程之Atomic原子操作类
基本类型:AtomicInteger、AtomicBoolean、AtomicLong 引用类型:AtomicReference、AtomicMarkableReference、AtomicStampedReference 数组类型:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray 对象属性原子修改器:…...
管家婆辉煌Ⅱ 13.32版安装方法
因管家婆辉煌版已经长期不更新,现已经出现蓝屏的问题,故此新开此贴,慢慢更新安装方法。 首先管家婆下载地址:http://www.grasp.com.cn/download.aspx?id116 先安装sql server 2008 下载后,运行安装,请注…...
常见的接口优化技巧思路
一、背景 针对老项目,去年做了许多降本增效的事情,其中发现最多的就是接口耗时过长的问题,就集中搞了一次接口性能优化。本文将给小伙伴们分享一下接口优化的通用方案。 二、接口优化方案总结 1.批处理 批量思想:批量操作数据…...
【Java EE】-使用Fiddler抓包以及HTTP的报文格式
作者:学Java的冬瓜 博客主页:☀冬瓜的主页🌙 专栏:【JavaEE】 分享: 在满园弥漫的沉静的光芒之前,一个人更容易看到时间,并看到自己的身影。——史铁生《我与地坛》 主要内容:使用FIddler抓包的…...
Java异步编程
Java异步编程 1、什么是java异步编程2、异步编程有什么作用3、异步编程常用于哪些业务4、异步编程的方式5、Async异步调用Async简介 1、什么是java异步编程 Java异步编程是一种处理并发问题的技术,它可以在执行耗时操作的同时,不阻塞主线程,…...
C++类与对象(二)——构造函数与析构函数
文章目录 一.类的默认6个成员函数二.构造函数1.引例2.构造函数的概念及特性 三.析构函数😋析构函数的特性 前言: 上篇文章初步认识了类以及类的相关知识,本篇将继续深入学习类与对象——类的默认6个成员函数: 一.类的默认6个成员函…...
南京网站建设推广/网站关键词排名外包
背景 服务端程序出了问题,大概知道问题出现的位置,但是如用单元测试用例,则整个服务流程太长,并且本地不一定会出现服务端的错误,为方便调试,需要在本地调试时使用服务端一样的参数 方法 方法1:…...
php网站开发示例/市场推广和销售的区别
非阻塞Connect对于select时应注意问题 http://www.cnitblog.com/zouzheng/archive/2010/11/25/71711.html 对于面向连接的socket类型(SOCK_STREAM,SOCK_SEQPACKET)在读写数据之前必须建立连接,首先服务器端socket必须在一个客户端知道的地址进行监听,也就是创建soc…...
安阳网站推广优化/百度查重软件
1.Visual Studio Code简介 1.1.什么是Visual Studio Code? Visual Studio Code是微软推出的一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代 Web 和云应用的跨平台源代码编辑器。 1.2.主要功能 集成了所有一款现代编辑器所应该具备的特性,…...
网站站内搜索制作/产品推广广告
1.如何派生内置不可变类型并修其改实例化行为 问题1: 我们想定义一种新类型的元组,对于传入的可迭代对象,我们只保留其中int类型且值大于0的元素,例如:IntTuple([1,-1,abc,6,[x,y],3])>(1,6,3),要求IntTuple是内置t…...
服务器网站部署端口配置/郑州seo代理外包公司
在基于Java的内容管理系统(CMS)的世界中导航并不是最简单的任务。新的解决方案不断涌现,以帮助用户管理其网站和web应用程序上的内容。各种内容管理系统的规模、价格和可扩展性各不相同。 这里有目前使用的一些最流行的Java CMS。 Magnolia Magnolia是一个完全无头的…...
什么网站可以查房屋建筑面积/百度seo快速排名
奋斗的小孩系列 FPGA学习altera系列: 第十一篇 流水灯设计 作者:奋斗的小孩 郝旭帅(转载请注明出处) 大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢…...