论文解读+实践YOLOP 全景驾驶感知 同时处理三大视觉任务
Posted 一颗小树x
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了论文解读+实践YOLOP 全景驾驶感知 同时处理三大视觉任务相关的知识,希望对你有一定的参考价值。
前言
YOLOP能同时处理目标检测、可行驶区域分割、车道线检测 三个视觉感知任务,并速度优异、保持较好精度进行工作,代码开源。它是华中科技大学——王兴刚团队,在全景驾驶感知方面提出的模型,致敬开源精神。
论文地址:https://arxiv.org/abs/2108.11250
开源代码:https://github.com/hustvl/YOLOP
目录
摘要
全景驾驶感知系统是自动驾驶的重要组成部分。高精度、实时的感知系统可以辅助车辆在行驶中做出合理的决策。提出了一个全景驾驶感知网络(YOLOP)来同时执行交通目标检测、可行驶区域分割和车道检测。
在上图中,紫色边界框表示交通对象,绿色区域是可行驶区域,红色线表示车道线。
一、网络框架
YOLOP由一个用于特征提取的编码器,和三个用于处理特定任务的解码器组成。下图是YOLOP的网络结构:
YOLOP是一种单阶段网络,包含一个共享编码器,三个用于特定任务的解码器。不同解码器之间并没有复杂的、冗余共享模块,这可以极大降低计算量,同时使得该网络易于端到端训练。
1.1 Encoder 编码器
该网络中的编码器由Backbone网络与Neck网络构成。
Backbone网络:参考了YOLOv4,采用CSP-Darknet结构,提取输入图像的特征。它支持特征传播和重用,减少了参数和计算的数量。
Neck网络:使得提取的图像特征以充分利用它们。它由空间金字塔池(SPP)模块和特征金字塔网络(FPN)模块组成。SPP模型生成并融合不同尺度的特征,FPN模块融合不同语义层次的特征。因此,Neck网络生成包含“多个尺度”和“多个语义级别信息”的丰富特征,便于融合特征。
1.2 Decoders 解码器
YOLOP包含三个用于三个任务的解码器:目标检测部分、可行驶区域分割、车道线分割。
1)对于目标检测任务,YOLOP 采用了类似于 YOLOv4 的基于锚框Anchor的多尺度检测技术。这部分结构由“路径聚合网络”组成;Neck网络中的 FPN 自上而下传输语义特征,而 PAN 自下而上传输图像特征。YOLOP 将它们结合起来以获得更好的特征融合效果,由此获得的多尺度融合特征图用于检测。
多尺度特征的每个grid被赋予三个先验anchor(包含不同纵横比),检测头将预测位置偏移、高宽、类别概率以及预测置信度。
2)可行驶区域分割和车道线分割部分使用相同的网络结构。将FPN的输出特征(分辨率为)送入到分割分支。我们设计的分割分支非常简单,通过三次上采样处理输出特征尺寸为,代表每个像素是驾驶区域/车道线还是背景的概率。由于Neck中已包含SPP模块,我们并未像PSPNet添加额外的SPP模块。此外,我们采用了最近邻上采样层以降低计算量。因此,分割解码器不仅具有高精度输出,同时推理速度非常快。
来自 FPN 底层的大小为(W/8, H/8, 256)的特征被馈送到分割分支。它应用三个上采样过程并将特征图恢复为(W, H, 2),它表示输入图像中可行驶区域和车道线的像素级概率。在其他分割网络有 SPP 模块的地方,YOLOP 分割头不需要,因为Neck网络中共享 SPP 模块。
二、损失函数和训练方法
YOLOP 使用简单的损失函数,它为三个解码器头提供三个单独的损失函数。检测损失是分类损失、对象损失和边界框损失的加权和。可行驶区域分割头和车道线分割头的损失函数都包含带有 logits 的交叉熵损失。车道线分割由于其在预测备用类别方面的有效性而具有额外的 IoU 损失。模型的整体损失函数是所有三个损失的加权和。
上图是端到端与交替优化技术的训练结果。YOLOP 的创建者尝试了不同的训练方法。他们尝试了端到端的培训,这在所有任务都相关的情况下非常有用。此外,他们还研究了一些逐步训练模型的交替优化算法。每个步骤都专注于一项或多项相关任务。但经过作者测试,交替优化算法提供的性能改进可以忽略不计。
三、YOLOP效果与性能
车辆检测效果:
Model | Recall(%) | mAP50(%) | Speed(fps) |
---|---|---|---|
Multinet | 81.3 | 60.2 | 8.6 |
DLT-Net | 89.4 | 68.4 | 9.3 |
Faster R-CNN | 77.2 | 55.6 | 5.3 |
YOLOv5s | 86.8 | 77.2 | 82 |
YOLOP(ours) | 89.2 | 76.5 | 41 |
可行区域检测效果:
Model | mIOU(%) | Speed(fps) |
---|---|---|
Multinet | 71.6 | 8.6 |
DLT-Net | 71.3 | 9.3 |
PSPNet | 89.6 | 11.1 |
YOLOP(ours) | 91.5 | 41 |
车道线检测效果:
Model | mIOU(%) | IOU(%) |
---|---|---|
ENet | 34.12 | 14.64 |
SCNN | 35.79 | 15.84 |
ENet-SAD | 36.56 | 16.02 |
YOLOP(ours) | 70.50 | 26.20 |
性能小结:
YOLOP 在具有挑战性的 BDD100K 数据集上针对三个任务的最新模型进行了测试。它在对象检测任务的准确性方面击败了 Faster RCNN、MultiNet 和 DLT-Net,并且可以实时推断。对于可行驶区域分割任务,YOLOP 的性能分别比 MultiNet 和 DLT-Net 等模型高 19.9% 和 20.2%。而且,它比它们都快 4 到 5 倍。同样,对于车道检测任务,它的性能优于现有的最先进模型高达 2 倍。
它是首批在 Jetson TX2 等嵌入式设备上同时实时执行这三项任务并实现最先进性能的模型之一。
四、搭建开发环境
下载工程包,并解压。https://github.com/hustvl/YOLOP
首先创建一个conda环境,命名为YOLOP
conda create -n YOLOP python=3.7
创建好后进入环境
conda activate YOLOP
安装PyTorch 1.7+版本和 torchvision 0.8+版本
conda install pytorch==1.7.0 torchvision==0.8.0 cudatoolkit=10.2 -c pytorch
安装其他依赖库
pip install -r requirements.txt
如果安装过程没错误,这样YOLOP的开发环境就搭建好了。
五、模型推理测试
注意:官方代码默认是“注释掉标签信息的”,如果想每个框框中显示类别和置信度,需要解注释。
lib/utils/plot.py,在plot.py文件中的81到87行代码,进行解注释
输入的结果中,每个框有标签信息
5.1 推理图片
测试某一张图片
python tools/demo.py --source inference/images/name.png
测试整个目录下的所有图片
python tools/demo.py --source inference/images
结果不会直接显示的,而是放在 inference/output 目录下。
5.2 使用GPU推理
代码默认是CPU进行推理的,如果使用GPU需要添加参数 --device
python tools/demo.py --source inference/images/name.png --device 0
这里的0 是指系统为GPU分配的cuda device号,如果只有一个显卡,默认是0了。
指定CPU进行推理
python tools/demo.py --source inference/images/name.png --device cpu
5.3 推理视频
使用GPU推理视频
python tools/demo.py --source inference/videos/1.mp4 --device 0
5.4 使用相机进行推理
使用相机进行GPU推理
python tools/demo.py --source 0 --device 0
这里的--source 0,是指系统为相机分配的设备号,如果只有一个,默认是0了。
六、训练模型
首先下载数据集和标签:
-
从 images下载图片数据集
-
从 det_annotations下载检测任务的标签
-
从 da_seg_annotations下载可行驶区域分割任务的标签
-
从 ll_seg_annotations下载车道线分割任务的标签
按照如下图片数据集文件结构:
├─dataset root
│ ├─images
│ │ ├─train
│ │ ├─val
│ ├─det_annotations
│ │ ├─train
│ │ ├─val
│ ├─da_seg_annotations
│ │ ├─train
│ │ ├─val
│ ├─ll_seg_annotations
│ │ ├─train
│ │ ├─val
在 ./lib/config/default.py
下更新数据集的路径配置。
我们可以在 ./lib/config/default.py
设定训练配置. (包括: 预训练模型的读取,损失函数, 数据增强,optimizer,训练预热和余弦退火,自动anchor,训练轮次epoch, batch_size)
如果你想尝试交替优化或者单一任务学习,可以在./lib/config/default.py
中将对应的配置选项修改为 True
。(如下,所有的配置都是 False
, which means training multiple tasks end to end)。
# Alternating optimization
_C.TRAIN.SEG_ONLY = False # Only train two segmentation branchs
_C.TRAIN.DET_ONLY = False # Only train detection branch
_C.TRAIN.ENC_SEG_ONLY = False # Only train encoder and two segmentation branchs
_C.TRAIN.ENC_DET_ONLY = False # Only train encoder and detection branch
# Single task
_C.TRAIN.DRIVABLE_ONLY = False # Only train da_segmentation task
_C.TRAIN.LANE_ONLY = False # Only train ll_segmentation task
_C.TRAIN.DET_ONLY = False # Only train detection task
开始训练:
python tools/train.py
参考文献
[1] 人类高质量视觉模型YOLOP开源:同时处理三大视觉任务,还能各种超越SOTA…-技术圈
[2] 人类高质量视觉模型YOLOP开源:同时处理三大视觉任务,还能各种超越SOTA…-技术圈
[3] 论文地址:https://arxiv.org/abs/2108.11250
[4] 开源代码:https://github.com/hustvl/YOLOP
[5] YOLOP/README _CH.md at main · hustvl/YOLOP · GitHub
本文只供大家参考和学习。
以上是关于论文解读+实践YOLOP 全景驾驶感知 同时处理三大视觉任务的主要内容,如果未能解决你的问题,请参考以下文章
YOLOP 解读You Only Look Once for Panoptic Driving Perception
YOLOP 解读You Only Look Once for Panoptic Driving Perception