最新的 YOLOP 网络模型出来了,同时支持目标检测,可行驶区域分割和车道线分割三大任务,cver们赶紧卷起来,而且还是个real time + sort 的模型。
1、网络结构
如下图:
由一个encoder和三个特定任务的decoder组成
encoder包含: 主干网络( CSPDarknet ),和neck结构(SPP+FPN)
decoders分为:一个检测头和两个分割头,
检测头和yolov4的检测头一样,不做多说。
两个分割头都是使用FPN的最底层特征图(W/8,H/8,256)作为输入,进行三次最近邻上采样,最终输出(W,H,2)的特征图。在可行驶区域分割头中,行驶区域为前景,其他为背景;在车道线分割头,车道线为前景,其他为背景。
2、损失函数
损失函数分为Ldet,Lda−seg和 Lll−seg 三部分
其中Ldet为检测任务的loss,公式如下:
Ldet = α1 * Lclass + α2 * Lobj + α3 * Lbox
Lclass和Lobj都是focal loss,分别用于分类和置信度计算;Lbox为LCIoU损失函数
Lda−seg为可行驶区域分割任务的loss,公式如下
Lda−seg = Lce
就是正常的交叉熵损失函数
Lll−seg为车道线分割任务的loss,公式如下:
Lll−seg = Lce + LIoU
由交叉熵损失函数和iou损失函数组成,其中
LIoU = TN /(TN + FP + FN),为什么损失函数是这样的,希望有懂的大佬可以解答下,分割任务接触的少,不要笑我。
因为车道线的像素比较稀疏,所以需要额外添加一个LIoU 损失
整体损失函数如下:
Lall = γ1 * Ldet + γ2 * Lda−seg + γ3 * Lll−seg,其中
包含6个超参数,α1,α2,α3,γ1,γ2,γ3;该怎么设置呢,终于到了调参侠的用武之地了。
3、实验部分
3.1 训练参数设置
- 使用 kmeans 聚类获取锚点框
- 使用 Adam 优化器, 初始化 learning rate, β1、β2 分别设置为 0.001, 0.937, 0.999。使用 Warm-up 和 cosine 衰减策略调整 learning rate
3.2 数据增强策略
- Photometric distortions:adjust the hue, saturation and value of images
- geometric distortions:random rotating, scaling, translating, shearing,and left-right flipping
3.3 消融实验
- 数据集: BDD100K,总共100k张图片,其中训练集70K,验证集10K,测试集20K,测试集没有标签,所以实验结果为验证集上的推理结果
- 模型输入大小:640×384×3
检测任务结果
可行驶区域分割任务结果
车道线分割任务结果
端到端训练策略和分阶段训练策略结果对比
E, D, S and W refer to Encoder, Detect head, two Segment heads and whole network
例如 ED-S-W 表示先固定S,训练ED;然后固定ED,训练S;最后整个网络一起训练
多任务训练和单任务训练结果对比
实验硬件环境
- 训练环境:NVIDIA GTX TITAN XP
- 嵌入式环境:Jetson TX2(23 FPS),使用了 TensorRT 加速部署
4、总结
新的东西不多,但效果很好,估计大道至简吧。