該程式碼基於現有的 Image to BEV 深度學習模型而構建,該模型基於論文《將圖像翻譯成地圖》。該程式碼是使用 python 3.7 編寫的。並接受了 nuScenes 資料集的訓練。請參閱儲存庫的自述文件以取得要安裝的依賴項和資料集。
第一步是建立一個名為「translation-images-into-maps-main」的資料夾並將所有檔案下載到其中。然後,由於文件較大,我們訓練的最新檢查點和用於驗證的迷你 nuScenes 資料集可以從此 Google Drive 下載。這些資料夾應直接加入到「translated-images-into-maps-main」目錄中。
以下是此儲存庫所需的庫的清單:
opencv
numpy
pyquaternion
shapely
lmdb
nuscenes-devkit
pillow
matplotlib
torchvision
descartes
scipy
tensorboard
scikit-image
cv2
若要使用此儲存庫的功能,可能需要變更以下命令列參數:
--name: name of the experiment
--video-name: name of the video file within the video root and without extension
--savedir: directory to save experiments to
--val-interval: number of epochs between validation runs
--root: directory of the repository
--video-root: absolute directory to the video input
--nusc-version: nuscenes version (either “v1.0-mini” or “v1.0-trainval” for the full US dataset)
--train-split: training split (either “train_mini" or “train_roddick” for the full US dataset)
--val-split: validation split (either “val_mini" or “val_roddick” for the full US dataset)
--data-size: percentage of dataset to train on
--epochs: number of epochs to train for
--batch-size: batch size
--cuda-available: environment used (0 for cpu, 1 for cuda)
--iou: iou metric used (0 for iou, 1 for diou)
至於訓練模型,可以修改這些命令列參數:
--optimizer: optimizer for gradient descent to run during training. Default: adam
--lr: learning rate. Default: 5e-5
--momentum: momentum for Stochastic gradient descent. Default: 0.9
--weight-decay: weight decay. Default: 1e-4
--lr-decay: learning rate decay. Default: 0.99
NuScenes Mini 和 Full 資料集可以在以下位置找到:
NuScene 迷你:
NuScenes 完整美國版:
由於 NuScene 迷你資料集和完整資料集不具有相同的影像輸入格式(lmdb 或 png),因此需要對程式碼進行一些修改才能使用其中一種:
mini
參數變更為 false 以使用迷你資料集以及train.py
、 validation.py
和inference.py
檔案中的 args 路徑和分割。 data = nuScenesMaps (
root = args . root ,
split = args . val_split ,
grid_size = args . grid_size ,
grid_res = args . grid_res ,
classes = args . load_classes_nusc ,
dataset_size = args . data_size ,
desired_image_size = args . desired_image_size ,
mini = True ,
gt_out_size = ( 200 , 200 ),
)
loader = DataLoader (
data ,
batch_size = args . batch_size ,
shuffle = False ,
num_workers = 0 ,
collate_fn = src . data . collate_funcs . collate_nusc_s ,
drop_last = True ,
pin_memory = True
)
data_loader.py
函數的第 151-153 或 146-149 行: # if mini:
image_input_key = pickle . dumps ( id , protocol = 3 )
with self . images_db . begin () as txn :
value = txn . get ( key = image_input_key )
image = Image . open ( io . BytesIO ( value )). convert ( mode = 'RGB' )
# else:
# original_nusenes_dir = "/work/scitas-share/datasets/Vita/civil-459/NuScenes_full/US/samples/CAM_FRONT"
# new_cam_path = os.path.join(original_nusenes_dir, Path(cam_path).name)
# image = Image.open(new_cam_path).convert(mode='RGB')
預訓練的檢查點可以在這裡找到:
檢查點需要保存在該儲存庫根目錄的/pretrained_models/27_04_23_11_08
中。如果您想從另一個目錄載入它們,請變更以下參數:
- - savedir = "pretrained_models" # Careful, this path is relative in validation.py but global in train.py
- - name = "27_04_23_11_08"
要訓練 scitas,您需要從根目錄啟動以下腳本:
sbatch job.script.sh
在 cpu 上進行本地訓練:
python3 train.py
確保使用命令列參數調整腳本。
要驗證 scitas 上的模型性能:
sbatch job.validate.sh
在 cpu 上進行本地訓練:
python3 validate.py
確保使用命令列參數調整腳本。
要推斷有關 scitas 的影片:
sbatch job.evaluate.sh
在 cpu 上進行本地訓練:
python3 inference.py
確保使用命令列參數調整腳本,尤其是:
--batch-size // 1 for the test videos
--video-name
--video-root
該計畫是在自動駕駛汽車深度學習課程 CIVIL-459 的背景下完成的,該課程由 EPFL 的 Alexandre Alahi 教授教授。指導老師是博士生劉躍江。該課程項目的主要目標是開發可在特斯拉自動駕駛系統上使用的深度學習模型。對於我們這組來說,我們一直在研究從單眼相機影像到鳥瞰圖的轉變。這可以透過使用語義分割對汽車、人行道、行人和地平線等元素進行分類來完成。
在我們對單眼影像到 BEV 深度學習模型的研究過程中,我們注意到在分割過程中行人的資訊遺失,導致分類效果不佳。如下圖所示,在評估時,我們選擇的模型在 nuScenes 資料集上的 14 類物件上達到了 25.7% IoU(並集交集)的平均值。可駕駛車輛的預測準確度良好 (74.5%),但自行車、障礙物和拖車的預測準確度相當差。然而,對行人的預測準確度(9.5%)太低了。如果有人在沒有到達十字路口的情況下過馬路,如此低的準確度可能會導致事故。
有關我們研究的更多資訊可以在 Drive 上找到。
由於對行人的檢測不佳似乎是目前訓練模型最直接的問題,因此我們的目標是透過研究更適合的損失函數並在 nuScenes 資料集上訓練新模型來提高準確性。
我們建立的模型是使用
另一個問題是
這
它使用 L2 範數來最小化預測框和目標框之間的距離,並且收斂速度比
水平伸展
垂直拉伸
此外,DIoU 損失引入了一個正則化項,可以促進平滑收斂。
如下圖所示,
研究階段結束後,我們實施了/src/utils.py
檔案中的bbox_overlaps_diou
函數中的損失,透過使用
然後使用該函數來計算多尺度compute_multiscale_iou
函數中。對於每個班級, iou
輸入參數的函數中)是根據批次大小計算的。此函數的輸出是一個字典iou_dict
其中包含多尺度
然後我們在train.py
中使用這些值,其中val-interval
epoch 運行一次的評估中使用。這些值也用在validation.py
中,用來顯示損失和
我們從提供的檢查點checkpoint-008.pth.gz
開始在 NuScenes 資料集上訓練模型,一次使用
另一個貢獻是新的視覺化格式,可以更好地區分類別與所有對應的標籤和 IoU 值。這是在visualization.py
檔案中實現的。
最後,我們致力於實現一種模式,該模式將.mp4
視訊作為輸入並將它們分解為單獨的圖像幀。然後模型將對其進行評估,我們可以在inference.py
檔案中視覺化分割結果。
為了初步了解該模型的訓練策略,我們首先決定在 NuScenes 迷你資料集上進行訓練。從checkpoint-008.pth.gz
開始,我們能夠訓練兩個使用 IoU 指標不同的模型(一個是 IoU,另一個是 DIoU)。下表列出了經過 10 個 epoch 訓練後在 NuScenes 小批量上獲得的結果。
在查看這些結果後,我們發現我們的假設所依據的行人類別根本沒有提供結論性的結果。因此,我們得出結論,迷你資料集不足以滿足我們的需求,並決定將我們的訓練轉移到 Scitas 的完整資料集。
在從checkpoint-008.pth.gz
訓練我們的新模型(使用 DIoU 或 IoU)8 個新時期後,我們觀察到了有希望的結果。為了比較這些新訓練的模型的效能,我們對迷你資料集執行了驗證步驟。下面提供了該資料集影像結果的可視化。
在這裡,
這些結果最終顯示出更好的性能
現在我們有了經過訓練的模型,我們可以用它來使用任何輸入圖像或影片來預測 BEV。雖然我們的目標是在課程的最終演示中實施我們的方法,但不幸的是,推斷的鳥瞰圖表現不夠。下圖顯示了所提供的測試影片之一的推理結果(請參閱測試影片)。
我們認為推理表現的缺乏是由於以下參數造成的:
雖然這段經文來自
一種選擇是實施
這
此外,根據本文 [2] 所做的研究,CIoU 的迴歸誤差比其他模型退化得更快,並且將收斂於
另一種選擇是在擁擠環境中豐富的資料集上進行訓練,以更好地表示行人和自行車。
最後,為了真正驗證我們的假設,可以在完整的 NuScenes 資料集上進行驗證運行,並比較兩個模型的行人 IoU。
[1]鄭朝暉,王平,劉偉,李金澤,葉榮光,任東偉(2020)。距離 IoU 損失:更快更好地學習邊界框回歸 https://arxiv.org/pdf/1911.08287.pdf
[2] 鄭朝暉,王平,任東偉,劉偉,葉榮光,胡清華,左王猛(2021)。增強物件偵測和實例分割的模型學習和推理中的幾何因素 https://arxiv.org/pdf/2005.03572.pdf