zoukankan      html  css  js  c++  java
  • 【Papers】Robust Lane Detection via Expanded Self Attention 论文解读

    论文题目:Robust Lane Detection via Expanded Self Attention

    链接地址:https://arxiv.org/abs/2102.07037

    文章核心想要解决的是车道线遮挡、缺失、模糊等情况下的识别精度问题。主要通过一个自注意力模块,增强网络对于这部分车道线的关注程度,从而提升效果。

    1. 概述

    1.1 问题定义

    这里的 Lane Detection,检测的目标是抽象意义上的车道分隔线,更关注全局的几何特征;

    而不是路面上印刷的 Lane Mark,如果目标是 Lane Mark,则不存在遮挡的问题,能看到什么就识别什么,目标非常明确,且更关注局部特征。

    至于为什么把识别目标设定为 Lane 而非 Lane Mark,我想很重要的一个原因是,像素级的 Lane Mark 标注成本远高于用折线段标注的 Lane。目前可用的公开集,也大部分都是 Lane 的形式。

    1.2 问题分析

    相比于其他更一般化的待识别对象,车道线有很多明显的特点:

    • 细长的外观形态
    • 很强的透视关系
    • 不同目标之间有明显的相互约束

    这些都指向了一个结论,Lane Detection 非常依赖全局信息(global contextual information)。

    说到增强全局信息,有以下几个思路:

    1. 增大每一个输出像素的感受野(尽量覆盖到全图尺度),而增大感受野的方法,比如:

      • 增加卷积层数,卷积核大小(很影响效率)
      • 使用池化层(近期的网络设计,很多都通过Conv层的Stride设置来实现降采样,很少用Pooling)
      • 使用空洞卷积

      但单纯增大感受野的效果其实是存疑的,因为感受野是类似一个向外扩散的圆形高斯核,既与图片的矩形不符,也与车道线的线形不符,效率可能比较低。

    2. 做更充分的多尺度特征融合,以FPN、PANet、BiFPN这些方法为主。

    3. 加入直接利用全局信息的模块,如:

      这些方法一般计算量都不低,实际能够提升的效果与付出的代价之间,需要结合使用场景来考量。

    4. 摒弃CNN的套路,考虑从Transformer/DETR这一路线来解决 Lane Detection, 而问题的关键可能在于如何定义要识别的目标。可能的路线包括但不限于:

      • 直接回归方程参数(与相机内外参强绑定)
      • 将车道线打散成小的线段,检测线段(相对折中的方案,与DETR有可比性)
      • 像素级分割(后处理更复杂)

    1.3 本文方法

    本文中增强全局信息的方法为,给网络增加一个 Expanded Self Attention (ESA) 模块。这个 ESA 模块利用车道线预测结果的 Confidence, 来指示车道线的清晰程度。

    这个模块不需要对车道线被遮挡部分进行额外的标注,因此称之为 Self Attention

    2. 具体方法

    2.1 ESA模块

    2.1.1 模块结构

    原文关于 ESA 的结构和解释如下:

    image-20210407145821028

    一个简单的理解,分为 HESAVESA,分别对应水平和垂直方向,输出特征尺度分别为C*H*1C*1*W,并统一扩展成C*H*W,称之为 ESA matrix

    ESA matrix 作为一个注意力图,与主干网络输出的特征图进行点乘( element-wise product),得到注意力加权后的特征图。

    原文中提到 ESA 为一个不影响网络推理速度的方法,因此该模块应该只存在于训练过程中。在执行推理预测的使用环节是不需要的,它的影响已经在训练环节中作用到了车道线检测结果的输出中。

    2.1.2 模块输出

    对于 ESA 的输出,作者也给出了一个示例:

    image-20210407152402548

    可以看到,当线比较清晰时,ESA 的输出值较高(基本在0.5以上);而车道线被遮挡的部分,对应的 ESA 的输出值比较低(大致在0~0.25之间)。而不存在车道线的部分(天空),输出为0。

    2.2 整体模型

    2.2.1 模型结果

    原文关于网络模型的结构和解释如下:

    image-20210407150429512

    2.2.2 输出形式

    一个简单的理解,模型为典型的 Encoder-Decoder 结构,输出有三个分支:

    • Segment Branch:输出车道线检测的分割结果

    • Existence Branch:输出每一条车道线是否存在的二分类结果

      这里需要根据车道线位置预设每一条线的编号,这种方式只适合用来刷公开集,无法解决车辆压线/换道过程中的跳变问题,且可识别的车道线数量有上限。

    • ESA Branch:输出每一条线在水平或者垂直方向上的Confidence,生成 ESA matrix

    2.2.3 Loss函数

    **ESA matrix ** 分别与 Segment Branch 输出的特征图,以及作为 Ground-Truth 的特征图,进行点乘,生成加权后的特征图(weighted probability map / weighted gt map)。

    对加权后的 Probability-mapGT-map 计算 ESA loss,再叠加常规的 Segmentation lossExistence loss

    ESA loss 形式如下,包括两项:

    image-20210407151630643

    • 第一项为对两个特征图使用标准的 MSE-loss。
    • 第二项是一个正则项,主要含义是使得 ESA 的输出均值趋向于 GT-map 均值的一个百分比。根据原文所述,如果不加这个正则项,则 ESA 的输出永远是0(因为加权权重为0,则输出为0,loss也就为0,是最小的)。

    2.3 推理效果

    原文作者对比了几种典型的 Lane Detection 方法。从给出的例子来看,对于车道线模糊不清的场景,确实效果有所提升。

    image-20210407152113399

    具体的量化对比可以看原文。

    3. 问题和思考

    3.1 可借鉴处

    对于本文提出的方法,我觉得思路上可以借鉴的地方为:

    常规的路况下,其实各种已有的车道线检测网络效果都已经做得比较接近,实际使用中的差别主要体现在各种 Corner Case 上, 而车道线被遮挡/模糊不清,可能是最主要得解决的场景。

    在模型容量受限的情况下,应该让模型的识别能力更多关注到这些比较难处理的场景和部分,自然而然的想法就是引入注意力机制。

    Self Attention 作为一种不需要额外监督信息的 End-to-End 方法,理论上很适合应用在这个场景。

    3.2 疑惑之处

    截至目前,原作者还没有发布源码,只能从文章的描述中去推测一些实现细节。

    有一个很关键的点,我还没有想通,也没有在原文中找到解答。

    根据原文所述,ESA module 输出的是车道线识别的 Confidence,即越确定的地方,输出越高,这一点也可以从文中 Figure 4 得到印证。

    将这个输出作为注意力通道,对提取的特征图进行加权,直觉上感觉应该是加强了网络对于车道线清晰部分的注意力,而非加强了被遮挡区域的注意力。结合文中 Figure 5 的解释,画面中部车道线清晰的地方,得到的 MSE loss 低;而画面下部车道线模糊的地方,得到的 MSE loss 高。

    那么,随着训练收敛程度的增加,是否会产生这样的情况: ESA 的输出对于车道线清晰的部分,响应越来越强烈,导致 ESA loss 越来越关注车道线清晰的部分,车道线模糊的部分更加没有得到充分的关注和训练。

    image-20210407154335908

    我的一种猜测是:

    是否在加权过程中,实际上对 ESA 的输出进行了取反,即 Confidence 越低的地方,加权的权重越高,从而让模型更加关注车道线模糊的地方。

    但这里又存在一个问题,即画面上部天空的位置,是不存在车道线的,ESA 输出理论上为0,这样的话,加权的权重最大,网络又会关注到天空中不存在车道线的位置。

    可能是我读得不够仔细,没看到这个关键点,也可能是我对 Self Attention 这种机制的理解有误。也许只能等作者放出源码后,看看实际的实现方式是怎样的。

  • 相关阅读:
    python--向钉钉群发送消息(亲测可用)
    python--注册钉钉回调事件(亲测可用)
    Gradle
    SpringBoot 中thymeleaf模板引擎的使用
    SpringBoot对静态资源的映射规则
    SpringBoot的日志使用
    rsync实现文件同步
    python学习: 优秀Python学习资源收集汇总--转
    Python高级特性: 12步轻松搞定Python装饰器
    Python常见问题
  • 原文地址:https://www.cnblogs.com/lylec/p/14628198.html
Copyright © 2011-2022 走看看