SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation 论文笔记

SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation 论文笔记

论文链接: https://arxiv.org/abs/2002.10111

在这里插入图片描述

一、 Problem Statement

目前的单目3D视觉中,通常非常依赖于RCNN网络或者RPN网络,然后会多加一个分支去学习3D信息或者产生伪激光雷达,然后将它们放入点云检测网络中。作者认为2D检测网络是冗余的,且对3D目标检测来说引入了不可忽视的噪声,导致学习3D几何信息困难。作者且认为,如果3D信息和相机内参矩阵已经知道,2D信息可以很自然地得到。

二、 Direction

提出了一个multi-step disentangling(to separate different ideas or pieces of information that have become confused together) 的方法, 即消除2D检测分支,添加一个3D回归分支,直接在图片上预测3D点,也就是一个关键点和3D变量组成3D bounding box。

三、 Method

所谓的单目3D目标检测问题,可以认为是:给定了一个RGB图像

I

R

W

×

H

×

3

I \in \R^{W \times H \times 3}

IRW×H×3,找到类别

C

C

C和3D Bounding Box,后者可以表达为

(

h

,

w

,

l

,

x

,

y

,

z

,

θ

)

(h,w,l,x,y,z,\theta)

(h,w,l,x,y,z,θ)

在这里插入图片描述

由上图可以知道,SMOKE分为三个部分:

  • Backbone
  • 3D detection
  • Loss function

1. Backbone

在这里插入图片描述

作者使用了DLA-34作为Backbone,其可以融合不同层之间的信息。但作者做了一些修改:

  • 使用Deformable Convolution Network替换所有的hierarchical aggregation connections。
    在这里插入图片描述

  • 使用GN层替换所有的BN层。(对Batch Size less sensitive且对training noise更加鲁棒)
    在这里插入图片描述

  • 输出特征图是相对于输入图像的4倍下采样。

2. 3D 检测网络

检测网络总共有两个分支:

  • Keypoint Branch
  • Regression Branch

(1) Keypoint Branch

这一部分和CenterNet相似,也就是将目标用一个点表示。但这里不是检测2D Bounding Box的中心点,而是将目标的3D中心映射到2D平面。 如下图所示:

在这里插入图片描述

作者这样做的目的是因为投影的点能够很好的恢复3D位置。假设

[

x

,

y

,

z

]

T

[x,y,z]^T

[x,y,z]T是每个目标的3D中心,那么投影到2D平面的3D点为

[

x

c

,

y

c

]

T

[x_c, y_c]^T

[xc,yc]T,这是由相机内参矩阵

K

K

K得到的:

[

z

x

c

z

y

c

z

]

=

K

3

×

3

[

x

y

z

]

\bigg[ \begin{aligned} z &\cdot x_c \\ z &\cdot y_c \\ &z \end{aligned} \bigg] = K_{3\times 3} \bigg[\begin{aligned} x \\ y\\ z \end{aligned}\bigg]

[zzxcycz]=K3×3[xyz]

每个点对应的ground-truth keypoint,就是它们下采样后特征图中的位置,然后使用Gaussian Kernel分布。每一个在图像上的3D点都是由8个2D点所对应

[

x

b

,

1

8

,

y

b

,

1

8

]

T

[x_{b,1\sim 8}, y_{b, 1\sim 8}]^T

[xb,18,yb,18]T,且标准差通过包围3D Box的最小2D box

{

x

b

m

i

n

,

y

b

m

i

n

,

x

b

m

a

x

,

y

b

m

a

x

}

\{x_b^{min}, y_b^{min}, x_b^{max}, y_b^{max}\}

{xbmin,ybmin,xbmax,ybmax}计算。

(2) Regression Branch

作者对每一个在heatmap上的关键点预测了一个8维度的变量来构建3D Bounding Box,

τ

=

[

δ

z

,

δ

x

e

,

δ

y

e

,

δ

h

,

δ

w

,

δ

l

,

sin

α

,

cos

α

]

T

\tau = [\delta_z, \delta_{x_e},\delta_{y_e},\delta_h, \delta_w, \delta_l, \sin \alpha , \cos \alpha]^T

τ=[δz,δxe,δye,δh,δw,δl,sinα,cosα]T。其中,

δ

z

\delta_z

δz表示深度的偏差;

δ

x

e

,

δ

y

e

\delta_{x_e},\delta_{y_e}

δxe,δye表示下采样导致的离散化偏差;

δ

h

,

δ

w

,

δ

l

\delta_h, \delta_w, \delta_l

δh,δw,δl表示边的维度;

sin

α

,

cos

α

\sin \alpha , \cos \alpha

sinα,cosα是偏航角

α

\alpha

α的矢量表示。因此,回归的大小是

S

r

R

H

R

×

W

H

×

8

S_r \in \R^{\frac{H}{R} \times \frac{W}{H}\times 8}

SrRRH×HW×8 。收到lifting transformation的启发,作者引入了类似的变换

F

F

F,用来转换投影的3D点到3D Bounding Box

B

=

F

(

τ

)

R

3

×

8

B = F(\tau) \in \R^{3 \times 8}

B=F(τ)R3×8

对于深度

z

z

z,它是由预先定义的尺度和偏移参数

σ

z

,

μ

z

\sigma_z, \mu_z

σz,μz计算得到的:

z

=

μ

z

+

δ

z

σ

z

z = \mu_z + \delta_z \sigma_z

z=μz+δzσz

所以,有了深度

z

z

z之后,与它投影的中心

[

x

c

,

y

c

]

T

[x_c, y_c]^T

[xc,yc]T和下采样偏差

[

δ

x

e

,

δ

y

e

]

[\delta_{x_e},\delta_{y_e}]

[δxe,δye]相结合,就可以得到3D坐标点:

[

x

y

z

]

=

K

3

×

3

1

[

z

(

x

c

+

δ

x

e

)

z

(

y

c

+

δ

y

e

)

z

]

\bigg[\begin{aligned} x \\ y\\ z \end{aligned}\bigg] = K_{3\times 3}^{-1} \bigg[\begin{aligned} z &\cdot (x_c+ \delta_{x_e})\\ z &\cdot (y_c+\delta_{y_e}) \\ &z \end{aligned}\bigg]

[xyz]=K3×31[zz(xc+δxe)(yc+δye)z]
而3D Bounding Box的长宽高,

[

h

,

w

,

l

]

[h, w, l]

[h,w,l],作者使用预先计算好整个数据集的category-wise average dimension

[

h

ˉ

,

w

ˉ

,

l

ˉ

]

[\bar{h}, \bar{w}, \bar{l}]

[hˉ,wˉ,lˉ]来计算。

[

h

w

l

]

=

[

h

ˉ

e

δ

h

w

ˉ

e

δ

w

l

ˉ

e

δ

l

]

\bigg[\begin{aligned} h \\ w\\ l \end{aligned}\bigg] = \bigg[\begin{aligned} \bar{h} \cdot e^{\delta_h} \\ \bar{w} \cdot e^{\delta_w} \\ \bar{l} \cdot e^{\delta_l} \end{aligned}\bigg]

[hwl]=[hˉeδhwˉeδwlˉeδl]

我们选择回归观测角度

α

\alpha

α,而不是偏航角

θ

\theta

θ

在这里插入图片描述

所以,偏航角为:

θ

=

α

z

+

arctan

(

x

z

)

\theta = \alpha_z + \arctan (\frac{x}{z})

θ=αz+arctan(zx)

最后3D Bounding Box的8个角点为:

B

=

R

θ

[

±

h

/

2

±

w

/

2

±

l

/

2

]

+

[

x

y

z

]

B = R_{\theta} \bigg[ \begin{aligned} \plusmn h/2 \\ \plusmn w/2 \\ \plusmn l/2 \end{aligned} \bigg] + \bigg[ \begin{aligned} x \\ y \\ z \end{aligned} \bigg]

B=Rθ[±h/2±w/2±l/2]+[xyz]

3. 损失函数

整体的Loss Function为:

L

=

L

c

l

s

+

i

=

1

3

L

r

e

g

(

B

^

i

)

L = L_{cls} + \sum_{i=1}^3 L_{reg}(\hat{B}_i)

L=Lcls+i=13Lreg(B^i)

(1) Keypoint Classification Loss

这一部分使用的是penality-reduced focal loss。可以从网络框架图中看到,粉红色的大小为:

H

4

×

W

4

×

C

\frac{H}{4} \times \frac{W}{4} \times C

4H×4W×C,其中

C

C

C代表C个类别,也就是每个类别有一个keypoint loss。假设

s

i

,

j

s_{i,j}

si,j是heatmap中位置

(

i

,

j

)

(i,j)

(i,j)预测的值,然后

y

i

,

j

y_{i,j}

yi,j为Gaussian Kernel中每个点的ground-truth值。

y

^

i

,

j

=

{

0

,

i

f

y

i

,

j

=

1

y

i

,

j

,

o

t

h

e

r

w

i

s

e

,

s

^

i

,

j

=

{

s

i

,

j

,

i

f

y

i

,

j

=

1

1

s

i

,

j

,

o

t

h

e

r

w

i

s

e

\hat{y}_{i,j} = \bigg \{ \begin{aligned} &0, \qquad if \quad y_{i,j} =1 \\ &y_{i,j}, \quad otherwise \end{aligned} , \quad \hat{s}_{i,j} = \bigg \{ \begin{aligned} &s_{i,j}, \qquad if \quad y_{i,j} =1 \\ &1-s_{i,j}, \quad otherwise \end{aligned}

y^i,j={0,ifyi,j=1yi,j,otherwise,s^i,j={si,j,ifyi,j=11si,j,otherwise

因此,分类损失为:

L

c

l

s

=

1

N

i

,

j

=

1

h

,

w

(

1

y

^

i

,

j

)

β

(

1

s

^

i

,

j

)

α

log

(

s

^

i

,

j

)

L_{cls} = -\frac{1}{N} \sum_{i,j=1}^{h,w}(1-\hat{y}_{i,j})^{\beta}(1-\hat{s}_{i,j})^{\alpha} \log(\hat{s}_{i,j})

Lcls=N1i,j=1h,w(1y^i,j)β(1s^i,j)αlog(s^i,j)

其中,

N

N

N是每张图片中关键点的数量。

(

1

y

i

,

j

)

(1-y_{i,j})

(1yi,j)对应于点ground truth位置的penalty reduction。

(2) Regression Loss

作者在每个feature map位置上对回归的尺度和角度参数添加了channel-wise activation,用来保持一致性。激活函数选择sigmoid function

σ

\sigma

σ和使用了L2 Norm。

[

δ

h

δ

w

δ

l

]

=

σ

(

[

o

h

o

w

o

l

]

)

1

2

,

[

sin

α

cos

α

]

=

[

o

sin

/

o

s

i

n

2

+

o

c

o

s

2

o

cos

/

o

s

i

n

2

+

o

c

o

s

2

]

\bigg[ \begin{aligned} \delta_h \\ \delta_w \\ \delta_l \end{aligned} \bigg] = \sigma \bigg( \begin{aligned} \bigg[ \begin{aligned} o_h \\ o_w \\ o_l \end{aligned} \bigg] \end{aligned}\bigg) - \frac{1}{2}, \bigg[ \begin{aligned} \sin \alpha \\ \cos \alpha \end{aligned}\bigg] = \bigg[ \begin{aligned} o_{\sin} / \sqrt{o^2_{sin} + o^2_{cos}} \\ o_{\cos} / \sqrt{o^2_{sin} + o^2_{cos}} \end{aligned}\bigg]

[δhδwδl]=σ([ohowol])21,[sinαcosα]=[osin/osin2+ocos2

ocos/osin2+ocos2

]

这里的

o

o

o 表示网络的输出。使用L1 distance来作为3D bounding box regression loss。

L

r

e

g

=

λ

N

B

^

B

1

L_{reg} = \frac{\lambda}{N} ||\hat{B} - B||_1

Lreg=NλB^B1

这里的

B

^

\hat{B}

B^是预测的变换,

B

B

B为ground-truth。

四、性能表现

在这里插入图片描述

在这里插入图片描述

五、 Conclusion

简单的单目3D目标检测,用在了新版本的APOLLO上。直接回归3D参数,没有通过2D Bounding Box。在构造回归分支的损失函数时,将多个属性对损失函数的贡献解耦,加速模型收敛。速度较快。

百度在Apollo7.0中也基于SMOKE框架开发出了一个新的基于视觉的障碍物检测模型,其针对SMOKE做了一些改进,并在waymo数据集上进行了训练和测试。改进点:

  • 使用常规卷积替换可变性卷积,从而能转换为onnx或libtorch,便于模型部署;
  • 增加了一个用于预测2D边界框中心点与3D边界框中心点投影之间的偏移量的head,然后将该偏移量与2D边界框中心点相加来替换- 原有的3D边界框中心点投影预测,以应对部分截断障碍物的3D中心点投影出现在图像以外区域,以至于被过滤掉的问题;
  • 原有的SMOKE框架没有预测2D边界框,Apollo在部署的时候仍然加入了2D边界框的预测。通过预测2D边框的中心点、宽度和高度,计算出障碍物的2D边框。

六、 Reference

  1. https://mp.weixin.qq.com/s/ZEI_gBM847QkzLmas-E5iQ

版权声明:本文为CSDN博主「Tianchao龙虾」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wuchaohuo724/article/details/123079867

Tianchao龙虾

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐