URL
- paper: https://arxiv.org/pdf/2104.10956.pdf
- code: https://github.com/open-mmlab/mmdetection3d/blob/main/mmdet3d/models/dense_heads/fcos_mono3d_head.py
TL;DR
- 本文基于
FCOS
论文提出一种架构简单的Anchor Free
的单目3D
检测算法FCOS3D
,在NeurIPS 2020
的nuScenes 3D
检测比赛纯视觉赛道上取得了第一名。
Algorithm
问题定义
-
本文提出的
FCOS3D
要解决的核心问题是一个 图片到 7-DoF 属性(x, y, z, w, l, h, yaw+dir)的预测。DoF
是指degree of freedom
(自由度)。(x, y, z, w, l, h, yaw+dir)
分别表示物体在相机坐标系下的 3 维坐标和长宽高(单位都是米),和偏航角(俯视图角度,单位是弧度)和方向 2 分类共同构成朝向。
-
对于
nuScenes 3D
检测比赛,还需要解决的非核心问题包括:- 预测出的
3D
框物体的类别(10类物体) - 预测出的
3D
框物体的属性(9种属性) - 预测出的
3D
框物体的x, y
轴速度(不是 “病态” 问题了,已经属于癌症问题了…)
- 预测出的
网络结构
-
backbone
和FPN
比较常规 -
decode head
和FCOS
一样,使用了不同level feature
的参数共享(反正是全卷积,不存在 shape 问题) -
decode head
中包括:-
分类分支:
- class:
output_shape = (N, 10, H, W)
,使用FocalLoss
- attribute:
output_shape = (N, 9, H, W)
,使用CrossEntropyLoss
- class:
-
回归分支:
- box:
output_shape = (N, 9, H, W)
,(dx, dy, log(z), log(w), log(l), log(h), yaw, vx, vy)
,使用SmoothL1Loss
- centerness:
output_shape = (N, 1, H, W)
,使用BCEWithLogitsLoss
- direction:
output_shape = (N, 2, H, W)
,使用CrossEntropyLoss
- box:
-
target 设置
- target 设置中使用了很多 2D 引导 3D 的思想。
(x, y, z)
target 设置
- 由于是 3D 检测,所以 GT 的 3D 框坐标(x, y, z, w, l, h)单位都是米,这对神经网络是不友好的(因为神经网络看到的是像素,预测以像素为单位更容易)。
- 因此,本文实际是一个
2.5D
的预测(xy 2D, z 3D)
,实际预测的x, y
是像素坐标系下相对于 feature map 每一个点的偏移量(由相机坐标系和相机内参可计算得到像素坐标系),z, w, l, h
的预测是相机坐标系下的米为单位的真值取log
。
centerness target 设置
- 与
FCOS
不同,FCOS3D centerness
: ,
yaw target 设置
- 本文将 yaw (0 ~ )编码成 yaw (0 ~ )和方向
正样本选择
FCOS
是将feature map
上的每个位置到 GT 中心点的距离小于1.5 * stride
的点作为正样本。- 但
FCOS3D
是3D
检测,没办法直接使用FCOS
提出的方法;解决方法和x, y
坐标回归方法类似,如果2.5D
坐标下的x, y
和feature map
位置距离小于1.5 * stride
,则算作正例。
GT 尺度分配
- 和
FCOS
思想一样
不同尺度 feature map 缩放
- 和
FCOS
思想一样,只是更丰富scale.shape == (num_of_level, 3),分别表示 scale_offset(for xy) / scale_depth(for z) / scale_size(for wlh)
Thought
- 本文极大程度的借鉴了
FCOS
,相当于FCOS
的2.5D
版 - 加入了很多
trick
: log(z), centerness target 定义,encode yaw 等,很 work