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