自动驾驶论文阅读笔记——精读YOLOP
Posted 书玮嘎
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动驾驶论文阅读笔记——精读YOLOP相关的知识,希望对你有一定的参考价值。
[阅读心得] 自动驾驶经典论文——YOLOP
写在前面
本文首次提出了将车辆检测、车道线检测、可通行区域分割三个任务通过一个网络同时完成,极大程度上减低了对算力的消耗,在Nvidia TX2上能够达到23FPS的速度(TRT加速后)。同时,这个网络设计的思路非常简洁清晰,为后续进一步提升这种自动驾驶场景下的多任务网络提出一个良好的示范。
【论文】YOLOP: You Only Look Once for Panoptic Driving Perception
【代码】https://github.com/hustvl/YOLOP
1. Abstract
本文提出了一种自动驾驶的全景感知网络,YOLOP,通过一个encoder+三个独立decoder的结构设计,使其能够同时完成车辆检测、车道线检测以及可通行区域分割任务,并且在BDD100K数据集上,这三个任务的表现在速度和精度上均达到了现阶段的SOTA。
2. Introdunction
本章主要陈述了3个观点:
- 全景感知(主要包括vehicle detection, lane detection, drivable area segmentation等任务)对自动驾驶有重要意义,且相互依赖。
- 目前许多方法都把全景感知的子任务分离地完成,尽管都分别取得了很好的性能,但是我们不得不考虑,把这些分离的网络在嵌入端并行的可行性。
- 全景感知的子任务的目标物往往存在着联系,因此期望对此建立一个multi-task任务,主要理由有:一是可以节约计算成本,二是可以在多任务间共享信息,有助于提高各自的性能表现
3. YOLOP
3.1 Overview
YOLOP网络的整体结构示意图如图所示,其由一个encoder和三个分离的decoder构成。其中,encoder包括backbone和neck两部分,三个decoder分别完成vehicle detection, lane detection, drivable area segmentation任务。下面对各个部分逐一进行介绍。
3.2 Encoder
这是网络中三个任务所共享的部分,主要包括backbone和neck两部分,结构都比较简单明了:
1)Backbone: CSPDarknet,轻量,节省参数和计算量
2)Neck: SPP+FPN,讲多尺度(SPP)和多级(FPN)的特征信息融合
3.3 Decoder
利用三个独立的Decoder同时完成三个任务,结构同样非常清晰简单:
1)Detect Head: 用PAN对neck的输出进行另一个方向(bottom-up)地融合,后使用anchor-based机制进行检测输出。每个grid被分配3个anchor。
2)Driable Area Seg Head & Lane Det Head: 这两个任务本是上都是语义分割任务,故采用完全相同的结构设计,只是各自输出的内容不同。此外,这部分结构设计非常简洁,只利用Neck输出的bottom层特征进行3次上采样,恢复到原图尺寸进行一个pixel-wise的输出即可。需要注意的是,这部分网络几乎没有可学习的参数,仅仅是bottom feature传导到Decoder的环节有参数。这样设计是否合理值得讨论。
3.4 Loss Function
这部分主要为上述三个子任务设计损失函数,也都比较常规,都选择了对应任务的经典损失函数。
1)Vehicles Det:
检测任务主要包含cls、obj、bbox reg三部分损失函数:
L
d
e
t
=
α
1
L
c
l
a
s
s
+
α
2
L
o
b
j
+
α
3
L
b
o
x
L_det = \\alpha_1L_class+\\alpha_2L_obj+\\alpha_3L_box
Ldet=α1Lclass+α2Lobj+α3Lbox
其中,
L
c
l
a
s
s
L_class
Lclass和
L
o
b
j
L_obj
Lobj采用Focal Loss,
L
b
o
x
L_box
Lbox采用CIOU LOSS
2)Lane/Area Seg:
两个分割任务均采用Cross Entropy Loss,此外,本文发现IOU Loss对车道线检测(分割)任务这种稀疏目标的回归很有效。
L
d
a
−
s
e
g
=
L
c
e
L_da-seg = L_ce
Lda−seg=Lce
L
l
l
−
s
e
g
=
L
c
e
+
L
I
o
U
L_ll-seg = L_ce + L_IoU
Lll−seg=Lce+LIoU
3)Total
所有Loss的表达式如下:
L
a
l
l
=
γ
1
L
d
e
t
+
γ
2
L
d
a
−
s
e
g
+
γ
3
L
l
l
−
s
e
g
L_all = \\gamma_1L_det + \\gamma_2L_da-seg + \\gamma_3L_ll-seg
Lall=γ1Ldet+γ2Lda−seg+γ3Lll−seg
其中,
α
1
,
2
,
3
\\alpha_1,2,3
α1,2,3,
γ
1
,
2
,
3
\\gamma_1,2,3
γ1,2,3都是可调参数
3.5 Training Paradigm
作者倾向于对三个子任务同时进行训练,因为这三个任务的确是相互关联的。
Traing End-to-end paradigm is useful when all tasks are indeed related
尽管如此,本文还是进行了其他训练范式的尝试,在后续实验部分会介绍。
4. Experiments
4.1 Compare with SOTA
1)Vehicle Detection
主要与Multi-task网络和主流检测网络(YOLO,R-CNN)进行比较,相比YOLOv5用了更少的trick达到了接近的性能,并且同时对三个任务满足实时性。
2)Drivable Area Seg
主要和Multi-task网络和主流分割网络进行比较,发现YOLOP效果由于其他所有网络,说明这种“shared information”的方式确实对各个子任务有帮助
3) Lane Detection
与主流的车道线检测网络进行比较,发现YOLOP的表现超过了所有其他网络,说明shared information对车道线检测任务也起到促进作用。
4.2 Ablation
本节分别讨论了Training Paradiam的不同方式的效果以及Mutil-task的有效性讨论。
1)End-to-end v.s. Step-by-step
由上图可知,End-to-End训练方式在检测指标上(Recall, AP)表现最好,而ED-W在分割任务(mIoU, Acc, IoU)上表现更好。
作者对此解释是:YOLOP模型结构更贴近检测网络的结构,所以先专门对检测器进行训练,再对全部任务进行训练,会得到更好的表现。
2) Multi-task v.s. Single task
从上图可知,Muti-task在检测任务上表现更好,Single-task在分割任务上的表现更好。
笔者任务,这是由于检测任务的Encoder-Decoder结构设计相对完整,而Seg部分网络的参数和结构过于简单,导致Multi-task的时候网络更加倾向于检测任务,一定程度上忽略的分割任务。
5. Analysis
本文首次提出了自动驾驶中全景感知的三个子任务结合起来,通过一个网络同时完成。这样做极大地节省了计算成本,同时发现了这三个任务潜在的相互促进的特性,非常有意义。
但是,笔者认为在网络设计上过于“简洁”,甚至分割网络中基本没有可学习的参数,只有3个插值上采样结构,这在一定程度上限制了网络的性能(也有可能是出于实时性的考虑?)。
因此笔者认为在网络结构方面,YOLOP仍存在可优化的空间,比如Lane Detection部分可以尝试分割任务以外的范式进行、三个任务之间信息共享可以更加密切、Muti-task任务的balance处理等方面。
总的来说,笔者认为,这篇文章胜在其新意和尝试,非常值得学习,在此工作的基础上,后续还有很多改进的工作可以做。
以上是关于自动驾驶论文阅读笔记——精读YOLOP的主要内容,如果未能解决你的问题,请参考以下文章
论文解读+实践YOLOP 全景驾驶感知 同时处理三大视觉任务
全景驾驶感知网络YOLOP部署与实现(交通目标检测可驾驶区域分割车道线检测)