# lane_seg **Repository Path**: gtyelv/lane_seg ## Basic Information - **Project Name**: lane_seg - **Description**: 车道线分割,来源:https://aistudio.baidu.com/aistudio/competition/detail/5 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-09-08 - **Last Updated**: 2026-02-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: PyTorch, 项目 ## README ## 目录 [TOC] ## §1 项目说明 #### 1.1 项目目标、来源 - 项目目标 使用百度比赛数据集、tf2x框架,使用深度学习方法,实现实时的车道检测 - 来源 [无人车车道线检测挑战赛 - 飞桨AI Studio - 人工智能学习实训社区](https://aistudio.baidu.com/aistudio/competition/detail/5),详见§2 #### 1.2 版本 - v4x 版本在 v2x 基础上做了较大更新: 1. 更新了实现算法 调研了车道检测算法 + 参考比赛方案,仍然采用语义分割思路,选用了ENet实现 参考了比赛冠军/亚军方案的数据集处理策略和训练策略 2. 采用 tf2x 实现 3. 训练数据可视化 编写了训练数据可视化的测试代码,检验训练过程数据管道的正确性 #### 1.3 算法思路 - 概述 1. 背景 比赛时间是2018年底到2019年初,当时的车道检测DL算法主要还是作为图像分割问题、DL算法被嵌入到传统的车道线检测workflow中。 2. 赛题任务 “赛题说明 - 比赛任务”明确“预测…每一个像素所属的类别”(无需区分实例),即将车道检测问题作为语义分割问题来研究解决。(i.e. 车道线检测之基于语义分割的方法) 3. 数据集 本比赛使用的是 ApploScape 数据集。 4. 解题思路 本次工作将综合参考比赛冠军方案、车道检测的DL算法,作为语义分割问题/采用车道线检测基于语义分割的DL算法 来尝试解决。 - DL算法——采用语义分割方法 - 采用:ENet 车道分割基于语义分割的方法,代表性的算法包括LaneNet、SCNN、SAD等。其中,LaneNet、SAD的语义分割部分都是基于ENet做的修改;相比而言,SCNN计算速度慢很多、在TuSample/CULane/BDD100K上的性能已被SAD达到。 ENet在2016年被提出,是一款轻量化的、性能不差的语义分割模型。在参数量上,论文给出的参数量为0.37M,本项目用tf2x复现模型的参数文件约为2.5M。在性能上,ENet的encoder部分在Imagenet上top-1 accuracy接近ResNet_18、计算速度约为2.24x;论文给出在CityScapes/CamVidSegNet的预测结果基本持平。 决定选用ENet实现项目。 - 可以进一步对比ENet-SAD与经典的语义分割算法的性能。 - 训练框架 2. 包括:准备模型、准备数据、训练 3. 比赛用数据类别说明 虽然样本含有33个类别(Id/classId),但本次比赛任务按9个类别(trainId/catId),即将类别做了合并。 注:①含背景类别;②其中第trainId=4类实际样本数为0,所以实际只有8个类别。 对于类别合并带来的预测颜色标签如何表示的问题,可以对每个trainId指定对应classId中的其中之一color即可。 e.g. classId = {216,217,215} → color = {(153,153,153), (220,220,0), (102,102,156)} → trainId = {3},那么, 取 trainId = {3} → color = {(153,153,153)} 提交预测结果要求:需要提交Id instead of color,那么选取其中之一的Id即可。 #### 1.4 工程实现 ##### Section_1_准备数据 > - 数据总貌 > > - 类别标签 > 准确生成数据标签非常重要,标签生成错误将对后面的训练和预测带来不少困难,同时排查耗时费力,因此最好一开始就小心翼翼,仔细反复核对。 > > 赛题给的标签映射规则显得比较混乱,容易产生一些疏漏:**原映射表**给出image_color 一一映射到 label_classId,但比赛分类使用的trainId不是一一映射。 > > 因此,根据给出的映射规则,重新梳理出一张**比赛用映射表**,可以清晰反映各类别像素值和训练标签对应关系。根据该表再去编写处理脚本,读取所有标签灰度图将灰度值根据映射表转换为trainId(0~8)。 > 注意,trainId=0类别,不仅包含原映射表中的classId=0,为了节省计算资源加速训练,只对有效数据训练,还包含了所有ignoreInEval=True的类别。 > > 灰度图标签转换很耗时,可以启用多个线程或进程同时处理,同时要避免非常耗时的粗暴的逐像素遍历方式,使用python可用numpy矩阵进行快速转换。 > > | classId | trainId | choose_color | 类别描述 | 颜色 | > | -------------------------- | ------- | ------------ | ------------------ | ---- | > | 0 & ignored | 0 | 0,0,0 | 背景、被忽略的类别 | 黑 | > | 200,204,209 | 1 | 70,130,180 | 实线 | 浅蓝 | > | 201,203 | 2 | 0,0,142 | 虚线 | 深蓝 | > | 217 | 3 | 220,220,0 | 停止线 | 黄 | > | | 4 | | 赛题中不含这一类别 | | > | 210 | 5 | 128,64,128 | 车位线 | 深紫 | > | 214 | 6 | 190,153,153 | 斑马线 | 粉 | > | 220,221,222
224,225,226 | 7 | 180,165,180 | 导向线 | 紫灰 | > | 205,227,250 | 8 | 250,128,0 | 黄网格等 | 橙 | > > - 样本均衡 > 在准备训练数据时,还需要考虑样本平衡问题。 > > 1. 编写脚本统计比赛用的类别(排除掉Road03,共有样本14264个)在样本中所占的比例。 > > `./_aux/count_sample_distribution.py` 仅统计分析了“有效占有样本数量”: > trainId 0 1 2 3 4 5 6 7 8 > num 40191, 24702, 16090, 12415, 0, 5619, 13550, 30614, 10854 > scale 4.0 2.5 1.6 1.2 0 0.6 1.4 3.1 1.1 > > 可见,若仅从有效占有样本的角度,第1、7类可以不用扩充,其他类可扩充至2.5w个左右:第2、3、6、8类可以扩充至现有样本数的2倍,第5类可以扩充至现有样本数的5倍。 > > 样本均衡策略分析:但考虑到第1,7类样本数/样本总数≈1.73,2.15,表明很大概率上所有样本中都有以上两类。仅采取对样本的数据增强生成新样本,来扩充其他类样本的比例,是达不到的,因为这样做只会造成马太效应使得多者更多。能够实现的方法,只能通过滑窗策略,截取除第1、7类以外的其他类的小尺寸样本,才能提高这些类的样本在总体中的比例。截取小尺寸样本的方法,除手工操作外,暂时没有想到其他方法。样本增强的策略暂时不实施。 > > 2. ~~选出第5类和第2、3、6、8类的数据,生成文件路径表,准备用于做数据增强生成新的数据集。~~ > `./_aux/generate_new_dataset.py` > > 在比赛用映射表的基础上,参考比赛亚军方案的分析—— > > - 统计指标 > > 定义了概念“有效类别像素块”“有效占有样本”“有效占有样本数量”“有效类别像素点总数”“有效类别像素点平均数”。 > > 其中的后三个指标,被用于衡量样本均衡情况。 > > ①有效类别像素块——“类别像素块”指的是某类别像素点8邻域连通构成的区域,“有效类别像素块”要求类别像素块需要大于设定阈值。有效类别像素块可以避免噪声像素点造成的误统计。 > > ②有效占有样本(指标1)——某样本含有某类别的有效类别像素块,就算作该类别的“有效占有样本”。 > > ③有效类别像素点总数(指标2)——某类别所有有效占有样本的全部有效类别像素块的像素点总数。 > > ④有效类别像素点平均数(指标3)——由③/②得到。因此,若②和③都均衡了,那么自然地④也就均衡了。 > > - 统计结果 > 对9个类别(其中的第4类不含样本)统计发现—— > 指标1:第1、2、7类别最高,第3、6类别次之,第5、8类别最少; > 指标2:第1、2、7、6最高为近同一数量级、第3、5、8类别次之; > 指标3:第6、1、2、7最高为近同一数量级、第3、8、5类次之。 > > - 调整实现样本均衡的思路 > > 对数据均衡同时兼顾均衡有效占有样本数量及有效类别像素点总数,优先均衡有效占有样本,以此基础尽可能均衡有效类别像素点总数。 > > i.e. 用数据增强的方法,首先均衡有效占有样本数量;由于不同的样本所含的有效类别数量/有效类别像素点都不同,可以通过恰当选用样本去做数据增强的方法,同时兼顾到有效类别像素点总数。 > > 从统计上,这样可以达到样本均衡的效果;但实际影响模型训练效果的因素不只样本均衡情况,例如若选用了环境条件很好的容易样本可能就不如难样本对训练的贡献更大。总而言之,精心选用样本去做数据增强/随机选用样本去做数据增强,两者效果相差多少,定性分析难以给出结论。 > > 本项目采取——考虑到冠军方案效果更好并给出了代码,使用比赛冠军的数据增强方案(随机地做数据增强,或者不做数据增强)。 > > - 异常数据清洗 > > 数据清洗方面,需要将数据标签可视化出来观察。 > 根据以上标签映射表,每个标签都对应一个伪彩色。将标签按比赛用映射表生成伪彩图,然后与真实图像加权叠加blending,可以直接观察判断标签是否有误。 > 但对总量达到约67000条的数据都采用人工观察的方式剔除异常数据,工作量还是太大了,因此需要配合一定的策略来减少人工审核工作量。 > > 出于效率的考虑,数据清洗在准备工作、模型训练过程和结束都可以进行。 > 模型训练loss的突然抖动、预测图像iou偏小都一定程度上说明了数据存在问题或训练效果不佳。对这些数据进行人工审核,可以大大缩小审核范围。 > 反复进行这个过程,完成标签错误、缺少标签、图像过曝等问题数据的删除。 > > 本项目采取的方式——参考冠军方案发现的过曝问题,舍弃了Road03样本。 > > - 训练数据过大问题 > > 图像大小为1710×3384,利用 deeplabv3+ 的 baseline 训练只能设置batch size为1,训练效率低、过小的batch size也会导致准确率较低。因此,有必要解决图像过大、batch size太小的问题。 > > ①剪裁策略——首先观察图像数据,容易发现,图像的上方1/3区域是车载摄像头拍摄的建筑、天空等非路面信息,没有任何正样本存在,也就是说该区域的所有像素点都属于背景类别。所以这部分区域可以不必训练和预测,我们将这块区域给裁掉可以节约训练成本,设置裁剪高度为690像素可以保证没有路面信息被误裁,裁后图像尺寸为1020×3384。 > > ②降低分辨率策略——其次容易想到的一个点,是将图像比例缩小再进行训练和预测,之后反比例还原,可以得到最终的预测结果。 > 比例缩小方式通过牺牲一定的图像空间细节,可减少大量的计算,节省的显存可以设置更大的batch size,因此模型收敛速度相对很快,准确率可以达到更高。这种方式要注意把握平衡点,过大的比例会造成过多的细节丢失,同时预测还原的时候容易出现明显锯齿边缘影响精度。 > 在前期为了得到快速收敛,可以先用大比例得到预训练模型,再设小比例,在预训练模型上进行finetune。这个finetune的过程可以反复设小比例继续,直到达到表现最佳状态。 > > 以上方法一般针对模型的整图输入策略,指将整张图输入网络直接训练;也可用于滑窗策略,在降低图像分辨率的同时,同比例减小滑窗尺寸大小。 > > ③滑窗策略——baseline的滑窗策略通过设置crop size,对输入整图随机裁剪,将裁减出来的部分图像送入网络训练。滑窗策略将完整的场景碎片化,聚焦于多个基本构成元素,在复杂场景下表现突出。类似于UNet的训练策略。 > baseline的crop size设置为769*769,我们通过设置多个不同的尺寸可以得到不同尺度的信息处理能力,同时crop size设小可以设置更大的batch size。 > 不同crop size的设置可以引入多尺度信息处理,若考虑将这些多尺度信息进行融合,这就涉及到模型融合了(详细在后面网络部分展开)。 > > 亚军方案给出了在GTX1080的8G显卡上crop size和batch size参考对应关系:(769,769)-1; (512,512)-4; (412,412)-6; (360,360)-8; (320,320)-10; (290,290)-12; (270,270)-14; (256,256)-16 > > 本项目采取——剪裁策略,降低分辨率策略。 > > - ~~生成比赛用标签文件~~ > 舍弃掉Road03、将classId转换为trainId,保存成新的.png? > 没必要。 > > - ^准备数据^ 裁掉样本的无效区域 > 裁掉图片最上部的3384x690的图像 `1710*3384 - 690*3384 = 1020*3384, 约占1/3`,因为这部分都是天空和树木,没有正样本,裁掉后还可以减小图像的压缩比例。 > > - ^准备数据^ 舍弃噪声样本:解决分布漂移问题 > 发现 road_3 存在几乎一半以上图像过曝的问题;并且 road_3 大多在强光下拍摄,不符合测试集的分布。舍弃 road_3可以提高模型性能。 > 另外 road_2 和 road_4 中也存在过曝样本。 > > - ^准备数据^ 数据增强:解决类别不平衡/分布漂移问题 > 由于第5类和第8类训练数据较少(但是测试集中占比不少),可以针对这两类做数据增强。 > > - **框架>>>代码** > > 1. 提取生成样本文件路径的文本记录文件(剔除road_3数据) > √①直接从数据集中删除Road03目录,而后生成文本记录文件 > ×②生成文本记录文件后再删 > > 2. 样本文件路径 --(pipeline)-> 样本数据,提供给训练过程 > 将训练用的数据(经剪裁/分辨率调整/数据增强/预处理后)送模型 > √①用 tf.data.Dataset > ?②用 generator + np + imgaug > P.S. 若是做成.TFRecord文件,那么分辨率调整留到最后做 > P.S. 使用tf.data.Dataset做数据增强,仅能使用简单的方法,没有IAA库丰富。可以提前用IAA库做完数据增强后保存为新数据库,训练时以一定比例掺杂使用。 > > P.S. 暂不使用数据增强,不知道做到什么程度合适,有可能不利于训练。 > > ```python > ### data_FLOW > image/label_path --[..]-> RGB/Gray > RGB/Gray --[裁掉上部/分辨率调整/数据增强/预处理]-> RGB/Gray > ``` > > 3. ~~可视化工具,用于检查pipeline过程正确~~ > ①采用端到端的检查方式。参考亚军方案在数据清洗检查异常数据中描述的人工审核的方法,将输入还原回image、输出转为seg_image,从而给出blending结果来直接校验。 > > ```python > pass > ``` > > > > - Reference log > √ 数据清洗、样本平衡:需要参考亚军方案 > √ 数据预处理:使用冠军方案的代码 > ? Johnan/课程提供的代码 > × 自写代码 > ~~??? 数据pipline可视化代码,用于校验数据正确性~~ > ##### Section_2_网络 > - **分析** > > - × 提升性能的技巧——信息融合 > > 1. 多尺度信息融合 > > 解决训练数据过大问题的滑窗策略,通过设置不同的crop size可以引入多尺度信息,通过融合这些多尺度信息也能够提升模型性能。 > > 2. 模型加权融合 > > i.e. ML的集成学习 > > 加入不同数据侧重、不同迭代、不同模型的多维度信息,以达到加强模型融合效果的目的。比如,在不同数据侧重维度上,我们训练模型A侧重数据集a、模型B侧重数据集b、模型C偏向于学习实线、虚线等信息,模型D偏向于学习车位线、黄网格等难例。通 > 过加权综合各模型优势。 > > 模型加权融合上主要采用两种融合方式,一种是对每个模型的softmax层融合,一种是对输出结果的加权投票。 > ①前一种方式——每个模型softmax层输出预测图像尺寸为(N, C,H, W)的四维得分矩阵。N为预测图像的数量,此处为1;C代表像素点分类数量,此处为9个类别。H和W分别表示图像的宽和高。对多模型的四维得分矩阵逐点加权,得到最终的加权的(N, C,H, W)的四维得分矩阵,再通过argmax输出每个像素得分最高所属的类别。 > ②后一种方式——对多模型的输出label进行加权投票,规定背景类别占据总票数的0.85判为背景类。9个类别分别设置不同的投票权重,如容易分割的实线权重设为1,不易分割的车位线权重设为10,分割不易出错的类别如斑马线权重也可以设大些。 > > P.S. 冠军方案使用unet、deeplabv3构造了了多个模型,输出的预测结果采用多个模型结果求均值的方式。 > > 本项目使用ENet,使用了两处跳层连接,将decoder输出的feature_map与encoder输出的feature_map做了融合。 > > - √ **第一步:ENet** > 参考ENet论文、ENet-tf@github项目,编写 `enet_0.py, enet_1.py` > P.S. enet_0.py 根据论文复现的模型;enet_1.py 根据项目做了改进的模型。 > > 1. ENet论文——提炼关键信息 > > > - ENet网络结构 > > > > ![ENet结构](.md_images/ENet结构.png) > > > > - 模型信息 > > > > 1. 总的结构 > > > > 是不对称的encoder-decoder结构。(decoder更短) > > > > 分为5个stage,可以看作由头部/中间/尾部三个部分构成。 > > 其中 —— 头部由initial_block构成,用于压缩图像减少计算量;中间就是实际的编码器解码器,由bottleneck_block的五种具体形式构成;尾部由fullconv构成,用于还原原图分辨率和分类,从而最终得到分割图。 > > > > 2. initial_block, bottleneck_block, fullconv > > > > - initial_block > > 具体建模所需信息见上图。`conv_13_3×3_1; maxpooling_2×2_2` > > > > - bottleneck_block > > > > 是网络的基本模块,构成网络信息处理的主体部分,作为 encoder (stage 1 2 3)、decoder (stage 4 5) 使用。 > > > > 基本结构——参考ResNet的 Residual Block 结构,包括main_branch、conv_branch。(两个分支分别可选pooling、conv操作类型,根据具体需求而定5种具体形式。) > > > > 为了不同之用,有5种具体的形式——BB_down、BB_iden、BB_dila、BB_asym、BB_upsa。 > > > > BB_down:用于下采样。maxpooling; conv1_2×2_stride=2, conv2_3×3. > > > > BB_iden:用于直连。pooling×; conv2_3×3. > > > > BB_dila:用于扩大感受野(因为ENet为了避免损失细节而下采样使用得很谨慎,所以获得大的感受野的手段就替换成了空洞卷积,语义分割任务还是很需要大感受野的)。pooling×; dilated_conv2_?×?. > > > > BB_asym:用于替换3×3卷积减少计算量(是否也加强了对杆状信息提取能力?)。pooling×; conv2_5×1/1×5 > > > > BB_upsa:用于上采样。max_unpooling + ~~padding~~conv; conv_1×1, deconv_3×3. > > > > 降维升维操作——暂略。 > > > > 总结1——①是否下采样/直连,由pooling/padding、conv1决定;②是否扩大感受野/减少计算量,由conv2决定;③是否上采样,由pooling/padding、conv2决定。 > > > > 总结2——①降维,由conv1做;②升维,由conv3做。 > > > > - fullconv > > > > 用于最后一步,获得原尺寸的分割图。 > > > > 包含:①上采样操作、②分类操作。 > > > > 3. BN + PReLU > > 放在了所有的卷积之间。可参考ResNet_50的网络结构。 > > > > 4. padding > > 都选'same'。可参考ResNet_50的网络结构。 > > > > 5. 注:asymmetric 5 > > 为分解为 conv_5×1 + conv_1×5 串联实现。 > > > > 6. regularizer——spatial_dropout > > bottleneck2.0 前后各使用 p=0.01、p=0.1。 > > > > 7. bias > > 不用的地方1:projection (i.e. conv1,为了加快计算但不影响精度) > > 不用的地方2:BB_upsa中替换掉padding的conv > > > > 8. unpooling_indices > > 即SegNet使用的带记忆的上采样操作,只在Stage_4的上采样操作中使用。Stage_5的上采样不使用。 > > > > 9. 问题集 > > 是不是 regular_conv2 都用 3×3? > > dilated_conv2 的空洞参数怎么设置的? > > fullconv 的卷积参数怎么设置的? > > > > - 训练信息 > > > > 1. 分阶段训练 > > 第1阶段:只训练encoder,方法是categorize downsampled regions of the input image(没看懂)。 > > 第2阶段:加入decoder联合训练,方法是做像素级分类 i.e.语义分割。 > > 2. 训练参数设置 > > lr = 5e-4 > > L2 weight decay of 2e-4 > > batch_size = 10 获得最好效果 > > > > - 损失函数 > > > > 1. 类别平衡 > > 加入了类别权重系数 $w_{class} = \frac{1}{\ln (c + p_{class}) }, \quad c=1.02$,限制权重系数取值在[1,50]之间。(但当p=1时的最小值是1.42???) > > 2. ENet-tf [@github](https://github.com/kwotsin/TensorFlow-ENet) > > > - 复现项目的重要告知信息 > > ① tensorflow没有提供带记忆的上采样的操作,这个项目在代码中根据[TensorFlow github issue](https://github.com/tensorflow/tensorflow/issues/2169),自己做了带记忆的上采样。 > > ② 保留了BN、spacial_dropout,它们能够提高性能。 > > ③ class weights(类别权重系数)用于解决类别不平衡问题。并且,这个项目直接将背景类的权重设为了0。 > > ⑤ 这个项目没有对输入图片做前处理。 > > > > - 改进 > > ① 在encoder与decoder之间加入skip connection能提高性能。e.g. unet > > ② initial_block的数量和Stage_2的bottleneck_block的数量,是可调的超参数。ENet已经是很轻量化的网络了,可以在这两处继续加层数,来提高网络深度。(但在Paper中已经指出了,即使将encoder的层数从16增加到32,并没有获得显著的提升性能的效果) > > ③ 为了加速计算,fused batch normalization is used over standard batch normalization. See [TensorFlow's best practices](https://www.tensorflow.org/performance/performance_guide). > > ④ 这个项目为了获得计算 weighted loss 使用的 class weights,没有使用论文给出的类别权重系数的公示,而是使用了 Median Frequency Balancing ([MFB](https://blog.csdn.net/the_key0/article/details/89889243))。在这个项目里,使用MFB得到的效果更好。 > > > > - 模型信息 enet.py > > > > 1. Activation > > encoder 使用 PReLU > > decoder 使用 ReLU > > > > 2. max_unpooling > > 这个项目用tf1x实现了unpooling,但不采用。 > > 供参考的keras实现:[python - Upsampling with pooling indices keras (unpooling) - Stack Overflow](https://stackoverflow.com/questions/64307804/upsampling-with-pooling-indices-keras-unpooling)、[danielenricocahall/Keras-SegNet: Implementation of SegNet in Keras (github.com)](https://github.com/danielenricocahall/Keras-SegNet) > > > > P.S. tensorflow定制在 tfa.layers.MaxUnpooling2D() > > > > 3. initial_block > > conv——没用activaition、没用bias;后接 BN + PReLU > > maxpooling——.. > > > > 4. bottleneck_block > > 见代码 > > > > 5. ENet > > 见代码 > > > > 6. ENet_arg_scope > > ??? > > > > - 训练信息 train_enet.py > > > > 1. > > > > - 评价信息 test_enet.py > > - × **第二步:ENet-SAD**(暂未做网络和训练的工作) > ENet-SAD在2019年提出,在ENet基础上引入了self_attention_distillation。 > ENet-SAD在Tusimple、CuLane、BDD数据集上达到了SCNN的性能,参数量小了1/20速度快20倍。 > > > 参考 pytorch项目、SAD论文,编写 `enet_sad.py` > > 1. SAD论文——提炼关键信息 > > > - 暂略,参考 §4.1 > > 2. ENet-SAD-pytorch@github > > > - 暂略 > > - **框架>>>代码** > 见 `enet_30.py` > > - Reference log > √ 冠军方案的网络 > √ ENet~~/ENet-SAD~~ tf复现的网络 > √ 自写网络 ##### Section_3_训练 > - 比赛方案训练策略 > > 1. 预训练策略 > 训练过程,可以采用分多阶段依次递进增大分辨率的训练方式。例如,在不同阶段采用3种分辨率 (768x256, 1024x384, 1536x512) 进行训练,并且高分辨率的模型是基于前一个过程得到的低分辨率的预训练模型。基于低分辨率的预训练,可以帮助高分辨率的训练更好收敛。 > > 训练记录参考(冠军方案)—— > > | Models | Loss Func | Base LR | Batch | Resolution | Miou | > | :---------- | :--------- | :------ | :---- | :--------- | :------ | > | Unet-base | bce + dice | 0.001 | 8 | 768 x 256 | 0.52231 | > | Unet-base | bce + dice | 0.001 | 4 | 1024 x 384 | 0.55136 | > | Unet-base | bce + dice | 0.001 | 2 | 1536 x 512 | 0.60577 | > | Unet-Simple | bce + dice | 0.001 | 2 | 1536 x 512 | 0.60223 | > | Deeplabv3p | bce + dice | 0.001 | 2 | 1536 x 512 | 0.59909 | > | Ensemble | - | - | - | 1536 x 512 | 0.61234 | > | Correction | - | - | - | 1536 x 512 | 0.63547 | > > 2. 学习率策略 > > 参考使用的修改版CycleLR策略,过程如下,在8-10个epochs后基本完成训练。 > > - 前3个epochs采用默认参数训练(lr=0.001)。 > - 在之后3个epochs的训练中,每个epoch平均分配出6个改变lr的地方,改变方式为 0.001-0.0006-0.0003-0.0001-0.0004-0.0008-0.001。 > - 最后两个epoch一般采用0.0004-0.0001之间学习率训练的策略。由于测试集与训练集在图像质量和视觉感知上差距不小,太小的学习率很容易导致过拟合,所以最小的学习率采用0.0001。 > > 3. 损失函数 > 参考最先的三个epochs采用sigmoid bce;后面的训练中采用bce + dice的方式,这种方式会比单一的bce提升0.01-0.015。 > > - **ENet训练方法** > > - 主要参考1:ENet-caffe, ENet-tf, training@blog > 对以上项目的训练方法的调研、总结,见 ./.参考文献:ENet/ENet训练方法综述.docx > > conclusion: 上述项目中都包含各自对ENet复现的工作,但是都没有给出分两个阶段训练过程中如何训练encoder、使用什么数据集训练encoder的说明。 > > - 主要参考2:冠军方案的预训练策略 > > - 训练流程 > > > 1. √ 验证Re_cv3训练框架+VOC2012正确有效,能够训练出有效果的模型 > > 使用fcn_net.py,简单测试训练效果 > > 2. encoder训练框架+voc > > a. 旧框架适用enet改造、加入lr_decay、weight_decay > > b. 编写匹配enet的图像处理函数/损失函数和类别平衡处理/评价指标 > > c. 小样本量,测试训练框架有效性/网络正确性 > > 寻找合适的初始lr,合适的损失函数等 > > P.S. 3e-3在1~2个循环下降很快;后续要到3-e4, 3e-5做精调 > > d. 训练,直到loss不再下降,保存权重参数 > > 3. en-decoder训练框架+voc > > a. 继承上一阶段训练得到权重参数 > > b. 尝试或参考,设置训练参数,先冻结encoder训练,再joint训练 > > 4. ~~encoder训练框架+apollo~~ > > a. 继承voc训练得到的encoder参数,或者从scratch开始训练 > > b. 编写匹配apollo数据集的图像处理函数(缩放) > > c. 小样本量测试训练 > > d. 参考比赛方案,分三个子阶段训练,保存权重参数 > > 5. en-decoder训练框架+apollo > > a. 继承上一阶段训练得到的权重参数 > > ~~b. 尝试或参考,设置训练参数,先冻结encoder,分三阶段训练~~ > > c. 采用最高分辨率,joint训练 > > > > - P.S. 来源 > > 由ENet-tf,参考编写损失函数和类别平衡处理/图像处理函数/评价指标 > > 由ENet-tf/traing@blog,参考设置训练参数 > > 由ENet-keras,启发得到encoder的使用语义分割数据集训练的方法 > > > > - 一个问题: > > encoder采用图像分类数据集/语义分割数据集训练,对于enet性能影响差别有多大? > > - **框架>>>代码** > > - Reference log > ? 直接使用/修改冠军方案的训练代码(设置的训练过程) > ? ENet-SAD tf复现代码的训练代码(设置的训练过程) > ? 自有的训练框架 > ? 融合上述三种 ##### Section_4_评价 > - **框架>>>代码** > - Reference log > √ 直接使用/修改冠军方案的评价代码 > × Johnan/课程给出的IOU计算代码 > × 自写 > √ bubbling计算框架 ##### 文件目录 ```python ----.\ |----_aux\ # 存放工程的辅助脚本 |----_tst\ # 存放工程的测试脚本 | |----dataset\ # 数据集 | |----_samples_path_list\ # 存放样本文件路径的记录文件 e.g.小样本集/完整集 | |----dataset_dir.txt # 记录数据集目录,空或无效的话需在本地配给样本 |----nets\ # 存放网络模型文件 |----predi_cfg\ # 评价需用文件 e.g.模型类别名、类别配置 |----train_log\ # 训练过程文件 e.g.训练记录,训练过程使用的模型类别名文件 |----utils\ # e.g. utils_train.py, utils_evaluate.py | |----net_main.py # |----predict.py # 预测 |----train.py # 训练 |----README.md # 规定:文件路径 = 文件目录 + 文件名 # path = dir + filename ``` #### 1.5 数据 - 训练使用的标注数据为百度自建,见项目来源主页。本项目训练使用的是复赛数据集。 #### 1.6 效果 - 性能对比 冠军方案提供了在三个分辨率训练阶段的mIoU。ENet训练也使用了相同的三个分辨率阶段,使用各个阶段的验证集上的IoU值与冠军方案对比。 - Resolution (256, 768) 1. 冠军方案 Unet-base 0.52231 2. ENet 0.4974 - Resolution (384, 1024) 1. 冠军方案 Unet-base 0.55136 2. ENet 0.5377 - Resolution (512, 1536) 1. 冠军方案 Unet-base 0.60577 Unet-Simple 0.60223 Deeplabv3p 0.59909 2. ENet 0.5863 - 样例展示 ![111915071682_01](.md_images/111915071682_01.jpg) #### 1.* Reference - 参考方案: 1. 比赛的冠军、亚军方案中的部分策略 2. 车道检测的深度学习算法中的部分算法 ## §2 百度比赛说明、参赛方案总结 #### 2.1 赛题说明 - 赛题任务 利用提供的训练数据,训练预测模型来预测测试数据中每一个像素所属的类别。 - 数据集 数据采集于北京和上海几种不同的交通场景,包含了绝大多数的道路标识以及一些不常见的类别。在整个数据集中,大约标注了33个类别。 - 分为训练集与测试集,提供:彩色的场景图、对应的车道线标注图像 1. 训练集:提供车载相机采集的高清彩色图像,对应的车道线标签图像。在标签图像中,像素值对应的是此像素属于的相应的类别。 2. 测试集:仅提供彩色图像。要求利用训练的模型来预测测数据中的对应图像的类别信息。 - 下载训练数据的文件夹结构: {根目录}{道路名称}{类型}{Record 标识}{相机标号}{时间戳}_{相机标号}{额外信息} | 根目录 | 存放数据的根目录 | | ---------- | ------------------------------------------------------------ | | 类型 | 数据类型分为两类,分别是Color Image / Labels | | 道路标识 | 采集道路的标识,如 road02 | | Record标识 | 由采集系统定义的部分数据集的文件夹名称,如 road02 | | 相机标号 | 由采集系统定义的相机名称,如 Camera 5 / Camera 6 | | 时间戳 | 采集图像的时间 | | 额外信息 | 图像的扩展名,如对于彩色图像的扩展名为.jpg,标签扩展名为.png | - 数据格式 ![图片](.md_images/896E8C904AB04CB29F6DD838AD80E053.png) - 结果评估标准:mIoU $$ IoU_c = \frac{TP} {TP + FP + FN} \\ TP = \underset{i}{\sum} |M_{c_i} \odot M^*_{c_i}| \\ FP = \underset{i}{\sum} |M_{c_i} \odot (1 - M^*_{c_i})| \\ FN = \underset{i}{\sum} |(1 - M_{c_i}) \odot M^*_{c_i}| $$ - 数据提交格式 答案存储的是以标注Id的形式,预测Id (如,0,1,2,3,4,5,6,7,8) 需转化为标注Id。 如预测值为1的label要转化为200,204,206, 207, 209,或者213都可以,在评估时这几个值是看作同一类别。 #### 2.2 参赛方案总结 参考冠军方案:[链接1](https://blog.csdn.net/PaddlePaddle/article/details/93858600),[链接2](https://blog.csdn.net/wangdongwei0/article/details/89093095) - 数据清洗 1. 裁掉样本的无效区域 裁掉图片最上部的3384x690的图像,因为这部分都是天空和树木,没有正样本的存在,裁掉后还可以减小图像的压缩比例。 2. 舍弃噪声样本:解决分布漂移问题 发现 road_3 存在几乎一半以上图像过曝的问题;并且 road_3 大多在强光下拍摄,不符合测试集的分布。舍弃 road_3可以提高模型性能。 另外 road_2 和 road_4 中也存在过曝样本。 3. 数据增强:解决类别不平衡/分布漂移问题 由于第5类和第8类训练数据较少(但是测试集中占比不少),可以针对这两类做数据增强。 - 训练策略 1. 预训练策略 训练过程,可以采用分多阶段依次递进增大分辨率的训练方式。例如,在不同阶段采用3种分辨率 (768x256, 1024x384, 1536x512) 进行训练,并且高分辨率的模型是基于前一个过程得到的低分辨率的预训练模型。基于低分辨率的预训练,可以帮助高分辨率的训练更好收敛。 2. 学习率策略 参考使用的修改版CycleLR策略,过程如下,在8-10个epochs后基本完成训练。 - 前3个epochs采用默认参数训练(lr=0.001)。 - 在之后3个epochs的训练中,每个epoch平均分配出6个改变lr的地方,改变方式为 0.001-0.0006-0.0003-0.0001-0.0004-0.0008-0.001。 - 最后两个epoch一般采用0.0004-0.0001之间学习率训练的策略。由于测试集与训练集在图像质量和视觉感知上差距不小,太小的学习率很容易导致过拟合,所以最小的学习率采用0.0001。 3. 损失函数 参考最先的三个epochs采用sigmoid bce;后面的训练中采用bce + dice的方式,这种方式会比单一的bce提升0.01-0.015。 4. 模型 使用unet、deeplabv3构造了了多个模型,输出的预测结果采用多个模型结果求均值的方式。 ## §3 笔记1:车道检测问题调研 #### 术语 > lane detection 车道线检测 LD > lane segmentation 车道线分割 LA > > ADAS advanced driver assistance system, 高级驾驶辅助系统 > driving automation 自动驾驶 DA > > SLAM > Simultaneous Localization and Mapping 同步定位与地图构建 > > > 最早在机器人领域提出,[SLAM简介](https://blog.csdn.net/qq_24624539/article/details/92764163) > > distortion 畸变 > perspective transform 透视变换 > > SOTA state-of-the-art > SOTA model 是指在该项研究任务中,目前最好/最先进的模型 > > dense prediction 预测每个像素的label i.e.图像分割?[参考](https://blog.csdn.net/weixin_30552635/article/details/96830436) > > > > KD knowledge distillation 知识蒸馏 > NAS neural architecture search 神经网络架构搜索 > 是强化学习的一个重要应用方向。[参考1](https://blog.csdn.net/jinzhuojun/article/details/84698471),[2](https://zhuanlan.zhihu.com/p/110527110),[3](https://blog.csdn.net/qq_33254870/article/details/97945605) > > lane keeping assist (LKA) > lane departure warning (LDW) > > RANSAC random sample consensus 随机抽样一致算法 #### 2.1 概念 ##### A. 知识结构:自动驾驶、车道检测 > - 自动驾驶 > > - 技术结构 > 包括:感知层、决策层、执行层 P.S. 与电厂控制运行使用的DCS类似 > 车道检测属于自动驾驶/无人驾驶的一个模块 > > 驾驶自动化水平的分级 > SAE J3016 标准 / 工信部标准 - L0 ~ L5 > > 自动驾驶技术结构 > > > > - 车道检测 > > 车道检测是自动驾驶任务延申出来的子任务。目标是实现汽车正确定位在车道线内行驶。 > > 在自动驾驶技术的 ==**知识结构** / **知识框架** / **任务分治过程**== 中,==**知识线索**==:自动驾驶 → 感知层 → 环境感知 → 车道检测by摄像头。 > > 如图所示,==车道检测任务==就是对当前行驶道路的车道线进行检测,给出自车道及左右两侧至少各一个车道的相关信息,如车道的ID、方向、曲率、类型(虚线、实线、黄线、白线等)、宽度、长度、速度等信息,并进行可视化输出。 > > 车道检测技术 / 实现任务的方法,包括:传统机器学习方法,深度学习方法。 > 另外,图像级检测与视频级检测使用的算法存在一些差异。例如,视频级检测可以通过使用时域一致性来解决单帧无法解决的问题,如车道线遮挡、破损等。这些技巧能够使用之前帧的分割结果或融合之前帧的信息,从而可以提高检测的准确性。 > > img > > > - P.S. 关于 <<自动驾驶 - ... >> > > > > - 自动驾驶系统主要包含三个部分:感知、决策、控制。 > > > > - 自动驾驶硬件包括: > > 1.自动驾驶系统的硬件架构 > > 2.自动驾驶的传感器 > > 3.自动驾驶的传感器的产品定义 > > 4.自动驾驶的大脑 > > 5.自动驾驶汽车的线控系统 > > > > 从整个硬件的架构上也要充分考虑系统感知、决策、控制的功能要求。 > > > > - 无人驾驶主要依靠的技术:计算机视觉、传感器融合、定位、路径规划、控制 > > > > ```mermaid > > graph LR > > A[计算机视觉] > > B[传感器融合] > > C(定位) > > D(路径规划) > > E((控制)) > > A --> C > > B --> C --> D --> E > > ``` > > > > > > > > - P.S. 关于 <<自动驾驶 - 感知系统 - 摄像机 - 车道线检测>> > > > > - 摄像机是所有车载传感器中,感知能力最强的,没有之一。这也是为什么特斯拉采用了纯视觉的感知方案,而坚持不使用激光雷达的原因(当然激光雷达贵也是一个因素)。 > > - 在自动驾驶的知识框架中,车道线是摄像机能够感知的最基本的信息。 ##### B. 车道检测の基础问题 > 针对车道线检测的任务,我们需要弄清楚的几个问题: > > - 车道线的表示形式? > > - 输出类型——掩码/点集/矢量线条 > - 实例化——每个车道线是否形成实例 > - 分类——是否对车道线进行了分类(单白、双黄等) > - 提前定义的参数——是否只能检测固定数量的车道线 > - 车道标记——是否对车道上的行车标记也做了检测 > > 车道线的表示形式 影响到数据的标注和网络的输出形式,而且最终需要的是车道线在实际坐标系下的方程。而神经网络更适合提取图像层面的特征,直接回归方程参数有较多限制。所以,网络推理输出后需要相对复杂的后处理去解决真实坐标的问题。 > > - 神经网络推理到哪一步? > > 是逐像素的车道线标识本身 or 表征出抽象的车道分隔边界线 > > - 图像分割方案——倾向于像素点的分类,该像素点是否属于车道线标识并对标识类别进行判断 > - 图像检测方案——倾向于抽象出分割边界线,在设定的一系列anchor中判断是否存在车道线,以及回归车道线的位置参数 > > - 数据集的处理? > > - 需要各场景类别的数据平衡,比如高速公路,辅路,盘山路,夜晚,雨天等数据 > - 检查筛选出质量较好的图片,比如高速公路夜间的数据和雨中驾驶的视频较为模糊 > - 相近的图片抽帧标注,可以每10张抽取1张,比如低速的多张图片相似会造成准确率虚高 > - 增广小类别的图片,比如查看车道线系数直方图,再小幅度旋转使每个系数分布更为合理 > - 缩放并归一化数据,加速收敛 #### 2.2 公共数据集 > - 数据集样本举例,[参见](https://zhuanlan.zhihu.com/p/343840245) > > - [Caltech](http://www.mohamedaly.info/datasets/caltech-laness) > 张图:1.2k > 尺寸:640x480 > 特点:场景比较简单,且视角较好 > > - [VPGNet](https://github.com/SeokjuLee/VPGNet) > 张图:20k > 尺寸:1288×728 > 特点:韩国汉城市中心拍摄,包含白天(非雨天、雨天、大雨天)、夜晚的四种天气数据,同时包含了各种车道线类型标记共17类,以及其他不同类型的车道标识(左转箭头、直行箭头、斑马线等) > > - [TuSimple](https://github.com/TuSimple/tusimple-benchmark/issues/3) > 张图:72k > 尺寸:1280×720 > 特点:位于高速路,天气晴朗,车道线清晰,特点是车道线以点来标注。是最早公开的车道线数据集,相对简单一些,目前在较新的算法上已经接近于被充分挖掘。 > > - [CULane](https://xingangpan.github.io/projects/CULane.html) > 张图:98k > 尺寸:1640x590 > 特点:包含拥挤、黑夜、无线、暗影等8种难以检测的情况,最多标记4条车道线。 > 数据集在北京采集。在SCNN-2018中被提出。 > > - [BDD100k](https://bdd-data.berkeley.edu/) > 张图:120M > 尺寸:1280×720 > 特点:包含美国4个区的白天、黑夜各种天气状况,二维8类别车道线 > > - [ApolloScape](http://apolloscape.auto/) > 张图:120k > 尺寸:3384x1710 > 特点:特点是车道线以掩码的形式标注,包含2维或3维28个类别 > > 论文:The Apolloscape open dataset for autonomous driving and its application - 2019 > > - [CurveLanes](https://github.com/xbjxh/curvelanes) > 张图:训练集100k,验证集20k,测试集30k > 尺寸:2650x1440 > 特点:华为弯道检测数据集 135k张图, 采用三次样条曲线手动标注所有车道线,包括很多较为复杂的场景,如S路、Y车道,还有夜间和多车道的场景 > > - LLAMAS > 张图:100k > 尺寸: > 特点:19年新提出的,标注不是人工标注,而是高精地图生成的,全是高速场景 > > 目前新的学术论文里,大都用 TuSimple 和 CULane 两个数据集进行性能对比,也有文章使用 LLAMAS > > - KITTI > [kitti | TensorFlow Datasets](https://tensorflow.google.cn/datasets/catalog/kitti) > 是目前自动驾驶领域最重要的测试集之一。 > 主要是针对自动驾驶领域的图像处理技术,主要应用在自动驾驶感知和预测方面,其中也涉及定位和SLAM技术。 > > 但是在SCNN论文中被认为数据集太简单,没有被使用。 > > - VIL-100 > 张图:100个视频,每个视频有100帧;共10k帧图像 > 尺寸: > 特点:第一个视频级实例车道线数据集。 > 包含100个视频,具有10,000帧图像,涵盖拥挤路况、车道线破损、雾霾、夜晚等10类经典场景。我们将所有视频的帧率从最初的30fps下采样到10fps,对每帧中的所有车道线提供了实例级标注。 #### 2.3 检测流程 i.e. 车道检测的一般流程 - 参考: [论文精读 | LaneNet 端到端车道线检测的实例分割方法]() [高级车道线检测(Apollo微信公众号)]() - 输入&输出 - 输入 一个连续的视频,视频中的左车道线为黄色实线,右车道线为白色虚线。无人车会经过路面颜色突变、路边树木影子干扰、车道线不清晰和急转弯的路况。 - 输出 左、右车道线的^①^三次曲线方程,及其^②^有效距离。最后将车道线围成的^③^区域显示在图像上。 ##### A. 传统方法 > 1. 校准 > 校准摄像头的畸变,使拍摄照片能够较完整的反映3D世界的情况。 > by 摄像机标定技术,畸变系数 > 2. 透视变换 > 对每一帧图片做透视变换,将摄像头的照片转换到鸟瞰图视角。 > 3. 鸟瞰图二值化 > 对鸟瞰图二值化,通过二值的像素点进一步区分左右两条车道线,从而拟合出车道线曲线。 > by 边缘提取,颜色空间分割,深度学习图像分割 > 4. 三次曲线拟合 > 第一帧:用滑窗的方法检测第一帧的车道线像素点,然后拟合车道线曲线。 > by 滑动窗口法搜索,三次曲线拟合 > 5. 车道线跟踪 > 连续帧:从第一帧的曲线周围寻找接下来的车道线像素点,然后拟合车道线曲线。 > by 先验知识,扩展曲线法搜索 > 6. 逆投影到原图、定位计算 > 将两条车道线所围成的区域绘制在“鸟瞰图”,使用逆透视变换矩阵反投到原图上。 > 有了车道线曲线方程之后,可以计算斜率和车道线偏离中心的位置。 > > - 注: > 畸变——是由镜头距离中心的远近不同而放大率不同产生的,[参考](https://b23.tv/mCualN)。(放大率与折射效果有关?)畸变有,桶形畸变、枕形畸变、胡子畸变。 ##### B. 深度学习 >- **B.1 深度学习的通用思路** > 深度学习的思路是,将车道检测问题看作一个实例分割问题(其中每个车道都形成自己的实例),可以进行端到端的训练。 > >- **B.2 深度学习应用到车道检测的“直观”流程** > > - **切入思路** > > 深度学习应用到解决车道检测问题的思路是,在已知的传统图像算法流程上,做改进 > 因此,它的一般流程,可在传统学习流程上做修改 i.e.可在以下环节替换传统算法: > > ②“透视变换”——学习变换参数,更好地适应上下坡等不同视角路况的透视变换 > ③“鸟瞰图二值化”——通过语义分割/实例分割获得更准确的结果 > ⑤“车道线跟踪”——路况场景具有时序信息特性,为了利用时序特征通常引入RNN模块 > > - **概括形成** > > 以下的引用,对“它”说明得非常好: > > > 车道线检测的应用场景具有时序信息特性,为了利用时序特征通常会引入RNN模块,加上Encoder-Decoder的形式已经成为CNN特征提取的标配,所以一般的做法是对Encoder提取的Features进行进一步加工,提取连续帧带来的历史信息。或者借助一些额外的相关业务更好的引导车道线的回归。主流深度学习的车道线检测方法:包括二值语义分割产生掩码图部分和掩码图的线拟合部分。 > > > > 二值语义分割主要采用CNN方法并引入一些方式提高语义分割精度,在线的拟合阶段可以采用学习到的转换矩阵先将分割结果转换为鸟瞰图视角,然后,采用均匀取点+最小二乘法拟合,拟合方程可选三次方程。 > >- **B.3 其他方法的流程** > 从思路的角度,除了以上的由“直观思路”得到的“语义分割 + RNN”的方法外,还有行分类、anchor等由各种深度学习思路或深度学习在其他领域的实践经验启发得到的方法。 > > 因此,不同与以上的方法,自然地检测流程也是不同的。例如,行分类或anchor方法可以实现将②~⑤的过程融合成一步端到端的过程,直接给出车道线的拟合结果。 > >P.S. 不同的深度学习方案,在不同的环节使用了深度学习方法。 ```mermaid graph LR A1("1.校准") A2("2.透视变换") A3("3.鸟瞰图二值化") A4("4.三次曲线拟合") A5("5.车道线跟踪") A6("6.逆投影到原图,定位计算") A1 --> A2 --> A3 --> A4 --> A5 --> A6 B1("1.原图→校准图") B2("2.鸟瞰图") B3("3.二值图") B4("4.拟合曲线") B5("5.拟合曲线") B6("6.融合图") B1 --> B2 --> B3 --> B4 --> B5 --> B6 ``` #### 2.4 算法 ##### A. 传统图像方法 > - 通过边缘检测滤波等方式分割出车道线区域,然后结合霍夫变换、RANSAC等算法进行车道线检测。 > 这类算法需要人工手动去调滤波算子,根据算法所针对的街道场景特点手动调节参数,工作量大且鲁棒性较差,当行车环境出现明显变化时,车道线的检测效果不佳。 > > - 主流方式如下: > . 基于霍夫变换的车道线检测 > . 基于LSD直线的车道线检测 > . 基于俯视图变换的车道线检测 > . 基于拟合的车道线检测 > . 基于平行透视灭点的车道线检测 > - 难点/局限性: > . 应用场景受限;霍夫直线检测方法准确但不能做弯道检测,拟合方法可以检测弯道但不稳定,仿射变换可以做多车道检测但在遮挡等情况下干扰严重。 > . 透视变换操作会对相机有一些具体的要求,在变换前需要调正图像,而且摄像机的安装和道路本身的倾斜都会影响变换效果。 ##### B. 基于DL的方法 > 目前基于深度学习的方法由于具有较高的精度,成为当前的主流方式。 > > - **基于深度学习方法的概述** > > 车道线检测的应用场景具有时序信息特性,为了利用时序特征通常会引入RNN模块,加上Encoder-Decoder的形式已经成为CNN特征提取的**标配**,所以==一般的做法==——对Encoder提取的Features进行进一步加工,提取连续帧带来的历史信息。或者借助一些额外的相关业务更好的引导车道线的回归。 > > ==主流DL车道线检测方法==,包括:二值语义分割产生掩码图部分、掩码图的线拟合部分。 > > 二值语义分割——主要采用CNN方法并引入一些方式提高语义分割精度; > 在线的拟合阶段——可以采用学习到的转换矩阵先将分割结果转换为鸟瞰图视角,然后,采用均匀取点+最小二乘法拟合,拟合方程可选三次方程。 > > 具体算法详解见后文。 > > - **大抵可以分为以下四类** > > 1. 基于语义分割的方法 > > SCNN:对于细长的车道线检测很有效,但是速度慢(7.5FPS),这阻碍了它在现实世界中的适用性。 > > SAD:提出了一种自注意蒸馏模块,基于信息蒸馏为了解决大主干网络对速度的影响,可以聚合文本信息。该方法允许使用更轻量级的骨干,在保持实时效率的同时实现高性能。 > > CurveLanes-NAS:使用神经架构搜索(NAS)来寻找更好的骨干。虽然取得了最先进的结果,但在(NAS网络架构搜索过程的?)计算上非常耗时。(华为诺亚方舟实验室) > > 2. 行分类方法 > > 一种基于输入图像网格划分的车道检测方法。 对于每一行,模型预测最有可能的单元格包含车道标记的一部分。 由于每一行只选择一个单元格,因此对图像中的每个可能的车道重复此过程。 > > 如: E2E-LMD、IntRA-KD、UFAST等。其中,UFAST实现了当前最快的检测速度,达到了300FPS,但似乎对于弯道处理的结果并不好。 > > 3. 基于anchor的方法 > 类似YOLOv3或SSD的单阶段模型,如Line-CNN、LaneATT等 > 其中LaneATT提出了新的基于anchor的车道检测注意机制,表现SOTA,达到了250FPS > > 4. 其他方法 > > FastDraw:不需要后处理,需要分割和行分类的方法。速度高,但精确度不高。 > PolyLaneNet:速度快,但是由于现有的数据集不均衡,造成一些偏差。 > > - 其他的一些解释说明 > > > 参考自CurveLane-NAS论文 > > > > 1. Most lane detection works follow pixellevel segmentation-based approach [21, 10, 19, 36] as shown in Figure 2 (a). These approaches usually adopt the dense prediction formulation, i.e., treat lane detection as a semantic segmentation task, where each pixel in an image is assigned with a label to indicate whether it belongs to a lane or not. [36] combines a semantic segmentation CNN and a recurrent neural network to enable a consistent lane detection. SCNN [20] generalizes traditional deep convolutions to slice-byslice convolution, thus enabling message passing between pixels across rows and columns. However, pixel-wise prediction usually requires more computation and is limited to detect a pre-defined, fixed number of lanes. > > 2. On the other hand, several works use proposal-based approaches for efficient lane detection as shown in Figure 2 (b). These approaches generate multiple anchors or lines proposals in the images. PointLaneNet [6] finds the lane location by predicting the offsets of each anchor point. Line-CNN [14] introduces a line proposal network to propose a set of ray aiming to capture the actual lane. However, those methods predict on one single feature map and overlook the crucial semantic information for curve lanes and remote lanes in the feature hierarchy. > > > > ![image-20211006155134715](.md_images/image-20211006155134715.png) #### 2.5 评价指标 > - **主流指标** > > > 在评判True or False时,主要有两种方式: > > - End Point > 通过判断线的端点间的距离及其包围面积是否超过阈值 - TuSimple > - IoU > 预测和标注都画出来,像图像分割一样计算IoU的重叠面积,小于阈值判为负 - CULane > > ![preview](.md_images/v2-0ffac75128a6d314b74fe140d0da5bc3_r.jpg) > > 两个当前主流数据集 TuSimple 和 CULane 采用不同评价指标。 > > - **计算公式** > > 1. TuSimple指标——准确度 > P.S. 有歧义,暂不提供。请按图示end point计算 > 2. CULane指标——F1-measure > 见图示 > TP: IoU>0.5的预测 > FP: IoU<0.5的预测 > TN: 没有这条车道且预测没有该车道 > FN: 有这条车道但被预测为没有该车道 > > - 其他指标 > Runtime(ms) > MACs(multiply-accumulate operations) > FPS > FDR(false discovery rate) > FNR(false negative rate) #### 2.* 研究难点 > 1. 车道线一般为细长形的外观结构,需要强大的高低层次特征融合来同时获取全局的空间结构关系和细节处的定位精度 > 2. 不确定性 > 车道线的状态呈现具有不确定性,如被遮挡、磨损、道路变化时本身的不连续性、天气影响(雨、雪)等。需要网络针对不同情况具备较强的推理能力 > 3. 换道问题 > 车辆的偏离或换道过程会产生自车所在车道的切换,车道线也会发生左/右线的切换。一些提前给车道线赋值固定序号的方法,在换道过程中会产生歧义的情况 > 4. 实时快速 > 车道线检测必须实时或更快速地执行,以节省其他系统的处理能力 > 5. 目前大多数方法不提供源码,导致复用性差 #### 2.* Reference - 参考来源: 1. [车道线检测综述及近期新工作 - 简书](https://www.jianshu.com/p/0c3fd07a9fba) 2. [简述车道线检测 by 陈伟 - 知乎](https://zhuanlan.zhihu.com/p/343840245) 3. [车道线检测新工作 VIL-100 - 简书](https://www.jianshu.com/p/37650a65b28b) 4. KKB课程 5. [自动驾驶纯视觉方案优劣](https://www.bilibili.com/video/BV1Hf4y1w7v7?from=search&seid=10849525102874356305&spm_id_from=333.337.0.0) 6. [自动驾驶技术 | 机器之心](https://www.jiqizhixin.com/graph/technologies/05e15688-59c9-43b0-9dd5-cd627d4e8d08) 7. [自动驾驶的6个级别,目前走到那一步了](https://www.bilibili.com/video/BV18A411F7Mj?spm_id_from=333.999.0.0) 8. [SAE J3016:驾驶自动化分级(2021年4月,中文版) (sohu.com)](https://www.sohu.com/a/468337997_468661) ## §4 笔记2:车道检测DL算法综述_main - 参考 [领域综述:车道线检测综述及近期新工作 - 2021-05](https://www.jianshu.com/p/0c3fd07a9fba) [算法综述:基于DL的车道线检测算法 - 2020-08](https://zhuanlan.zhihu.com/p/180247957) [Amusi](https://github.com/amusi/awesome-lane-detection) [910 列表:车道线检测算法汇总 - 2020-09](https://zhuanlan.zhihu.com/p/128518581) #### 4.0 调研线索 > 1. ▲ DL方法四类中给出的算法/论文 > 2. ▲ 绿三丁的论文 > 3. ▲ [简述车道线检测 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/343840245) 给出的论文 > 4. 回顾030的论文总结、补充未看的论文 > 5. 最后补充:Amusi的论文列表 > 6. #### 4.1 基于语义分割的方法 ##### 方法概述 > i.e.车道线检测和曲线拟合分开两步去做 ##### √ LaneNet - 2018 - 论文 & 参考解读 Towards End-to-End Lane Detection: an Instance Segmentation Approach (IV 2018) [深度学习笔记(十二)车道线检测 LaneNet - xuanyuyt - 博客园](https://www.cnblogs.com/xuanyuyt/p/11523192.html) [论文精读 | LaneNet 端到端车道线检测的实例分割方法](https://mp.weixin.qq.com/s/g_B1BM8qDGAz7ySDd3jyTQ) [参考复现代码](https://github.com/MaybeShewill-CV/lanenet-lane-detection)
论文目录 1 摘要 2 传统车道线检测技术 3 基于深度学习的车道线检测 4 实例分割方法实现端到端车道线检测 LaneNet 基于学习方法的投影方法H-Net 5 结论
- 简介 & 论文总结 - overview 这篇文章首次提出了 end to end 解决 lane detection 的方案。 很早就有人复现了论文并提供了开源代码,因此相信lanenet是大多数已经入车道线坑的人深入了解的第一篇paper。 文章做法是将lane detection转化为instance segmentation问题,通过LaneNet网络提取出每条线的实例,再通过HNet输出一个转换矩阵H,将车道线的点坐标通过矩阵H转换后,用最小二乘法拟合,再反向转换到原图中。 - pros & cons 1. 亮点 通过embedding vector与cluster配合使用,能检测不限条数的车道线。 通过HNet学得的perspective transformation,使得lane fitting能够更鲁棒。 2. 缺点 cluster很耗时,实际工程应用上很难满足实时性的要求。 - LaneNet(重名)设计多任务网络分支,包括一个车道分割分支和一个车道嵌入分支。 - 车道分割分支 具有两个输出类别,即背景或车道 - 车道嵌入分支 进一步将分段的车道像素分解成不同车道实例 - 通过将车道检测问题分解为上述两个任务,可以充分利用车道分割分支的功能,而不必为不同的车道分配不同的类别。相反,使用聚类损失函数(i.e.辨别损失函数)训练的车道嵌入分支将车道类别分配给来自车道分割分支的每个像素,同时忽略背景像素,减轻车道变化带来的影响。 - 另外,论文设计轻量级神经网络H-Net,输出用于图像透视变换的相关系数。将图像转换为“鸟瞰图”并进行车道线曲线拟合,与固定参数的逆变换方式相比,H-Net对于路面变化具有鲁棒性。 - 论文在TuSimple数据集上进行测试,可以达到96.4%的检测精度,具有一定的鲁棒性。 - summary LaneNet 由三部分构成:LaneNet, H-Net, 三阶多项式拟合- - LaneNet 语义分割 + 聚类 -> 实例分割 位每个像素点分配车道实例的ID - H-Net 传统图像算法的做法是将图片投影得到鸟瞰图,然后使用2阶或3阶多项式来拟合,投影变换矩阵H只被计算一次,所有的图片使用的都是相同的投影变换矩阵。产生的问题是,遇到地平面变化如山地丘陵会产生比较大的误差 H-Net可以预测变换矩阵H,能够做到对每个图片做适合它的鸟瞰图变换 - Curve Fitting 在鸟瞰图上做好拟合后,再变换回原图 - 总结:论文的主要贡献 1. 分支的多任务架构,用于将车道检测问题转换为实例分割任务,处理车道变化并允许推断任意数量的车道。 2. 在给定输入图像时估计透视变换的参数的网络,该透视变换允许对道路路面变化具有鲁棒性的车道拟合。 - 算法——LaneNet网络 ![img](.md_images/20190429224347919.png) - 算法——H-Net网络 略。由于是用于透视转换的,在车道检测项目中暂时不做分析 ##### √ SCNN - 2017 - 论文 & 参考解读 Spatial As Deep: Spatial CNN for Traffic Scene Understanding. AAAI, 2018. [深度学习笔记(十四)车道线检测 SCNN - xuanyuyt - 博客园](https://www.cnblogs.com/xuanyuyt/p/12022040.html) [论文代码 - lua-torch](https://github.com/XingangPan/SCNN) [侯跃南HOU Yuenan 复现代码 - tf](https://github.com/cardwing/Codes-for-Lane-Detection/tree/master/SCNN-Tensorflow)
论文目录 Abstract Introduction Spatial Convolutional Neutral Network Lane Detection Dataset (i.e. CULane) Spatial CNN Analysis Experiment Lane Detection Lane detection model Evaluation Ablation Study Semantic Segmentation on CityScapes Conclusion Acknowledgments References
- 简介 & 论文总结 - overview 由港中文大学和商汤于2017年联合发表。 LaneNet和SCNN作为最早公开Datasets和open source code的车道线方法,基本上是所有上手lane detection领域必定会去了解的。而SCNN的结果也基本可以作为Tusimple Dataset和CULane Dataset的state of art来看待。 这篇文章将lane detection定义成semantic segmentation的任务,将每一条线通过一个预设的类别去定义,即使省去了LaneNet中cluster这种复杂操作,也可区分出不同线的实例。 - pros & cons 1. 亮点 公开了新的CULane Dataset。 提出了SCNN,slice-by-slice convolutions 使信息可以在图像的行列之间传递。 将lane detection定义成semantic segmentation的任务,将每一条线通过一个预设的类别去定义,即使省去了LaneNet中cluster这种复杂操作,也可区分出不同线的实例。 2. 缺点 通过线的实例来定义类别会导致必须设一个类别数量的上限值,只能处理车道线条数不大于上限值的情况。 据个人观察,通过线的实例来定义类别,学到的更多是车道线location信息。在应对变道场景、离当前车道两侧较远的线、分割结果不够精确等复杂情况时,会产生不同实例类别的混淆,且实例的混淆会产生扩散效应。 分割采用backbone+SCNN的结构。在paper中backbone选用的是LargeFOV (Deeplabv2),而SCNN能占到整个网络1/3左右的计算量,在实际工程应用中没法达到实时的性能。 - summary 对于细长的车道线检测是很有效的,但是速度慢(7.5FPS),这阻碍了它在现实世界中的适用性 - 提出SCNN 卷积神经网络通过逐层卷积不断扩大感受野以增强算法对于场景的理解能力。但对于具有长结构区域并且可能被遮挡的物体来说,卷积神经网络仍然表现不佳。 SCNN 针对这一问题,论文受传统传统消息传递方案MRF、CRF的启发,设计了一种灵活的空间CNN(SCNN),即深度卷积神经网络将Feature map的行或者列视为层,并顺序地应用卷积、非线性激活和求和操作,形成一个空间上的深度神经网络。 以这种方式,信息可以在同一层中的神经元之间进行传播,用于解决遮挡或视觉线索不明显的物体检测(~~个人觉得~~出发点有点类似于Attention结构,用于解决long-term and short term dependency问题)。 - SCNN神经网络适合学习长条形先验空间关系,能平滑的找出连续的有强先验的结构目标。 - 算法部分给出了两个网络:SCNN网络,lane_detection网络 - 算法——SCNN网络 注意,SCNN_D/U/R/L各使用1个卷积核,即这个过程只使用了4个卷积核. SCNN可以不仅仅被看作车道线解决方案,也可以是一种纯语义分割方法。 ![image-20210907211129491](.md_images/image-20210907211129491.png) - 算法——lane_detection 网络分割采用backbone+SCNN的结构。在paper中backbone选用的是LargeFOV ①语义分割/实例分割部分,实际上是 backbone + SCNN + upsampling 过程 ②概率预测部分,实际上不是图中的流程,而是用SCNN处理后上采样前的结果作为输入 image-20210929212857373 ##### √ SAD - 2019 // KD - 论文 & 参考解读 Learning lightweight Lane Detection CNNs by Self Attention Distillation. [复现代码,比论文里精度稍低些 - pytorch](https://github.com/InhwanBae/ENet-SAD_Pytorch)
论文目录 Abstract 1 Introduction 2 Related Work Lane detection Knowledge and attention distillation 3 Methodology 3.1 Self Attention Distillation Activation-based attention distillation Adding SAD to training Visualization of attention maps with and without SAD 3.2 Lane Prediction 3.3 Architecture Design 4 Experiments Datasets Evaluation metrics Implementation details 4.1 Results 4.2 Ablation Study Distillation paths of SAD Backward distillation SAD vs Deep Supervision When to add SAD 5 Discussion
- 简介 - overview 本文通过Self Attention Distillation(SAD)模块,用较小的网络提升了大模型的baseline,还提升了速度。在ENet-SAD上,参数量小了1/20,速度快20倍。 - 思路:让浅层特征学习高层特征的表达后能加强网络整体的特征表达能力。 - 性能:作者在Tusimple、CuLane、BDD三个数据集上都做了实验,ENet-SAD可媲美SCNN。 - 网络结构: …… - 效果 算法在CULane、TuSimple以及BDD100K数据集上进行测试 在CULane数据集上采用ResNet 101主干网络的前提下达到71.8%的检测精度。 在BDD100K上能够达到36.56%的检测精度。 在TuSimple数据集上能够实现96.64%的检测精度。 - 算法 ![image-20211001185329793](.md_images/image-20211001185329793.png) ##### √ CurveLanes // NAS, anchor - 论文 & 参考解读 Unifying Lane Sensitive Architecture Search and Adaptive Point Blending. [代码](https://github.com/xbjxh/curvelanes)
Abstract 1 Introduction 2 Related work Lane detection Neural Architecture Search 3 CurveLane-NAS framework 3.1 Elastic Backbone Search Module 3.2 Feature Fusion Search Module 3.3 Adaptive Point Blending Search Module 3.4 Unified Multi-objective Search 4 Experiments 4.1 New CurveLanes Benchmark 4.2 Other Datasets and Evaluation Mertics Evaluation metrics NAS Implementation Details 4.3 Lane Detection Results Comparison with the state-of-the-art on CULane Results on new CurveLanes Searched Architectures Ablative Study 5 Conclusion
- 简介 - overview 采用CNN的方式,通过多尺度融合和输出的方式提高定位精度,最后采用一种类似于NMS方法,将低层输出中位置精度回归较高的点逐步向高层输出替换,得到最后融合优化的车道线点输出。 - 算法 ##### VPGNet - 2017 - 论文 VPGNet:Vanishing Point Guided Network for Lane and Road Marking Detection and Recognition #### 4.2 行分类方法 ##### √ E2E-LMD - 2020 // SE_block - 论文 & 参考解读 End-to-End Lane Marker Detection via Row-wise Classification [代码-pytorch](https://github.com/Vipermdl/E2E-ERFNet)
论文目录 Abstract 1 Introduction 2 Related Work 3 Proposed Method 3.1 Network Architecture Architecture Design Horizontal Reduction Module 3.2 Training vertex location loss vertex confidence loss lane_marker-wise confidence i.e. 判断lane_i是否存在的置信度 3.3 Inference 4 Experiments Datasets Evaluation Metrics Implementation Details 4.1 Results Quantitative analysis Qualitative analysis 4.2 Ablation Experiments Architecture The number of shared HRM Loss function 5 Conclusion
- 简介 - overview 之前的车道线检测方法都是采用分割的思路,找到所有属于同一条车道线实例的mask,再通过曲线拟合的方法去输出车道线。这篇文章的目的就是去探索能否直接去回归每条线的拟合参数,从而实现真正意义上的end to end。 E2E-LMD算法是现阶段CULane数据集上的SOTA,论文首次在车道线领域中采用基于行的车道线检测任务,即区分出每条车道线在每行的具体位置即可。 - 算法 ##### ? IntRA-KD - 2020 // KD, graph - 论文 & 参考解读 Inter-Region Affinity Distillation for Road Marking Segmentation. CVPR, 2020. [官方代码](https://github.com/cardwing/Codes-for-IntRA-KD)
论文目录 Abstract 1 Introduction 2 Related work road marking segmentation knowledge distillation 3 Methodology 3.1 problem formulation 3.2 inter-region affinity knowledge distillation generation of AOI AOI-grounded moment pooling inter-region affinity distillation adding IntRA-KD to training 4 Experiments datasets evaluation metrics implementation details baseline distillationi algorithms 4.1 results 4.2 ablation study effect of different loss terms effect of loss coefficients 5 Conclusion
- 简介 - IntRA-KD是商汤&港中文&南洋理工在CVPR2020的一篇road marking分割的任务,可以看作是ICCV2019上的SAD的改进 - 算法 ##### √ UFAST - 2020 - 论文 & 参考解读 Ultra Fast Structure-aware Deep Lane Detection. ECCV, 2020. [官方代码](https://github.com/cfzd/Ultra-Fast-Lane-Detection) - 简介 - overview 将车道线检测定义为寻找车道线在图像中某些行的位置的集合,即基于行方向上的位置选择、分类。 - 性能 轻量级的版本可以在接近SOTA的性能情况下达到300+FPS的检测速度 - 问题 虽然Ultra Fast LaneNet能够在CULane数据集上实现较高的检测精度以及推断速度,但Ultra Fast LaneNet在变道时,存在着严重的误检问题,由于CULane数据集中变道的场景较少,因此并未在结果中体现。 - 算法 #### 4.3 基于anchor的方法 ##### Ø PointLaneNet - 2019 - 论文 Pointlanenet: Efficient end-to-end cnns for accurate real-time lane detection 未下载到原论文 - 简介 - overview 在semantic segmentation之外,开辟出了新的车道线的表示方法,即,在预先分割好y坐标的基础上用二维的点的集合表示。 - 算法 可参考CurveLanes-NAS论文中,借鉴了PointLaneNet算法的部分。可见使用了比LaneATT简略的anchor。 ##### Ø Line-CNN - 2019 - 论文 & 参考解读 Line-CNN: End-to-end traffic line detection with line proposal unit 未下载到原论文 - 简介 - overview 在PointLaneNet的车道线可以用点的集合+三次曲线拟合连接的表示方法基础上,给出了经典的预测车道线的anchor方法体系(LPU, line proposal unit)。后续的论文基本都是沿此基础的工作。 - 算法 ##### √ LaneATT - 2021 // ATT - 论文 & 参考解读 Keep your eyes on the lane: Real-time attention-guided lane detection. [代码](https://github.com/lucastabelini/LaneATT)
论文目录 Abstract
1 Introduction
2 Related work
segmentation-based methods
row-wise classification methods
other approaches
reproducibility
3 Proposed method
3.1 lane and anchor representation
3.2 backbone
3.3 anchor-based feature pooling
3.4 attention mechanism
3.5 proposal prediction
3.6 NMS
3.7 model training
3.8 anchor filtering for speed efficiency
4 Experiments
efficiency metrics
implementation details
4.1 TuSimple
dataset description
evaluation metrics
results
4.2 CULane
...
4.3 LLAMAS
...
4.4 efficiency trade-offs
4.5 ablation study
5 Conclusion
- 简介 - overview ??? - 特色 1 在Line-CNN的LPU基础上,进一步利用了 global features & local features 2 引入了attention机制,通过它来得到 global features - 算法 #### 其他:基于GAN的方法 ##### EL-GAN - 2019 - 论文 EL-GAN: Embedding loss driven generative adversarial networks for lane detection. ##### ??? LCST- 2020 - 论文 Lane detection in low-light conditions using an efficient data enhancement: Light conditions style transfer. #### 其他:结合RNN的方法 ##### FastDraw - 2019 - 论文 & 参考解读 FastDraw: Addressing the Long Tail of Lane Detection by Adapting a Sequential Prediction Network.CVPR, 2019. - 简介 - 算法 ##### ** - 2016 - 论文 Deep neural network for structural prediction and lane detection in traffic scene #### 其他:结合cluster的方法 ##### ** - 2018 - 论文 Learning to cluster for proposal-free instance segmentation. ##### ** - 2019 - 论文 Agnostic lane detection #### 其他:3D方法 ##### 3D-LaneNet - 2019 - 论文 3d-lanenet: End-to-end 3d multiple lane detection. #### 其他:结合transformer的方法 ##### LSTR - 2020 - 论文 End-to-end Lane Shape Prediction with Transformers [代码](https://github.com/liuruijin17/LSTR) #### 其他:关键点检测 & 点云实例分割 ##### ~~PINet - 2020~~ - 论文 Key Points Estimation and Point Instance Segmentation Approach for Lane Detection - 简介 - 本篇文章提供了一个新的思路,融合了关键点检测与点云实例分割的方法。 文章结合关键点检测与点云实例分割的方法成功实现了新的车道线处理算法,可适用于任意场景、检测任意数量的车道线。结合后处理算法后误检率极低,具有非常强的鲁棒性。由于用的关键点检测方法,相比分割网络而言,模型更小,计算开销也更小。 - 与 ENet-SAD 相比,似乎准确率有所提升但有限、速度没有SAD快、模型也没有SAD小。 #### 其他方法 ##### PolyLaneNet - 2020 - 论文 & 参考解读 PolyLaneNet: Lane Estimation via Deep Polynomial Regression. ICPR, 2020. - 简介 - overview PolyLaneNet采用多项式拟合的方式预测车道线。 - 算法 ##### Munich - 2018 - 论文 Reliable multilane detection and classification by utilizing CNN as a regression network: Munich. ##### E2E-LS - 2019 - 论文 End-to-end Lane Detection through Differentiable Least-Squares Fitting - 简介 - overview 之前的车道线检测方法都是采用分割的思路,找到所有属于同一条车道线实例的mask,再通过曲线拟合的方法去输出车道线。这篇文章的目的就是去探索能否直接去回归每条线的拟合参数,从而实现真正意义上的end to end。 - pros & cons 1. 亮点 这篇paper的最大亮点无疑是将Least-Squares Fitting方法加入到Network中,并利用其可微的性质设计出了area loss实现了back propagation,证明了直接回归拟合参数的可行性,开拓了新的思路。 2. 缺点 (1)只能做固定条数的车道线,文章中提到做少量的车道线效果会更好 (2)拟合结果依赖于上一步的weight maps(即分割)的结果,分割的上限决定了拟合的上限,因此根据拟合参数将线画到原图上并不那么贴合,效果其实不如之前的分割+后处理拟合 (3)文中提到可以尝试用更通用的可微分梯度下降模块取代最小二乘拟合模块 - 算法 ##### ~~Real_time-LaneNet - 2018~~ - 论文 LaneNet: Real-Time Lane Detection Networks for Autonomous Driving - 简介 - overview 采用Encoder-LSTM的方式,分割出车道线后采用聚类算法将不同的车道线进行区分,然后再通过一个HNet变换到鸟瞰视角去检测车道线。 - 介绍 LaneNet[8]提出了一种两阶段车道线检测算法,包含车道边缘提议网络以及车道定位网络。 其中:车道边缘提议网络为Encoder-Decoder结构的语义分割网络,通过生成逐像素的预测概率,判断像素是否为车道线。车道线定位网络将车道边缘提议网络的输出车道线边缘点的坐标作为输入。论文在车道定位网络中设计了一个输入顺序不敏感的编码器,将输入点编码成一个车道线低维特征表示。在输入的坐标点编码成低维表示之后,采用LSTM解决图像中的车道线数目以及解码每一车道的参数。从左到右,采用二次函数拟合图像中的每一条车道,使用LSTM不断预测秒速每一条车道的参数的参数的置信度。 [参考](https://zhuanlan.zhihu.com/p/180247957) - 论文提出两点: 1. 改进分割网路,更轻量级。用depthwise、减少encoder计算量,dialated conv增加感受野,sub-pixel convolution替换deconv减少计算量,交叉熵作为loss。 2. 创新性地用LSTM来提取线,将分割mask中所有响应点坐标输入,通过conv1d进行特征提取后,用LSTM预测出每条线的坐标方程。直接预测参数方程很难work,所以通过预测固定高度Y=(0,h/2,h)三个点的X坐标(K1,K2,K3)来表示方程,loss用三点的L2 loss计算。用以下公式可转换求解出方程参数。 #### 若干论文的简单总结 1. 《Robust Lane Detection from Continuous Driving Scenes Using Deep Neural Networks》:采用CNN+RNN的方式,在Encoder和Decoder之间插入LSTM模块,对连续帧的输入预测二值分割图。 2. 《Heatmap-based Vanishing Point boosts Lane Detection》:采用Encoder-Decoder结构,在车道线的预测Head以外,增加了一个Head用于消失点的预测;这种结构将特征提取阶段的输出和车道线预测的输出进行信息融合,再经过卷积层的处理后,输出消失点的预测结果。(类似VPGNet) 5. 《RESA: Recurrent Feature-Shift Aggregator for Lane Detection》:采用Encoder-Decoder的方式,在Encoder和Decoder部分之间,插入RESA模块,增强空间结构信息在全局的传播能力。(类似SCNN) 6. 《Real-Time LaneDtection Networks for Autonomous Driving》:采用Encoder-LSTM的方式,分割出车道线后采用聚类算法将不同的车道线进行区分,然后再通过一个HNet变换到鸟瞰视角去检测车道线。 7. 《Key Points Estimation and Point Instance Segmentation Approach for Lane Detection》:PiNet算法将车道线用点表示转换成点的回归问题,然后使用聚类算法区分不同车道线上的点和去掉一部分多余的点。 ## §5 笔记3:车道检测DL算法综述_others #### 5.1 近期比较新的方法 - 参考:[车道线检测综述及近期新工作 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/376322147) ##### 2021: 1. Structure Guided Lane Detection IJCAI 2021 美团 2. CondLaneNet: a Top-to-down Lane Detection Framework Based on Conditional Convolution 3. Keep your Eyes on the Lane: Real-time Attention-guided Lane Detection CVPR 2021 代码开源 4. YOLinO: Generic Single Shot Polyline Detection in Real Time 5. LaneAF: Robust Multi-Lane Detection with Affinity Fields 代码开源 6. Robust Lane Detection via Expanded Self Attention 7. End-to-End Deep Learning of Lane Detection and Path Prediction for Real-Time Autonomous Driving 8. RESA: Recurrent Feature-Shift Aggregator for Lane Detection AAAI 2021 代码开源 9. End-to-end Lane Shape Prediction with Transformers WACV 2021 代码开源 ##### 2020: 1. 3D-LaneNet+: Anchor Free Lane Detection using a Semi-Local Representation 2. Keep your Eyes on the Lane: Attention-guided Lane Detection 代码开源 3. RONELD: Robust Neural Network Output Enhancement for Active Lane Detection ICPR 2020 代码开源 4. CurveLane-NAS: Unifying Lane-Sensitive Architecture Search and Adaptive Point Blending ECCV 2020 Datasets 5. Towards Lightweight Lane Detection by Optimizing Spatial Embedding ECCV 2020 Workshop 6. Structure-Aware Network for Lane Marker Extraction with Dynamic Vision Sensor 7. Lane Detection Model Based on Spatio-Temporal Network with Double ConvGRUs 8. Heatmap-based Vanishing Point boosts Lane Detection 9. Synthetic-to-Real Domain Adaptation for Lane Detection 10. E2E-LMD: End-to-End Lane Marker Detection via Row-wise Classification 11. SUPER: A Novel Lane Detection System 12. Ultra Fast Structure-aware Deep Lane Detection ECCV 2020 代码开源 13. PolyLaneNet: Lane Estimation via Deep Polynomial Regression 代码开源 14. Inter-Region Affinity Distillation for Road Marking Segmentation CVPR 2020 代码开源 15. Gen-LaneNet: A Generalized and Scalable Approach for 3D Lane Detection ECCV 2020 代码开源 16. Detecting Lane and Road Markings at A Distance with Perspective Transformer Layers 17. Semi-Local 3D Lane Detection and Uncertainty Estimation 18. FusionLane: Multi-Sensor Fusion for Lane Marking Semantic Segmentation Using Deep Neural Networks 代码开源 19. PINet:Key Points Estimation and Point Instance Segmentation Approach for Lane Detection 代码开源 20. Better-CycleGAN + ERFNet: Lane Detection in Low-light Conditions Using an Efficient Data Enhancement : Light Conditions Style Transfer submitted to IV 2020 21. Multi-lane Detection Using Instance Segmentation and Attentive Voting ICCAS 2019 ## §* 附录:其他 #### 6.1 机器之心访谈:DA中的CV [描述来源:[CVPR PAMI青年研究员奖得主Andreas Geiger:自动驾驶中的计算机视觉|机器之心](https://www.jiqizhixin.com/articles/interview-with-Andreas-Geiger-at-CVPR2018?from=synced&keywords=自动驾驶)] [本地文本记录](./参考文献:车道检测项目/0 自动驾驶/CVPR PAMI青年研究员奖得主Andreas Geiger:自动驾驶中的计算机视觉 _ 机器之心.pdf) - 问题目录 问题目录 机器之心:自动驾驶系统都由哪些模块组成?它们之间的依赖关系是什么? > 自动驾驶系统通常有一个非常经典的、模块化的流水线。 > > 首先是**感知模块**(perception stack),感知模块将地图、三维传感器、二维传感器中的信息给到**「世界模型」**(world model),世界模型将上述信息,汇总在一张地图中,理解每一个时刻不同的物体相对于路面、道线等的位置,预测下一刻的可选路径都有哪些。随后是一个**规划模块**(planning model),进行决策。决策的内容也是分层级的。粗粒度的决策需要决定如何从 A 点到 B 点,完成的是类似 GPS 的工作。除此之外还有诸多细粒度的决策工作,例如决定走哪一条车道,是否要暂时占用对向车道完成超车,车速应该设定为多少等。最后是**控制模块**(control module),控制模块操纵所有的控制器,有高层的控制器,比如电子稳定系统 ESP,也有最基层的控制器,比如控制每一个轮子进行加速和刹车的控制器。 机器之心:想要让一个自动驾驶系统作出正确的决策,首先要完成哪些计算机视觉任务? > 目前正在发展的计算机视觉技术对自动驾驶系统的发展非常关键。想要让一个自动驾驶系统作出正确的决策,主要涉及到以下计算机视觉任务: > > 首先是**车辆定位**:衡量车辆的运动并在地图中进行定位。完成这部分工作的是视觉测距(visual odometry)系统和定位(localization)系统。二者的区别是,视觉测距估计的是车辆相对于前一时间步进行的相对运动,而定位是对车辆在地图中的运动进行全局的估计。定位是可以精确到厘米级的,车辆相对于一些地图中固定的物体(例如电线杆)的距离已经是已知的,基于这些信息,车辆已经可以进行相当不错的路径规划了。 > > 然后是**三维视觉重建**,重建范围通常在 50-80 米,具体需求视行驶速度而定。大部分 STOA 自动驾驶系统会使用激光雷达(LiDAR)进行三维重建。不过也有少部分团队试图直接从图像中恢复三维信息。由于图像中的数据相比之下更为嘈杂,因此完全基于图像的重建是一项更具有挑战性的工作。 > > 除了重建之外,你也需要对车辆正前方正在发生的事有充分的理解。因此,你需要进行**物体检测**,也需要在理解物体是什么的基础上对其进行进一步的**分类**,而检测和分类会帮助预测其未来轨迹。进行检测和分类的方式是多样的,你可以给每一个物体画一个边界框(bounding box):这是最常见的方式,但是自动驾驶需要在三维的物理世界中进行运动规划,所以你至少要需要一个三维的边界框。 > > 更精确的是**实例分割**(instance segmentation)和**语义分割**(semantic segmentation)。当物体是形状为凹或者是隧道之类需要穿行的物体时,边界框显然是不够的。实例分割将图像里属于一些特定目标类别的每个实例的所有像素分为一类。实例分割通常在二维图像上进行,但也有三维版本,三维实例分割基本等同于物体重建。而语义分割为图像里每一个像素分配一个语义标签,同一类别的不同实例不做区分。除此之外,**全景分割**(panoptic segmentation)基本上可以视作实例分割和语义分割的结合。全景分割对那些没有实例只有整体的类别也进行区分,例如天空和植被。天空无法用一个边界框框柱,而植被需要在平时避开,但系统也需要知道在紧急情况下汽车冲上草坪并无大碍(相比之下撞上树或者行人就有很大问题了)。因此语义信息是必要的。 > > 接下来是**运动估计**。根据之前的一帧或数帧,预估视野里的每一个点,或者说每一个物体,在下一帧的位置。一些物体,例如车辆,它们的移动是比较容易预判的,因此运动模型可以进行准确率较高的预测。而另外一些物体,例如行人,会非常突然地变更其运动轨迹,导致运动模型的建立更为艰难。即便如此,较短时间区间(2-3 秒)的动作预测,在动态物体较多的拥挤场景下的决策过程中也仍然扮演着至关重要的角色。 > > 上述任务都是各自独立的,但是实际上,收集上述信息的系统并不是各自独立运转的。因此**情境推理**(contextual reasoning)也有助于给出更准确的预测。例如一群行人通常会同时等红灯、同时过马路,一辆车试图并线时另一辆车会刹车让路,以这些外部信息、先验知识做约束,理解复杂场景会变得更为容易。 > > 最后,一个还没有引起较多重视的领域是**不确定性推理**(reasoning under uncertainty)。人类感官或者车辆传感器拿到的数据中必然包含着不确定性,因此,如何准确地评估不确定性,并兼顾「最小化风险」和「完成任务」,是一个重要的话题。理想情况下,所有上述检测、分割、重建、定位任务都应该在不确定性约束下进行,系统在行进之前应该知道它可能犯哪些错误。 机器之心:如何对与自动驾驶相关的计算机视觉任务进行分类?分类的标准是什么? > 以输入进行分类是一种常见做法。**按照输入的来源**,可以分为来自激光雷达、摄像头、雷达、乃至车内的其他仪表的数据。**按照输入表征**也可以进行分类,激光雷达给出的稀疏的点云和摄像头给出的密集的二维图像就是两种不同的表征,采取的算法也有所不同。按照**维度**也可以进行分类,用于三维输入的算法通常更为复杂,因为如果不采取特殊做法,三维输入会快速耗尽内存资源。 > > 另一种分法是**按照线索**分类。线索可以分为语义线索(semantic cues)和几何线索(geometric cues),几何线索是利用多张图片通过特征匹配和三角对齐得到深度信息。但是因为这种估算的误差与距离呈平方关系,因此有很大的局限性。换言之,人类的视觉系统其实也是不适合开车的,因为我们的视觉系统只是为了在两手张开的距离内进行操作而设计的。人类在开车的时候利用语义线索弥补了这一缺陷:即使只有一张图片,理论上其中并不包含距离信息,人类仍然可以根据大量的先验知识估计其中物体的相对距离。总而言之,自动驾驶系统可以通过安装多个摄像头获得三维信息,也可以通过安装一个摄像头,但是通过强先验来预判会看到什么。理想情况下,我们希望将二者结合。 > > 还有一种方法是**根据物体是否运动以及如何运动**进行分类。首先分为静态部分识别和运动物体识别。对于静态场景来说,有专门的标准重建算法,基于「所有的东西都是静态的」这一假设进行重构。但是事实上,我们需要从多幅拍摄于不同时间的图像中重建场景,这就需要我们设计专门的算法来处理场景中的运动物体。运动物体又可以分为刚性物体和非刚性物体。刚性物体的所有部分一起运动,可以用六自由度变化来描述它在三维空间中的运动轨迹。汽车就是一个刚性物体,而行人就属于非刚性物体,行人有胳膊、腿,彼此之间以关节相连,在运动中,每一个部分的运动轨迹大相径庭,因此刻画行人的运动需要额外的自由度。 机器之心:任务之间是否有先后顺序?是否存在一个自动驾驶系统通常采用的完成任务的流程? > 首先,确实存在一些依赖关系。例如三维物体识别需要以三维信息为基础。如果你只有普通的图像,那么通常就要从三维重建开始。虽然这不是必须要做的,但是大多数研究者选择采用这个流程。也有人选择用动作(motion)来辅助识别,但是动作只是一个非常弱的线索。 > > 三维重建也不仅仅对三维识别有帮助,它也有助于运动估计。基于 RGBD 信息的运动估计难度要小于仅基于 RGB 信息的运动估计。 > > 而基于地图的定位也有助于行人及其他交通参与者的行为预判。例如,人行道的常见位置、红绿灯的常见位置给出了一个关于行人运动轨迹的强先验。另外,定位还能帮助你「穿墙透视」:即使路的转角被高楼大厦遮挡住了,根据地图定位,你仍然知道楼后面是马路,而马路上会有其他交通参与者存在。 机器之心:来自不同传感器的数据如何共同作为输入服务于同一模型? > 总的来说,识别或者检测类任务是靠着找出物体的**形状**和**外观**进行的。不同的传感器的长处各不相同,激光雷达给出距离信息,但是很难描述外观,因为激光雷达捕捉反射率,反射率与外观并不直接相关。而图像中虽然包含丰富的外观信息,但是缺少距离信息。毫米波雷达的视野非常窄,但是可以进行远距离测距和测速。 > > 理想情况下,你要根据不同传感器的特点去将它们生成的数据组合在一起。例如,如果你同时拥有立体视觉数据和激光雷达数据,你希望利用激光雷达的远场数据和立体视觉的近场数据。这是因为在 10-15 米范围内,立体视觉要比激光雷达精确,但是超出了这个范围,激光雷达反而更为精确。 > > 由于不同传感器之间的校准是非常困难的,因此在每一个点选择信任哪个传感器的数据是一道世界性的难题。而结合的做法有很多,总得来说就是把不同的数据类型投射到同一个空间内。你可以用立体摄像机找到每个三维点阵里对应的像素值,把它和激光雷达数据结合,也可以把激光雷达中的深度信息投影回图片里。 > > 当然,这只是研究者通常采用的方法,从很多汽车制造商的角度,他们希望拥有信息冗余,让不同的传感器各自为政,作出独立的决策。这样一旦某一个传感器失灵了,其余的传感器仍然能提供决策所必要的信息。 机器之心:研究者所采用的系统和汽车制造商使用的系统有哪些不同? > 如今的车辆和驾驶员辅助系统通常都存在算力非常分散化的现状。用于研究的车辆可以有一个集中的处理器,但是如今的车辆中系统的现状是,摄像头的算力只与摄像头相连,控制系统的计算单元算力也非常小,你只能把物体基本信息提交给它,无法把深度信息全部提交给它。 > > 但是理论上,只有当你集成了所有传感器获得的信息,才能获得最佳的性能。因此这也是从当今的驾驶辅助系统到自动驾驶汽车需要完成的一个转变。 机器之心:现如今,绝大多数自动驾驶公司仍然选用不同类型、数量的传感器,开发自己的系统。不同传感器带来的差异有多大? > 大多数传感器的工作原理还是相似的。例如,对于摄像头而言,大多数公司都选择对光线变化尽可能敏感的,或者说动态范围(dynamic range)尽可能大的摄像头。这是因为如今摄像头的动态范围仍然远小于人眼,例如,从阳光下驶入隧道后就要求系统迅速更换摄像头的结构以适应突如其来的黑暗。此外,世界上生产感光元件也只有屈指可数的几家,因此摄像头之间的差别并不大。 > > 但是,即使完全相同的摄像头,安装的高度、位置不同,视野里看到的东西就会存在很大的差异。比如卡车车顶的摄像头和普通的小型车车顶的摄像头,其相对于路面的相对位置的巨大差异就决定了他们的很多配置和算法无法通用。这是一个有待解决的研究课题。 > > 至于激光雷达,如今的大多数激光雷达都来自 Velodyne。但是现在也有越来越多新牌子涌现。同时,在传统的旋转式雷达之外也发展出了更便宜、更容易装配的固态雷达。从学习的角度,这都是需要适应的部分。 > > 毫米波雷达更为神秘,各家都将其工作原理视为机密,拿到毫米波雷达的原始数据都很困难。 > > 总体来讲,如今用于研究的设备配置方法都非常类似:例如把摄像头放在尽可能高的地方、尽可能在每个方向都设置摄像头等等。如今也有越来越多功能更为强大的摄像头问世,有的摄像头的分辨率已经接近人眼,有的致力于更远的焦距。 机器之心:现在的自动驾驶视觉领域都有哪些前沿问题? > 一个非常重要的问题是如何处理那些分布里极少出现的稀有事件、个案。如今行之有效的自动驾驶算法都是监督算法,而我们在收集训练集的时候无法拿到大量的稀有事件标记数据。我认为,我们需要找到好的**稀有事件生成模型**,现在,稀有事件刻画的领军团队无疑是 Waymo,但是他们采用的方法是搭建一个大实验室,把各种稀有事件人工演出来。 > > **领域迁移**是另一个大问题,我们不希望换了环境/车之后就要重新训练模型。迁移学习能够一定程度上通过在一个数据集上训练、在另一个上面精调来解决这个问题,但是这并不是最终的解决方案。 > > 此外,**仿真**(simulation)虽然不像前两项那么重要,也仍然有进步的空间。尤其是如何跨越从仿真到真实以及从真实到仿真的差距。仿真永远只是仿真,仿真能够表达出的维度永远无法达到真实世界的复杂程度,纹理、几何关系都过于简单了。前面谈到的稀有事件也是无法通过仿真习得的。 > > 最后,自动驾驶终归需要作出「主观判断」,这是整个人工智能领域面对的一个挑战:系统需要在前所未见的场景中进行决策,并且决策时可能需要稍微「违背规则」,这是计算机所不擅长的事情。 机器之心:能否介绍下您在图宾根大学/马普所的自动视觉组的工作重点? > 上文提到的研究我们大部分都有涉及。 > > 我们进行一些底层的研究,例如**三维重建和三维动作预测**。我们研究生成模型,我希望能将现有的生成模型扩展到能够生成整个「世界」的模型:生成内容包括几何信息、动作信息等等。当然,整个学术界距离实现这一步还有很长的路要走,但是一旦实现,这将对仿真以及自动驾驶的训练给予极大帮助。 > > 另一方面,我们也在研究**小数据学习**,因为数据是一个太大的问题。在 KITTI 360 数据集中,我们就做了一些尝试,例如在三维空间进行标注,然后由此获得二维的标注。对于动作估计来说更是如此,因为人类甚至不能很好地对动作数据进行标注。 > > 还有**仿真与真实世界的连接**,例如我们近期的工作在研究如何把虚拟的物体放进真实场景中,这样我们只需要对我们真正关注的部分建模。 > > 从模型的角度来看,我们主要研究**深度学习模型和概率模型**。我们对学术界的贡献主要在于将深度学习应用在三维数据、稀疏数据等由于存储或模型能力限制而在现阶段无法获得较好效果的子领域。我们也在思考,分模块的自动驾驶系统是不是最优的解决方案?不考虑中间输出的端到端的自动驾驶模型会不会是更优的解决方案?最极端的端到端模型是用一个单独模型拿到图像之后直接进行方向盘、油门刹车的控制,但是建立这样的模型也非常难,我想二者中间某处可能存在更好的解决方案。 > > 我们也致力于**提供基准**(benchmarking),提供一个比较不同模型的公允基础。包括 KITTI 等一系列数据集、学术会议上的研讨会和挑战赛。KITTI 数据集本身就提供了超过了 10 项挑战。 机器之心:您如何选择研究课题? > 研究的终极原则是,不应以「最大化论文数量」为目标,应该以「最大化领域贡献」为目标。这也是为什么我们致力于建立基准:自动驾驶研究领域在 KITTI 的影响下发生了很多变化。 > > 另一个原则是「更进一步」,在直接能够投入业界应用的算法之外,我们更关心那些高风险,但是也潜在具有高收益的算法:它们有很大的概率会失败,但是一旦成功,就会是跨时代的一步。 机器之心:能否简要介绍一下 KITTI 数据集? > 我们一共进行了超过六小时的行驶,并且公开了三小时的行驶数据。这听起来并不多,但是相比于之前的自动驾驶公开数据集,已经有了一个非常巨大的数量上的提升。 > > KITTI 的优势在于我们在车上安装了各种传感器。第一代数据集包括了激光雷达、摄像头、GPS、IMU 等不同传感器的信号数据。 > > 我们在网上以挑战赛的形式发布了一系列任务,任务包括立体视觉、光流、场景流、二维物体识别和三维物体识别、鸟瞰图物体识别、语义分割、实体分割、道路与车道检测、单图像深度估计、深度完成(depth completion,把稀疏的激光雷达点云数据变为密集的图像)等。当前的自动驾驶系统需要的各类任务我们都有涵盖。 > > 每个任务的训练集大小主要取决于标注难度,例如立体视觉和光流有 400 张标记数据,动作估计有超过 10,000 张标记数据,单图像深度估计有 90,000 张。 > > 我们给出了训练集和不包含真实标签的测试集。研究者每个月可以向服务器上传他们的结果,我们则给出性能反馈。我们不向研究者提供测试集的真实标签,这在一定程度上解决了过拟合问题。 机器之心:如何选择衡量标准(evaluation metrics)?衡量标准与损失函数之间的区别是什么? > 我们通常采用业界已有的衡量标准。例如,在立体视觉和光流任务中,我们计算正确与错误的像素数;在物体识别任务中,我们计算平均精度,即预测和真值之间重叠的面积与总面积的比例。 > > 损失函数通常是我们想要实现的目标,在自动驾驶中,的确存在目标和损失函数错位的问题,我们的一些研究也在致力于弥合这种错位。例如,在光流任务里,一个左上角的代表天空的像素点真的和代表路面的像素点一样重要吗?如果不是的话,如何设置新的衡量标准?这都是我们在思考的问题。 机器之心:在数据集、衡量标准等方面,与自动驾驶相关的计算机视觉任务和通用计算机视觉任务有什么差异? > 首先是**多样性程度**不一样。自动驾驶是一个非常特殊的领域,这甚至让算法起步变得更「容易」:车辆不会行驶到下水道里、不会行驶在房顶上,如果你不知道身处何方,那么预测面前的像素是「道路」,准确率其实很高。 > > 但是另一个角度,自动驾驶和通用计算机视觉**对算法精度的要求**也是截然不同的,一个准确率 99% 的人脸识别算法已经很令人满意,但是一个准确率 99% 的自动驾驶模型大概每天都要撞翻点什么。因此自动驾驶需要注意图片里的细部,注意那些此刻距离我们很远,但是过一会儿就会出现在我们眼前的物体,通用视觉任务不需要如此。 > > 此外,**数据收集的难度**也截然不同,通用视觉任务的数据集大部分来自互联网,但自动驾驶所需的数据不是天然存在的。也很难标注。在业界,仅仅 Mobileye 一家公司每天就有近千人在专门进行数据标注,业界的算法与学界公开的算法相比,未必有显著的优势,其性能优势主要来源于数据优势。 机器之心:KITTI 360 相比于之前的版本有哪些更新?冲浪科技在数据集的建设方面做出了哪些工作? > KITTI 360 仍然沿用了同一辆车,我们增加了一个激光雷达,给出了更多、更加精确的三维信息。我们也增加了 360 度图像,为数据扩增建立了环境地图。我们希望这能让我们更好地标记视野中的物体。 > > 我们和冲浪科技合作开发了 KITTI 360 用到的三维标注工具(文中大部分示例图片截取自该点云数据标注平台)。自动驾驶的标注是一项十分复杂的工作,例如像素级别的语义和实例分割,通常情况下一张图像的标注要耗时 60 - 90 分钟。而利用我们共同开发的标注工具,标注时间被极大缩短,这对于实验室而言是至关重要的。 > > 今年年底我们会公开一些与三维视觉理解相关的新任务,比如图像中所有物体的识别以及方向估计,我们仍然在探讨合适的组织方式。同时我们也很关注时序连贯的分割,因为时序连贯是自动驾驶数据的固有特性。 #### 6.2 Apollo技术框架 - 版本历史 Apollo 1.0 2017.07 封闭场地循迹自动驾驶 Apollo 1.5 2017.09 固定车道昼夜自动驾驶 Apollo 2.0 2018.01 简单城市路况自动驾驶 Apollo 2.5 2018.04 限定区域视觉高速自动驾驶 Apollo 3.0 2018.07 量产园区自动驾驶 Apollo 3.5 2019.01 城市路况自动驾驶 5.0 5.5 6.0 - 参考来源 [不到两年迭代六个版本,百度 Apollo 变身「老司机」 (baidu.com)](https://baijiahao.baidu.com/s?id=1623143942760610238&wfr=spider&for=pc) [Apollo@gitee](https://gitee.com/ApolloAuto) [Apollo(百度自动驾驶):《下不同版本的apollo auto》 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/365589012) [专栏:Apollo6.0无人自动驾驶 - 知乎 (zhihu.com)](https://www.zhihu.com/column/c_1364128881138651136) #### 6.3 自动驾驶的研究方向 - 参考 [如何入门学习自动驾驶技术(一) - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/94498746) ![自动驾驶研究方向](.md_images/%E8%87%AA%E5%8A%A8%E9%A9%BE%E9%A9%B6%E7%A0%94%E7%A9%B6%E6%96%B9%E5%90%91.jpg) #### 6.4 一些网络集合 ##### ENet 2018年前后比较轻量级的Enet,但这几年诞生了很多新的分割网络,Enet这种性能、效果都不算突出的网络个人建议是可以去换掉的。 ##### LargeFOV i.e. DeepLab_v1 参考:[语义分割之DeepLabv2 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/54911894) FOV(field-of-view)。LargeFOV是指采用膨胀速率r=12的膨胀卷积策略,作者在VGG-16的fc6采用该膨胀卷积,并将fc7和fc8改为1x1的全卷积,命名为DeepLab-LargeFOV。 DeepLab-ASPP i.e. DeepLab_v2 ##### deep supervision [deep supervision_weixin_41274801的博客-CSDN博客_deep supervision](https://blog.csdn.net/weixin_41274801/article/details/82973723?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_aggregation-1-82973723.pc_agg_rank_aggregation&utm_term=deep+supervision&spm=1000.2123.3001.4430) #### 6.5 一些DL做车道分割的方法 ![在这里插入图片描述](.md_images/20190419114038819.png) 如上图所示,目前的主流方法pipeline分为多阶段与单阶段。 1. 多阶段可以分为两个部分,二值语义分割产生掩码图和对掩码图进行线的拟合。其中,二值语义分割主要采用CNN方法,并通过SCNN(Spatial As Deep: Spatial CNN for Traffic Scene Understanding)、CNN+RNN(Robust Lane Detection from Continuous Driving Scenes Using Deep Neural Networks)、GAN(EL-GAN:Embedding Loss Driven Generateive Adversarial Networks for Lane Detection)等方法来提高语义分割精度。 而对掩码图的线的拟合,有采用学习到的转换矩阵先将分割结果转换为鸟瞰图视角,然后,采用均匀取点+最小二乘法拟合,拟合方程可选三次方程。 2. 对于单阶段方法,即是直接回归出线的参数,即在CNN上修改分支,使用特殊层将参数输出。 ———————————————— 版权声明:本文为CSDN博主「holeung」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/soulmeetliang/article/details/89398412 #### 6.6 蒸馏、注意力机制 ##### A. 简介 - 蒸馏 参考:[SAD(自我注意力蒸馏)](https://blog.csdn.net/weixin_43786241/article/details/108469046?utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~default-6.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~default-6.no_search_link) 说到蒸馏,可能想到最多的就是知识蒸馏、注意力蒸馏,他们三者关系是什么?下面是作者逆风g做的总结: - **知识蒸馏**(Knowledge distillation) 用于把大网络学习到的内容(knowledge)迁移到小网络中。具体有两个目标要学习,一是小网络输出与真值的相似,二是让小网络与大网络的输出相似。 - **注意力蒸馏**(Attention distillation) 用于把大网络学习到的注意力特征图(attention map)迁移到小网络中。具体在知识蒸馏基础上,再对网络中间层特征进行迁移,以保证大小网络中间的注意力特征图相似。 - **自注意力蒸馏**(Self Attention Distillation) 抛弃大网络,单独在小网络中对不同层学习到的注意力特征图进行迁移学习。 - 注意力机制 参考:[PAYING MORE ATTENTION TO ATTENTION论文初读](https://blog.csdn.net/m0_37665984/article/details/103243543?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_aggregation-17-103243543.pc_agg_rank_aggregation&utm_term=attention+特征损失&spm=1000.2123.3001.4430) - activation-based attention 注意力图的含义——对一个层的激活输出做处理得到 - gradient-based attention 注意力图的含义——对原始图像求导就是结果,因为可以认为倒数大的地方就是影响大的地方,也就是需要注意的地方 ##### B. KD知识框架 - 参考:[一文读懂知识蒸馏](https://cloud.tencent.com/developer/article/1763873) [万字综述 | 一文读懂知识蒸馏](https://blog.csdn.net/u012347027/article/details/111415197) [Knowledge Distillation: A Survey 论文下载](https://link.springer.com/content/pdf/10.1007/s11263-021-01453-z.pdf) #### 6.7 主要的语义分割算法 - 参考:[干货 | 一文概览主要语义分割网络,FCN、UNet、SegNet、DeepLab 等等等等应有尽有](https://blog.csdn.net/u014072827/article/details/89173425) - 截至2018年 | 算法 | 时间 | 说明 | | ---------- | ---- | ------------------------------------------------------------ | | FCN | 2015 | FCN-8s在VOC2012上相对以前方法提升了20%,达到62.2% mIOU
encoder-decoder结构是语义分割的基础
此后一些较新的和更好的体系结构都基于此结构 | | SegNet | 2015 | | | U-Net | 2015 | | | DeepLab_v1 | 2015 | 在VOC2012上达到了71.6% mIoU | | DeepLab_v2 | 2017 | 在VOC2012上达到了79.7% mIoU | | DeepLab_v3 | 2017 | | | FCDenseNet | 2016 | | | E-Net | 2016 | | | Link-Net | 2017 | | | Mask-CNN | 2017 | | | PSPNet | 2017 | | | RefineNet | 2017 | | | G-FRNet | | | ## §* 无人驾驶课程 ##### Apollo ##### UdaCity ##### 图宾根大学《无人驾驶》课程(2021) Self-Driving Cars | Universitat Tubingen, by Andreas Geiger [链接](https://unni-tuebingen.de/fakultaeten/mathematisch-naturwissenschaftliche-fakultaet/fachbereiche/informatik/lehrstuehle/automonous-vision/lectures/self-driving-cars/),[bilibili搬运](https://m.bilibili.com/videl/BV1fL4y1zNH) ``