《CondLaneNet:a Top-to-down Lane Detection Framework Based on Conditional Convolution》论文笔记

Posted m_buddy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《CondLaneNet:a Top-to-down Lane Detection Framework Based on Conditional Convolution》论文笔记相关的知识,希望对你有一定的参考价值。

参考代码:conditional-lane-detection

1. 概述

介绍:这篇文章针对车道线问题提出一种使用Conditional-Conv完成车道线检测的方案,其灵感源自于SOLO-V1&V2CondInst,将车道线不同实例的检测问题转换为了在求解其对应条件卷积所包涵的动态卷积参数问题,正是用这些对应的动态卷积参数去表示不同的车道线实例,这种思路与CondInst的构建原理最为相似。在这篇文章中除了用上述提到针对不同车道线实例的条件卷积之外,还通过row-wise车道线(点 )定位与对应offset预测的方式实现车道线(点)的确定和对应refinement工作 。针对车道线中存在弯曲与交叉的情况,文章还针对性只用Conv-LSTM网络(也就是文章中提到的RIM模块)去预测对应动态卷积参数,从而引入时序感知网络去增加对于特征图全局视角的感知,从而提升对于弯曲与交叉情况的适应能力。综合上述的改进点文章的方法就在一定程度上避免了segmentation-based、anchor-based、polygon-based方法中存在的一些局限问题。

下图展示了文章的方法在一些case下的适应能力,可以看到文章的方法在弯曲交叉的情况也能表现出一定程度的适应性。

2. 方法设计

2.1 整体pipeline

文章的整体方法总结如下图所示:

在文章中为了增加网络的视觉感知能力增加了Transformer-Block到编码器中,然后在高层次的特征图上使用Proposal head生成用于车道线定位和偏移的动态卷积参数,最后在Conditional shape head中使用动态卷积参数实现对应车道线的预测。在上图中描述的是带有RIM模块的实现版本(对应代码为CondLaneRNNHead),其实文章代码中还有一种直接在特征图上预测动态参数的实现版本(对应代码为CondLaneHead)。

2.2 编码器中的Transformer-Block

在编码器的最后一个stage上文章为了增加特征的感知能力串联了几个transformer模块,其使用到的transformer模块的结构见下图所示:

在编码器中有无Transformer-Block模块对于整体性能的影响,见下表所示:

2.3 Proposal Head

这部分的工作是实现动态卷积参数的预测,用于后序模块完成车道线的预测,以及实现车道线起点heatmap的预测。完成动态卷积参数的预测在文章中给出了两种类型的实现方式:直接预测与Conv-LSTM增强感知。这两种方式在对应的场景上有所区别,一种是对应常规车道线,另外一种是对应存在扭曲交叉的情况。

对于车道线heatmap的预测问题,文章分析了两种情况:使用车道线的中点(类似于CondInst)与使用车道线的起点,经过分析车道线在起点位置处的特征更加具有表征性,因而选择的是预测车道线的起点。之后再通过row-wise策略实现车道线的完成预测,只通过实例分割形式得到车道线在弯曲细长情况下会表现不好。

这里对起点heatmap的预测是通过focal loss实现的(heatmap包含的像素其label为1),其损失函数表达为:
L p o i n t = − 1 N p ∑ x y ( 1 − P ^ x y ) α l o g ( P ^ x y ) P x y = 1 ( 1 − P x y ) β ( P ^ x y ) α l o g ( 1 − P ^ x y ) otherwise L_point=\\frac-1N_p\\sum_xy \\begincases (1-\\hatP_xy)^\\alpha log(\\hatP_xy) & \\text$P_xy=1$ \\\\ (1-P_xy)^\\beta (\\hatP_xy)^\\alpha log(1-\\hatP_xy) & \\textotherwise \\endcases Lpoint=Np1xy(1P^xy)αlog(P^xy)(1Pxy)β(P^xy)αlog(1P^xy)Pxy=1otherwise
heatmap与动态卷积参数的生成是通过下面的这个模块实现的:

# mmdet/models/dense_heads/ctnet_head.py#L29
class CtnetHead(nn.Module):
    ...

2.3.1 直接预测

该方法是直接在FPN输出特征图上使用上面提到的CtnetHead模块完成对应的预测任务,之后得到heatmap和后序预测用的条件动态卷积参数,这部分代码可以参考:

# mmdet/models/dense_heads/condlanenet_head.py#L350
z = self.ctnet_head(f_hm)  # 预测车道线的起点heatmap与动态参数
hm, params = z['hm'], z['params']

params = params.view(m_batchsize, self.num_classes, -1, h_hm, w_hm)
params = params.permute(0, 1, 3, 4, 2).contiguous().view(-1, self.num_gen_params)
# 得到车道线在特征图尺度下的像素定位
mask_params = params[:, :self.num_mask_params].gather(0, mask_pos_tensor)
masks = self.mask_head(mask_branch, mask_params, num_ins)
# 得到车道线在特征图尺度下的像素偏移
if self.regression:
    reg_params = params[:, self.num_mask_params:].gather(0, reg_pos_tensor)
    regs = self.reg_head(reg_branch, reg_params, num_ins)

2.3.2 Conv-LSTM增强感知预测

在车道线存在交叉的情况下由于之前的方法在感知能力和范围上存在不足导致在该情况下表现不是很好,对此文章引入Conv-LSTM(文中将其称之为RIM模块)增强对车道线的感知能力,也就是下图图中所示的模块:

该模块每个 h i h_i hi的基础上使用一个全连接模块生成状态 s i s_i si和动态卷积参数 k i k_i ki,该生成状态的数量与车道线的数量相对应(适用于车道线大于1条的情况,对应标签生成处也有体现),这部分对应的代码实现可以参考:

# mmdet/models/dense_heads/condlanenet_head.py#L711
for _ in range(r_times):
    rnn_out, hidden_state = self.rnn_ceil(  # Conv-LSTM
        inputs=rnn_feat_input,
        hidden_state=hidden_state,
        seq_len=1)
    rnn_out = rnn_out.reshape(1, -1, 1, 1)
    k_param, state = self.final_fc(rnn_out)  # 得到stage和动态卷积参数
    k_param = k_param.squeeze(-1).squeeze(-1)

对于状态部分的损失函数使用的是二值交叉熵的形式,其定义为:
L s t a t e = 1 N s ∑ i − [ y i ⋅ l o g ( s i ) + ( 1 − y i ) ⋅ l o g ( 1 − s i ) ] L_state=\\frac1N_s\\sum_i-[y_i\\cdot log(s_i)+(1-y_i)\\cdot log(1-s_i)] Lstate=Ns1i[yilog(si)+(1yi)log(1si)]

2.4 Conditional shape head

在这部分中完成的便是对于准确车道线的预测,需要注意的是这里车道线的预测都是基于实例级的,这也正对应文章标题中的Conditional的概念。因而下面的内容都是针对于一条车道线而言的。这部分车道线的预测包含了3个部分:车道线在特征图尺度上像素定位、车道线的高度、车道线在特征图尺度上与真实位置的偏移量。

对于一个输入的特征图(stride=8)可以将其在横纵两个方向进行划分,得到对应的X、Y轴,也就是下图中表示的样子。

车道线位置定位:
对于车道线位置确定这里是将其转换为概率分布问题,首先定义第 i i i行上车道线存在概率分布描述为:
p i = s o f t m a x ( f l o c i ) p_i=softmax(f_loc^i) pi=softmax(floci)
那么当前行上所需要预测的车道线的像素位置被描述为离散积分的形式:
E ( x ^ i ) = ∑ j j ⋅ p i , j E(\\hatx_i)=\\sum_jj\\cdot p_i,j E(x^i)=jjpi,j
则对应的损失函数描述为:
L r o w = 1 N v ∑ i ∈ V ∣ E ( x ^ i ) − x i ∣ L_row=\\frac1N_v\\sum_i\\in V|E(\\hatx_i)-x_i| Lrow=Nv1iVE(x^i)xi

车道线位置偏移:
在拿到特征图维度的车道线定位之后接下来便需要对车道线的具体位置进行确定,这里采用的是相对真实位置偏移的形式,其损失函数描述为:
L o f f s e t = 1 N Ω ∑ j , i ∈ Ω ∣ δ ^ i , j − δ i , j ∣ L_offset=\\frac1N_\\Omega\\sum_j,i\\in\\Omega|\\hat\\delta_i,j-\\delta_i,j| Loffset=NΩ1j,iΩδ^以上是关于《CondLaneNet:a Top-to-down Lane Detection Framework Based on Conditional Convolution》论文笔记的主要内容,如果未能解决你的问题,请参考以下文章

20170924 a20170924 a

a++和++a的区别

逻辑代数

python运算符

运算符

arraylist排序 例如值 a104,a106,a102,a92,a98,a94 结果a92,a94,a98,a102,a104,a106