Key Points Estimation and Point Instance Segmentation Approach for Lane Detection
论文链接: https://arxiv.org/abs/2002.06604
一、Problem Statement
目前的车道线检测存在着一些缺陷,比如只能检测有限的车道线,较高的 false positive(检测不到车道线)。
二、Direction
提出了一个可以检测任意车道数的网络,并且这个网络具有低的false positive。这个网络可以输出车道线上的实际点,所以把这些生成的点的聚类问题当成是点云实例分割问题,因此提出的模型是segmentation based method。并提出后处理算法消除杂点。
三、Method
一、 Lane Instance Point Network
既然是网络的输出是车道线上的点,网络的基础结构就使用了hourglass network。首先其输入是512x256,然后经过一个resizing层和一个特征提取层。resizing layer使用的是一系列卷积层和池化层。特征提取层使用两个hourglass network。每一个hourglass network block有三个输出分支,分别是confidence, offset,和 feature。
来看一下这个网络的Loss,其包含三个部分:
L
t
o
t
a
l
=
a
L
c
o
n
f
i
d
e
n
c
e
+
b
L
o
f
f
s
e
t
+
c
L
f
e
a
t
u
r
e
L_{total}=aL_{confidence} + bL_{offset} + cL_{feature}
Ltotal=aLconfidence+bLoffset+cLfeature
1. confidence branch
confidence branch 预测每一个单元格的置信度。然后这个值会传递给下一个hourglass block,用来稳定训练。这个分支的loss为:
L
c
o
n
f
i
d
e
n
c
e
=
1
N
e
γ
e
∑
g
∈
G
e
(
g
c
∗
−
g
c
)
2
+
1
N
n
γ
n
∑
g
∈
G
n
(
g
c
∗
−
g
c
)
2
L_{confidence}=\frac{1}{N_e}\gamma_e\sum_{g\in G_e}(g^*_c-g_c)^2+\frac{1}{N_n}\gamma_n\sum_{g\in G_n}(g^*_c-g_c)^2
Lconfidence=Ne1γeg∈Ge∑(gc∗−gc)2+Nn1γng∈Gn∑(gc∗−gc)2
N e , N n N_e, N_n Ne,Nn表示存在点或者不存在点的单元格的数量。 G G G表示所有单元格, g c ∗ g_c^* gc∗是ground-truth, g c g_c gc是预测值。
2. offset branch
offset branch是用来找到每个点的确切位置。它的值在0-1区间,是相对于每一个单元格(grid)。offset branch有两个通道,分别预测x轴和y轴。
L
o
f
f
s
e
t
=
1
N
e
γ
x
∑
g
∈
G
e
(
g
x
∗
−
g
x
)
2
+
1
N
e
γ
y
∑
g
∈
G
n
(
g
y
∗
−
g
y
)
2
L_{offset}=\frac{1}{N_e}\gamma_x\sum_{g\in G_e}(g^*_x-g_x)^2+\frac{1}{N_e}\gamma_y\sum_{g\in G_n}(g^*_y-g_y)^2
Loffset=Ne1γxg∈Ge∑(gx∗−gx)2+Ne1γyg∈Gn∑(gy∗−gy)2
3. feature branch
这个分支的训练是用来使具有相同实例的网格特征更接近,不同实例的特征距离更远,是一个聚类的过程。看一下它的loss:
L
f
e
a
t
u
r
e
=
1
N
e
2
∑
i
N
e
∑
j
N
e
l
(
i
.
j
)
L_{feature}=\frac{1}{N_e^2}\sum_i^{N_e}\sum_j^{N_e}l(i.j)
Lfeature=Ne21i∑Nej∑Nel(i.j)
l
(
i
,
j
)
=
{
∣
∣
F
i
−
F
j
∣
∣
2
i
f
C
i
j
=
1
m
a
x
(
0
,
K
−
∣
∣
F
i
−
F
j
∣
∣
2
)
i
f
C
i
j
=
2
l(i,j)=\left\{ \begin{matrix} ||F_i-F_j||_2 & if &C_{ij}=1\\ max(0,K-||F_i-F_j||_2) & if & C_{ij}=2\\ \end{matrix} \right.
l(i,j)={∣∣Fi−Fj∣∣2max(0,K−∣∣Fi−Fj∣∣2)ififCij=1Cij=2
其中
C
i
j
C_{ij}
Cij表示点
i
,
j
\Large i,j
i,j 是否是同一个实例,如果是同一个实例,则等于1,否则为2。
F
i
F_i
Fi表示输出的特征点。
K
>
0
K>0
K>0是一个常量。然后使用简单的distance based 聚类算法区分点的类别。
二、 后处理算法
目的消除杂点,但是根据实际跑起来的程序来看,这个步骤处理的很慢,可以注释掉或者优化提升速度。步骤为:
- 找六个开始点。开始点是最低的点,三个来自最左边和三个来自最后边的点。如果预测的车道在图像中心的左边,最左边的三个点就会被选择。
- 选择三个最接近开始点的点。
- 从第一步和第二步选出的点中,做一条直线。
- 计算其他点和这个直线的距离。
- 计算在阈值范围内有多少个点。
- 选择计数大于阈值的点作为新的起始点,考虑该点与起始点属于相同的集群。我们将阈值设置为剩余点的20%
- 重复2-6步,知道在第二步中找不到点。
- 对所有起始点重复1-7步,最大聚类长度作为结果线。
- 对所有预测车道线重复1-8步骤。
三、 数据增强
通过翻转、平移、旋转、添加高斯噪声、亮度增强、增加阴影来进行数据增强。
四、Conclusion
简单明了的一个网络,但是TuSimple数据集较为简单,感觉源代码训练有点过拟合。实际运用起来效果也不错,再加上TensorRT加速可以有比较好的效果,但是精度会稍微下降。如果需要一条线段而不是点的话,可以采用多项式拟合。对一些边沿或者轨道,可以采用此网络进行检测。
References
1.https://zhuanlan.zhihu.com/p/115170109