[阅读心得] 自动驾驶经典论文——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+