YOLOP 多工演算法詳解

地平线智能驾驶开发者發表於2024-11-22

YOLOP 是華中科技大學研究團隊在 2021 年開源的研究成果,其將目標檢測/可行駛區域分割和車道線檢測三大視覺任務同時放在一起處理,並且在 Jetson TX2 開發板子上能夠達到 23FPS。

論文標題:YOLOP You Only Look Once for Panoptic Driving Perception

論文地址:https://arxiv.org/abs/2108.11250

官方程式碼:https://github.com/hustvl/YOLOP

01 網路結構

YOLOP 的核心亮點就是多工學習,而各部分都是拿其它領域的成果進行縫合,其網路結構如下圖所示:

三個子任務共用一個Backbone和Neck,然後分出來三個頭來執行不同的任務。

1.1 Encoder

根據論文所述,整個網路可以分成一個 Encoder 和 3 個 Decoder。

Encoder 包含 Backbone 和 Neck,Backbone 照搬了 YOLOv4 所採用的 CSPDarknet,Neck 也和 YOLOv4 類似,使用了空間金字塔(SPP)模組和特徵金字塔網路(FPN)模組。

1.2 Decoders

Decoders 即三個任務頭:

  1. Detect Head

    目標檢測頭使用了 Path Aggregation Network (PAN)結構,這個結構可以將多個尺度特徵圖的特徵圖進行融合,其實還是 YOLOv4 那一套。

  2. Drivable Area Segment Head & Lane Line Segment Head

    可行駛區域分割頭和車道線檢測頭都屬於語義分割任務,因此 YOLOP 使用了相同的網路結構,經過三次上取樣,將輸出特徵圖恢復為(W, H, 2)的大小,再進行具體任務的處理。

1.3 Loss Function

損失函式包括三部分,即三個任務的損失。

  1. 目標檢測損失

    目標檢測是直接照搬 YOLOv4 的,因此和 YOLOv4 採用的損失一樣,經典的邊界框損失、目標損失和類別損失,各自加了個權重。

  2. 語義分割損失

  1. 總體損失,總體損失為三部分損失之和:

02 程式碼結構

03 訓練--tools/train.py

3.1 設定 DDP 引數

pytorch 中 DDP 使用:

(1)引數載入;

(2)模型轉換成 DDP 模型;

(3)訓練資料 sampler,來使得各個程序上的資料各不相同;

(4)分散式模型的儲存。

3.2 讀取網路結構

models/YOLOP.py

3.3 定義損失函式及最佳化器

core/loss.py    utils/utils.py

3.4 網路結構劃分

用於單任務訓練固定其他網路部分層。

3.5 初始化學習率

後續在 train()中 warmup 會調整學習率。

首先定義一個最佳化器,定義好最佳化器以後,就可以給這個最佳化器繫結一個指數衰減學習率控制器。

(1) torch.optim.lr_scheduler.LambdaLR  
語法:class torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)

引數:

      optimizer (Optimizer):要更改學習率的最佳化器,sgd或adam;
      lr_lambda(function or list):根據epoch計算λ \lambdaλ的函式;或者是一個list的這樣的   function,分別計算各個parameter groups的學習率更新用到的λ \lambdaλ;
      last_epoch (int):最後一個epoch的index,如果是訓練了很多個epoch後中斷了,繼續訓練,這個值就等於載入的模型的epoch。預設為-1表示從頭開始訓練,即從epoch=1開始。

04 dataset/bdd.py 檔案

4.1 資料讀取

1.該檔案繼承 AutoDriveDataset.py。

2、按比例縮放操作:letterbox()影像增加灰邊

3、資料增強操作

4.2 資料增強

utils/utils.py 檔案:

  • random_perspective()放射變換增強
  • augment_hsv()顏色 HSV 通道增強
  • cutout()

05 models/YOLOP.py 檔案

YOLOP 包括三個檢測任務,目標檢測+可行駛區域檢測+車道線檢測。

06 損失函式

loss.py postprocess.py

build_targets 思想:

build_targets 主要為了拿到所有 targets(擴充了周圍 grids)對應的類別,框,batch 中圖片數索引和 anchor 索引,以及具體的 anchors。

每個 gt 按照正樣本選取策略,生成相應的 5 個框,再根據與預設 anchor 匹配,計算寬高的比例值,根據閾值過濾不相符的框,得到最終正樣本。

#[b, a, gj, gi]為shape=54的向量,pi為[4,3,48,80,6]維矩陣,從pi中按照b, a, gj, gi的索引挑出想要的目標,最終為[54,6]維ps = pi[b, a, gj, gi]  # prediction subset corresponding to targets 。b, a, gj, gi為索引值,在pi中挑

6.1 目標檢測損失

predictions[0] 目標檢測分支[[4,3,48,80,6],[4,3,24,40,6],[4,3,12,20,6]]。

targets[0] 目標檢測標籤 [32,6],格式為[batch_num,class,x1,y1,x2,y2]。根據 build_targets 在每個檢測層生成 相 應的正樣本 tbox[]。

將每層的預測結果 tensor pi 根據正樣本格式得到 ps = pi[b, a, gj, gi]。

計算每個檢測層預測與正樣本之間的 ciou 座標損失。

iou = bbox_iou(pbox.T, tbox[i], x1y1x2y2=False, CIoU=True)  # iou(prediction, target)
 lbox += (1.0 - iou).mean()  # iou loss 座標損失

obj 損失:

cls 類別損失:

6.2 可行駛區域損失

6.3 車道線損失

07 網路模型輸出格式形式

7.1 網路模型檢測輸出格式

det_out:障礙物檢測輸出格式:[25200,6] 其中 6 表示[x1,y1,x2,y2,conf,cls],25200 :(80x80+40x40+20x20)x3。

7.2 網路模型車道線輸出格式

lane_line_seg : 車道線分割輸出格式:1,2,640,640。

7.3 網路模型可行駛區域輸出格式

drive_area_seg : 可行駛區域分割輸出格式:1,2,640,640。

08 前視停車場資料集檢測效果圖

相關文章