车道线检测经典论文SCNN复现(https://arxiv.org/abs/1712.06080)

SCNN在当时取得了Tusimple比赛第一名成绩,我们开源一个基于PaddlePaddle的车道线检测Tookit: PPlanedet,感兴趣的帮忙点点Star,谢谢啦~

1、摘要

在这里插入图片描述

     在本文中,提出了Spatial CNN(SCNN),它将传统的深层逐层(layer-by-layer)卷积推广到特征映射中的逐片(slice-by-slice)卷积,从而实现层中行和列之间的像素之间的消息传递。这种SCNN特别适用于长的连续形状结构或大型物体,具有强烈的空间关系但外观线索较少,例如交通车道,电线杆和墙壁。

2、引言

    虽然基于CNN的方法通过强大的表现学习能力将场景理解推向了一个新的水平。对于具有长结构区域并且可以被遮挡的物体,它仍然表现不佳,例如图1中红色边界框中所示的车道标记和杆子。然而,人类可以容易地从上下文(即可视部分)推断它们的位置并填充在被遮挡的部分中。

    为了解决这个问题,我们提出了空间CNN(SCNN),即深度卷积神经网络向丰富空间层次的推广。在逐层CNN中,卷积层接收来自前一层的输入,应用卷积运算和非线性激活,并将结果发送到下一层。该过程按顺序完成。类似地,SCNN将feature map的行或列视为层,并顺序地应用卷积,非线性激活和求和操作,形成了一个空间上的深度神经网络。以这种方式,信息可以在同一层中的神经元之间传播。它对于具有遮挡的结构物体(例如车道,杆或卡车)特别有用,因为空间信息可以通过层间传播来加强。如图1所示,在CNN不连续或杂乱的情况下,SCNN可以很好地保持车道标记和杆的平滑性和连续性。在我们的实验中,SCNN明显优于其他基于RNN或MRF / CRF的方法,并且比更深层次的ResNet-101结果更好。

3、相关工作

    有一些其他尝试在神经网络中利用空间信息:使用递归神经网络沿每行或每列传递信息,因此在一个RNN层中,但每个像素位置只能从同一行或列接收信息。有工作使用LSTM的变体以在语义对象解析中利用上下文信息,但是这样的模型在计算上是昂贵的。研究人员还尝试将CNN与MRF或CRF等图形模型结合起来,其中消息传递通过与大内核的卷积来实现。

    SCNN相对于上述方法有三个优点:

(1)顺序消息传递方案比传统的密集MRF / CRF具有更高的计算效率,

(2)消息传递使用的是残差,使得SCNN易于训练,

(3)SCNN是灵活的,可以应用于任何级别的深度神经网络。

4、车道线检测数据集

    Caltech Lanes Dataset和最近发布的TuSimple Benchmark Dataset(TuSimple 2017)由1224和6408个图像组成,分别带有带注释的车道标记,而交通则处于受限情景中,具有轻便的交通和清晰的车道标记。此外,这些数据集中没有一个注释被遮挡或由于磨损而看不见的车道标记,而这种车道标记可以由人推断并且在实际应用中具有高价值。

    论文提出的数据集是由六辆车在北京不同时间录制的,共收集了133,235 张图片,超过TuSimple 数据集20倍。论文分成88880张作为训练集, 9675作为验证集,34680做测试集。图像的大小为1640×590。将测试集分为正常类和8个具有挑战性的类别,这些类别对应于图2(a)中的9个示例。图2(b)显示了每种情况的比例。可以看出,8个具有挑战性的场景占据了数据集的大部分(72.3%):

在这里插入图片描述

5、Spatial CNN

    传统的空间关系建模方法基于概率图模型的,如马尔可夫随机场(MRF)或条件随机场(CRF)。最近的工作将概率图与CNN结合起来,都遵循图3(a)的流程,CRF可化为平均场,算法可以用神经网络来实现,具体来说,过程分为:

(1)标准化:CNN的输出作为一元势函数,并通过Softmax操作标准化

(2)信息传递:可通过大内核的逐通道卷积实现(对于DenseCRF,内核大小将覆盖整张图片,内核权重取决于输入图像)

(3)兼容性转换:使用1×1的卷积实现

(4)添加一元势:整个过程迭代N次得到最终输出
在这里插入图片描述

    可以看出,在传统方法的消息传递过程中,每个像素接收来自所有其他像素的信息,非常耗费计算并且难以用于实时任务。对于MRF,大卷积核很难学习,并且通常需要仔细初始化。此外,这些方法应用于CNN的输出,而包含更丰富信息的顶部隐藏层也许可以更好的建模空间关系。

    论文提出了Spatial CNN,这里的Spatial不是指Spatial Convolution,而是通过特殊设计的CNN架构传递空间信息。SCNN更有效的学习空间关系,能平滑的找出连续的有强先验的结构目标。

    如上图(b)的“SCNN_D”模块所示,考虑应用于尺寸为C×H×W的3-D张量的SCNN,其中C,H和W分别表示通道,行和列的数量。张量将被分割成H个切片,然后将第一个切片发送到尺寸为C×ω的有C个卷积核的卷积层,其中ω是卷积核宽度。在传统的CNN中,卷积层的输出然后被馈送到下一层,而此处输出被添加到下一个片以作为新的片。然后将新切片发送到下一个卷积层(这里卷积核共享),此过程将继续,直到更新最后一个切片。

6、实验结果

在这里插入图片描述

7、代码复现

# spatial convolution 代码复现如下
class Spatial_convolution(nn.Layer):
    def __init__(self,in_channel,out_channel):
        super().__init__()

        self.conv_d = nn.Conv2D(in_channel, out_channel, (1, 9), padding=(0, 4), bias_attr=False)
        self.conv_u = nn.Conv2D(in_channel, out_channel, (1, 9), padding=(0, 4), bias_attr=False)
        self.conv_r = nn.Conv2D(in_channel, out_channel, (9, 1), padding=(4, 0), bias_attr=False)
        self.conv_l = nn.Conv2D(in_channel, out_channel, (9, 1), padding=(4, 0), bias_attr=False)


    def forward(self, x):
        x = x.clone()
        for i in range(1, x.shape[2]):
            x[..., i:i+1, :].set_value(x[..., i:i+1, :] + F.relu(self.conv_d(x[..., i-1:i, :])))

        for i in range(x.shape[2] - 2, 0, -1):
            x[..., i:i+1, :].set_value(x[..., i:i+1, :] + F.relu(self.conv_u(x[..., i+1:i+2, :])))

        for i in range(1, x.shape[3]):
            x[..., i:i+1].set_value(x[..., i:i+1] + F.relu(self.conv_r(x[..., i-1:i])))

        for i in range(x.shape[3] - 2, 0, -1):
            x[..., i:i+1].set_value(x[..., i:i+1] + F.relu(self.conv_l(x[..., i+1:i+2])))
        return x
#安装 paddleseg
!pip install paddleseg
#解压数据
!unzip -d data/ data/data119539/train_set.zip
!rm -rf data/readme.md
Archive:  data/data119539/train_set.zip
#解压测试集
!unzip -d data/ data/data119539/test_set.zip
#copy 测试集标签
!cp data/data119539/test_label.json data/
%cd pplandet/
#安装必要的库
!pip install -r requirements.txt
#按照数据集格式生成分割的标签
!mkdir /home/aistudio/data/seg_label
!python tools/generate_seg_tusimple.py --root /home/aistudio/data/ --savedir /home/aistudio/data/seg_label/
#开启训练
python train.py \
        --config configs/scnn/resnet50_tusimple.yaml \
        --do_eval \
        --use_vdl \
        --save_interval 1000 \
        --num_workers 4 \
        --save_dir output

在Tusimple上复现的accuracy为93.70%,运行下面的代码体验一下吧

#验证结果
python val.py \
       --config configs/scnn/resnet50_tusimple.yaml \
50_tusimple.yaml \
       --model_path output/ #please change to your model path

8、总结

1、SCNN作为车道线检测经典方法,提出了spatial convolution提取更加细致的空间特征;

2、目前SOTA的车道线检测方法大多为基于关键点检测的,但学习SCNN思想还是能学到很多。

参考文献

Spatial As Deep: Spatial CNN for Traffic Scene Understanding

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐