参考代码:MapVR
动机与出发点
对于向量车道线的回归任务多采用L1损失做回归任务监督,但是这个损失函数本质上是关注每个点与GT的距离,而对于单个点与周围点乃至整个车道线实例之间的关系是没有建立约束关系的,而且整体上看向量车道线它具备空间几何结构,因而单单考虑某个点的loss并不是那么完备。再对比回归任务和分割的分类任务,这两者任务本质上就存在较大的差异,分类任务具备较强先验知识,因而相对回归任务会表现更加鲁棒,同时再结合分割任务需要的全局和局部感知特性,这也是这篇文章要将分割方向的loss引入到点的回归上来的原因。因而怎么把预测的向量车道线栅格化成为分割所用的mask呢?其实就是这篇文章的核心:如何设计一个满足似二值化的激活函数。
方法的作用域
文章的方法算作是在原本向量化车道线预测的基础上添加的额外损失,它将预测向量和GT向量栅格化为mask图像(栅格化的过程可导),并借用分割领域中的dice loss计算与GT的差异,也就是下图所示的情况
需要说明的是上图中描绘的线性结构和多边形结构这两者在栅格化过程上略有差异,但是大致的原理是一致的。
如何栅格化?
在理解栅格化之前需要了解点到线段的距离如何计算,不了解的可以参考:
要栅格化向量点那么就得先定义好mask表示的分辨率
H
∗
W
H*W
H∗W,同时将向量车道线
P
P
P的尺度缩放到与mask的尺度一致。在栅格化之前需要寻找到mask上每个点
(
x
,
y
)
(x,y)
(x,y)与向量车道线的最短距离(方法在上面已经贴出来了)
D
(
x
,
y
;
P
)
D(x,y;P)
D(x,y;P),然后经过下面设计好的激活函数的到这个点处的mask值:
I
l
i
n
e
(
x
,
y
;
P
)
=
e
x
p
(
−
D
(
x
,
y
;
P
)
τ
)
I_{line}(x,y;P)=exp(\frac{-D(x,y;P)}{\tau})
Iline(x,y;P)=exp(τ−D(x,y;P))
其中,
τ
\tau
τ表示平滑因子,越大mask的边界越平滑,越小mask的边界越锐利。文章给出的代码是CUDA实现的,其实Pytorch组件也能实现对应的功能,花了一点时间写完代码之后的效果如下(左边向量点,右边mask):
上面是对线性结构的处理,那么对于多边形结构呢?总的来讲流程大体差不多,但是需要区分多边形内还是多边形外,使用
C
(
x
,
y
;
P
)
∈
{
−
1
,
1
}
C(x,y;P)\in\{-1, 1\}
C(x,y;P)∈{−1,1}进行区分(正为内部,负为外部)。那么栅格化的处理过程描述为:
I
p
o
l
y
(
x
,
y
;
P
)
=
σ
(
C
(
x
,
y
;
P
)
⋅
D
(
x
,
y
;
P
)
τ
)
I_{poly}(x,y;P)=\sigma(\frac{C(x,y;P)\cdot D(x,y;P)}{\tau})
Ipoly(x,y;P)=σ(τC(x,y;P)⋅D(x,y;P))
其中,
σ
(
⋅
)
=
s
i
g
m
o
i
d
(
)
\sigma(\cdot)=sigmoid()
σ(⋅)=sigmoid()。
匈牙利匹配中代价函数替换
在之前工作用使用chamfer距离作为匹配距离的度量,这样的效果是不是那么好,由于文章的方法已经将向量车道线栅格化了,那么可以计算预测与GT之间的mask IoU,也就是下面的过程:
直观对比两种距离度量函数的差异,显然mask IoU的方式更好了
消融实验
诸如mask分辨率、平滑因子等对性能的影响
实验结果