日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

MMDetection3d对KITT数据集的训练与评估介绍

發布時間:2024/3/12 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MMDetection3d对KITT数据集的训练与评估介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如有錯誤,懇請指出。


在之后的時間內,可能會學習與點云相關的知識,進一步學習基于點云的3D目標檢測。然后,為了快速入門這個領域,想使用mmdetection3d開源算法庫來嘗試訓練一些經典的3d目標檢測模型,比如:SECOND,PointPillars,3D-SSD等等。之后重點是詳細介紹KITTI數據集的一系列評估標準。

文章目錄

  • 1. mmdet3d安裝過程
  • 2. KITTI數據集準備
    • 2.1 了解 .coco.json 文件
    • 2.2 了解 .pkl 文件
    • 2.3 .bin文件、.pkl文件、.coco.json文件的查看代碼
  • 3. KITTI數據集訓練
  • 4. KITTI數據集評估標準
    • 4.1 bbox、bev、3d、aos
    • 4.2 AP11與AP40
    • 4.3 Car AP11@0.70, 0.70, 0.70與Car AP11@0.70, 0.50, 0.50
    • 4.4 bbox AP11:90.5385, 89.3699, 86.2703
    • 4.5 mAP
    • 4.6 aos(Average Orientation Similarity)
    • 4.7 easy、moderate、hard的定義

1. mmdet3d安裝過程

其中,推薦安裝python=3.7的虛擬環境,因為在kitti數據集可視化過程中需要使用到mayavi包,而這個包的vtk依賴不支持python 3.8版本。

# 創建虛擬環境 conda create --name openmmlab python=3.7 -y conda activate openmmlab# 安裝深度學習框架 # Linux conda install pytorch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 cudatoolkit=11.3 # Windows pip install torch==1.11.0+cu102 torchvision==0.12.0+cu102 torchaudio==0.11.0 --extra-index-url https://download.pytorch.org/whl/cu102# 安裝mmdet3d開源算法庫 pip install openmim mim install mmcv-full mim install mmdet mim install mmsegmentation git clone https://github.com/open-mmlab/mmdetection3d.git cd mmdetection3d pip install -e .

ps:在linux可能出現的問題不會有太多,但是如果是window中安裝,出現pycocotools無法正常安裝的問題,原因是沒有vc++的編譯器,安裝一個visual studio 2019的專業版就可以正常安裝了mmdet了,而mmdet的依賴就是pycocotools。

這個問題的詳細解決方法見:error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools“


2. KITTI數據集準備

在官網下載對應的數據:http://www.cvlibs.net/datasets/kitti/eval_object.php?obj_benchmark=3d
安裝官方文檔對數據進行組織:https://mmdetection3d.readthedocs.io/zh_CN/latest/datasets/kitti_det.html

ps:官方提供的數據切分指令如果wget無法正常下載訪問,可以在/etc/hosts中自行添加網頁的IP地址(IP地址的查詢服務鏈接:https://www.ip138.com/),例如:

wget -c https://raw.githubusercontent.com/traveller59/second.pytorch/master/second/data/ImageSets/test.txt --no-check-certificate --content-disposition -O ./data/kitti/ImageSets/test.txt

這個問題的詳細解決方法,我也用博客貼出:Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|0.0.0.0|:443… failed

處理后的文件夾結構應該如下:

kitti ├── ImageSets │ ├── test.txt │ ├── train.txt │ ├── trainval.txt │ ├── val.txt ├── testing │ ├── calib │ ├── image_2 │ ├── velodyne │ ├── velodyne_reduced ├── training │ ├── calib │ ├── image_2 │ ├── label_2 │ ├── velodyne │ ├── velodyne_reduced │ ├── planes (optional) ├── kitti_gt_database │ ├── xxxxx.bin ├── kitti_infos_train.pkl ├── kitti_infos_val.pkl ├── kitti_dbinfos_train.pkl ├── kitti_infos_test.pkl ├── kitti_infos_trainval.pkl ├── kitti_infos_train_mono3d.coco.json ├── kitti_infos_trainval_mono3d.coco.json ├── kitti_infos_test_mono3d.coco.json ├── kitti_infos_val_mono3d.coco.json

這里我不太理解mmdet3d轉換出來的這些.pkl與.coco.json文件,所以下面寫了個測試代碼來對其進行詳細了解。

2.1 了解 .coco.json 文件

對于 .coco.json 后綴的文件,可以通過兩種方式對其進行讀取,如下所示:

# 方法1: json_path = r'../data/kitti/kitti_infos_train_mono3d.coco.json' with open(json_path, 'r') as fr:json_file = json.load(fr)# 方法2: cocojson_path = '../data/kitti/kitti_infos_train_mono3d.coco.json' cocojson_file = mmcv.load(cocojson_path)

ps:如果由于某些原因導致json文件的內容被情況,也就是變成了一個空的.coco.json文件,這時候使用以上的兩種方法讀取數據是會報錯的,這一點需要尤其注意。(在測試過程中我就是出現了這個題,還排查了許久的原因)

其中,查看kitti_infos_train_mono3d.coco.json 和 kitti_infos_test_mono3d.coco.json內容如下所示,有固定字段組成的字典形式,由annotation、images、categories組成,其中訓練集有標注信息,而驗證集沒有標注信息,其字段信息如下所示:

其中的images又是由多個字典組成,如下所示:

不過在訓練的時候,我看見配置文件中其實使用的pkl文件,所以這里生成的.coco.json文件更多的可能是使用一些2D的經典目標檢測算法來訓練kitti數據集的。也就是說,生成的.coco.json文件,使得我們可以使用mmdetection的開源算法庫(檢測2d的算法)來訓練kitti數據集。

2.2 了解 .pkl 文件

使用一般的手段是不能正常讀取.pkl文件的,np.fromfile 與 json.load 都不能正常讀取,因為這是mmdet中獨特的數據存儲格式。對于網上沒有這種文件的詳細介紹,此時就可以轉換思路通過如何生成 .pkl 文件入手,知道了其如何生成就應該知道其存儲的內容是什么。

在代碼層面,首先在 tools/create_data.py 中的 kitti_data_pre 函數中,作為數據處理的入口。之后可以發現,代碼中是通過 mmcv.dump 與 mmcv.load 來進行pkl格式數據與.coco.json格式數據的寫入與導出,但是數據本身就是一個字典形式。具體的構造在 get_kitti_image_info 函數中,函數的相關注釋如下:

KITTI annotation format version 2: {[optional]points: [N, 3+] point cloud[optional, for kitti]image: {image_idx: ...image_path: ...image_shape: ...}point_cloud: {num_features: 4velodyne_path: ...}[optional, for kitti]calib: {R0_rect: ...Tr_velo_to_cam: ...P2: ...}annos: {location: [num_gt, 3] arraydimensions: [num_gt, 3] arrayrotation_y: [num_gt] angle arrayname: [num_gt] ground truth name array[optional]difficulty: kitti difficulty[optional]group_ids: used for multi-part object} }

這里,直接利用 mmcv.load 來讀取 kitti_test.pkl 數據,pkl_file = mmcv.load(file=pkl_path) ,其內容如下所示:

可以發現,其作為一個列表元素,每個訓練數據都被構建成了一個字典。每個字典由4大部分組成:inage、point_cloud、calib、annos。其與注釋內容是相符合的,其中可以使用 mmcv.track_iter_progress 可以按順序對字典進行提取:for info in mmcv.track_iter_progress(kitti_infos)

其中,對于這4個部分,官方資料中有解釋到:https://mmdetection3d.readthedocs.io/zh_CN/latest/datasets/kitti_det.html

可以發現,其實這里的annos就是kitti中的label文件的數據。而對于label_2的介紹,可以參考https://blog.csdn.net/qq_37534947/article/details/106628308,label文件是kitti中object的標簽和評估數據,以“000001.txt”文件為例,包含樣式如下:

每一行代表一個object,每一行都有16列分別表示不同的含義,具體如下:

  • 第1列(字符串):代表物體類別(type)
    總共有9類,分別是:Car、Van、Truck、Pedestrian、Person_sitting、Cyclist、Tram、Misc、DontCare。其中DontCare標簽表示該區域沒有被標注,比如由于目標物體距離激光雷達太遠。為了防止在評估過程中(主要是計算precision),將本來是目標物體但是因為某些原因而沒有標注的區域統計為假陽性(false positives),評估腳本會自動忽略DontCare區域的預測結果。
  • 第2列(浮點數):代表物體是否被截斷(truncated)
    數值在0(非截斷)到1(截斷)之間浮動,數字表示指離開圖像邊界對象的程度。
  • 第3列(整數):代表物體是否被遮擋(occluded)
    整數0、1、2、3分別表示被遮擋的程度。
  • 第4列(弧度數):物體的觀察角度(alpha)
    取值范圍為:-pi ~ pi(單位:rad),它表示在相機坐標系下,以相機原點為中心,相機原點到物體中心的連線為半徑,將物體繞相機y軸旋轉至相機z軸,此時物體方向與相機x軸的夾角,如圖1所示。
  • 第5~8列(浮點數):物體的2D邊界框大小(bbox)
    四個數分別是xmin、ymin、xmax、ymax(單位:pixel),表示2維邊界框的左上角和右下角的坐標。
  • 第9~11列(浮點數):3D物體的尺寸(dimensions)分別是高、寬、長(單位:米)
  • 第12-14列(整數):3D物體的位置(location)分別是x、y、z(單位:米),特別注意的是,這里的xyz是在相機坐標系下3D物體的中心點位置。
  • 第15列(弧度數):3D物體的空間方向(rotation_y)取值范圍為:-pi ~ pi(單位:rad),它表示,在照相機坐標系下,物體的全局方向角(物體前進方向與相機坐標系x軸的夾角)
  • 第16列(整數):檢測的置信度(score)要特別注意的是,這個數據只在測試集的數據中有。

2.3 .bin文件、.pkl文件、.coco.json文件的查看代碼

如何查看KITTI數據集涉及的這些.bin文件,以及mmdetection3d統一的.pkl與.coco.json格式,以下我寫了個代碼已實現對這些文件的查看。

參考代碼:

import numpy as np import os import jsonimport mmcv# os.chdir(path='')root = os.getcwd() print(root)bin_path = '../data/kitti/kitti_gt_database/1000_Car_0.bin' pkl_path = '../data/kitti/kitti_infos_train.pkl' # 原來是 test_mono3d.coco.json由于名稱的問題,讀取不了數據 json_path = r'../data/kitti/test.json' os.path.exists(bin_path), "{} is not exists".format(bin_path) os.path.exists(json_path), "{} is not exists".format(json_path)bin_file = np.fromfile(file=bin_path, dtype=np.float32, count=-1) pkl_file = np.fromfile(file=pkl_path, dtype=np.float32, count=-1) print(bin_file.shape) print(pkl_file.shape)# with open(json_path, 'r') as fr: # json_file = json.load(fr) # print(json_file)pkl_path = '../data/kitti/kitti_infos_train.pkl' kitti_infos = mmcv.load(file=pkl_path) # print(pkl_file)json_path = r'../data/kitti/kitti_infos_train_mono3d.coco.json' with open(json_path, 'r') as fr:json_train_file = json.load(fr) # print(json_file)cocojson_path = '../data/kitti/kitti_infos_test_mono3d.coco.json' json_test_file = mmcv.load(cocojson_path)

補充:使用 mmcv.load 不僅僅可以讀取,coco.json和.pkl文件,其一共支持5種格式的數據格式。如下所示:

file_handlers = {'json': JsonHandler(),'yaml': YamlHandler(),'yml': YamlHandler(),'pickle': PickleHandler(),'pkl': PickleHandler() }

3. KITTI數據集訓練

如果你在單個機器上啟動多個任務,比如,在具有8塊顯卡的機器上進行2個4塊顯卡訓練的任務,你需要為每個任務指定不同的端口(默認為29500)以避免通信沖突。

如果你使用 dist_train.sh 啟動訓練任務,可以在命令中設置端口:

CUDA_VISIBLE_DEVICES=0,1,2,3 PORT=29500 ./tools/dist_train.sh ${CONFIG_FILE} 4 CUDA_VISIBLE_DEVICES=4,5,6,7 PORT=29501 ./tools/dist_train.sh ${CONFIG_FILE} 4

端口的設置還有另外的兩種方法:

# 方法1:通過 --options 設置端口 CUDA_VISIBLE_DEVICES=0,1,2,3 GPUS=4 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config1.py ${WORK_DIR} --options 'dist_params.port=29500' CUDA_VISIBLE_DEVICES=4,5,6,7 GPUS=4 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config2.py ${WORK_DIR} --options 'dist_params.port=29501'# 方法2:通過修改配置文件(來設置不同的通信端口 dist_params = dict(backend='nccl', port=29500) dist_params = dict(backend='nccl', port=29501)

詳細的訓練過程這里就不貼出來的,和mmdetection、mmfewshot等的訓練過程是一樣的。詳細可以參考:MMOpenLab使用專欄

經過測試,出現的使用問題:

1)訓練MVXNET:彈出非法訪問的問題(解決方法是降低學習率,以實現單卡運行的學習率配置)
2)訓練Point RCNN:占用顯存不斷增加,最終溢出(官方還沒有修復這個問題)

成功測試的算法:SECOND、3D-SSD、PointPillars、Part-A2、SASSD


4. KITTI數據集評估標準

以PointPillars為例,訓練完之后會有一個評估結果(以下結果是截取了Car這個類的結果,還有另外兩個類的結果沒有放上來)

----------- AP11 Results ------------ Car AP11@0.70, 0.70, 0.70: bbox AP11:90.5385, 89.3699, 86.2703 bev AP11:89.6290, 86.8373, 79.6047 3d AP11:85.9857, 76.4022, 73.5934 aos AP11:90.38, 88.89, 85.46 Car AP11@0.70, 0.50, 0.50: bbox AP11:90.5385, 89.3699, 86.2703 bev AP11:90.6688, 89.9088, 89.0676 3d AP11:90.6654, 89.8380, 88.8712 aos AP11:90.38, 88.89, 85.46Overall AP11@easy, moderate, hard: bbox AP11:79.9252, 74.4630, 71.3123 bev AP11:77.1720, 68.2989, 63.5469 3d AP11:73.1700, 62.1137, 58.4967 aos AP11:74.50, 68.65, 65.49----------- AP40 Results ------------ Car AP40@0.70, 0.70, 0.70: bbox AP40:95.6966, 92.1547, 87.4279 bev AP40:92.4469, 88.1739, 83.6487 3d AP40:87.8139, 76.5133, 73.3604 aos AP40:95.51, 91.61, 86.58 Car AP40@0.70, 0.50, 0.50: bbox AP40:95.6966, 92.1547, 87.4279 bev AP40:95.9824, 94.8116, 91.7013 3d AP40:95.9314, 94.6114, 90.0106 aos AP40:95.51, 91.61, 86.58Overall AP40@easy, moderate, hard: bbox AP40:82.7911, 75.4843, 71.5740 bev AP40:78.7391, 68.7362, 64.2875 3d AP40:74.1775, 61.6529, 57.5156 aos AP40:76.47, 68.73, 64.88

對于上述的結果,下面分別對特定的名詞進行解釋說明:

4.1 bbox、bev、3d、aos

深度學習算法的檢測指標通常由bbox、bev、3d、aos四個檢測指標,其含義分別如下所示:

  • bbox:2D檢測框的準確率
  • bev:BEV視圖下檢測框的準確率
  • 3d:3D檢測框的準確率
  • aos:檢測目標旋轉角度的準確率

4.2 AP11與AP40

  • AP11:表示11點插值平均精度,在kitti 3D中R11={0,0.1,0.2,……,1},是等間距的recall level
  • AP40:表示40點插值平均精度,將R11修改為R40={1/40,2/40,3/40,……,1},同樣是等間距的recall level

ps:論文《Disentangling Monocular 3D Object Detection》證明AP11是不準確的,因為當模型可以提供一個精度極小,僅僅是>0的一個單一目標,此時R=0時的精度即為1,那么AP11的平均精度即為1/11,這個精度已經超過了很多的方法,所以是不合理的。所以后續修改為AP40。

4.3 Car AP11@0.70, 0.70, 0.70與Car AP11@0.70, 0.50, 0.50

  • AP11@0.70, 0.70, 0.70分別代表bbox,bev,3d在0.70閾值下的平均精度
  • AP11@0.70, 0.50, 0.50分別代表bbox,bev,3d在0.70,0.50,0.50不同閾值下的平均精度

這里可以發現,評估bbox只有0.70這個閾值,所以可以發現bbox的兩行數據都是一樣的,而對于bev與3d來說,0.50的閾值比0.70的閾值要寬松,所以第二組的結果(閾值0.50)一般要比第一組的結果(閾值0.70)要高。

4.4 bbox AP11:90.5385, 89.3699, 86.2703

無論是bbox,還是bev、3d、aos,每個評價指標在某一個閾值下都會有3組結果,這三組結果分別對應的是easy、moderate和hard下的評估結果。難度越來越大,所以數值也越來越小,所以這三組數值一般是呈遞減狀態。

4.5 mAP

一般論文中的實驗結果都會貼上一個mAP的最終結果,這個結果就是moderate mAP的結果。比如,在剛剛的PointPillars實驗結果中,對于car類別的AP11結果如下所示,其中76.4022就是作為car這個類基準排名的主要指標。

Car AP11@0.70, 0.70, 0.70: 3d AP11:85.9857, 76.4022, 73.5934

而對于全部3個類別的AP11結果如下所示,那么62.1137就是作為3類(3 Class)基準排名的主要指標。

Overall AP11@easy, moderate, hard: 3d AP11:73.1700, 62.1137, 58.4967

現在,來查看mmdetection3d中PointPillars的結果:

可以發現,其實剛剛我跑出來的結果Class的AP是76.4022,而3 Class的AP是62.137。這個結果和官方跑出來的77.6和64.07差不多。使用以下指令,來測試剛剛訓練好的PointPillars的最新模型:

python tools/test.py configs/pointpillars/hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class.py \work_dirs/hv_pointpillars_secfpn_6x8_160e_kitti-3d-3class/latest.pth \--eval mAP

輸出結果:

可以看見,無論是Car=76.4022還是3 Class=62.1137,都與訓練時期的驗證結果差不多,所以訓練期間的驗證結果還是可信的。

4.6 aos(Average Orientation Similarity)

aos的名稱為平均方向相似性(這里是利用了AP11來進行計算),計算公式如下:

其中,r代表物體檢測的召回率。在因變量r下,方向相似性s∈[0,1]被定義為所有預測樣本與ground truth余弦距離的歸一化

其中D?表示在召回率r下所有預測為正樣本的集合,?θ(i) 表示檢出物體i的預測角度與ground truth的差。為了懲罰多個檢出匹配到同一個ground truth,如果檢出i已經匹配到ground truth設置δi = 1,否則δi = 0。

簡要分析:我們希望aos的值越大越好,越大也就說明預測角度與ground truth的值越相似,那么這個是如何實現的呢。在余弦函數中,如果預測角度與ground turth的值越接近,那么它們差值就越接近0,余弦值是越靠近1,也就是余弦越大,那么整個公式的求和平均也是越大的。而如果預測值與ground truth不像,嚴重預測錯誤,那么其差值就會變大,一個比較大的差值在余弦公式中是比較小的,甚至可能是負數,導致1+cos的結果很小,從而使得整體的結果偏小。所以aos公式可以一定程度的判斷方向的預測正確性。

4.7 easy、moderate、hard的定義

KITTI數據集中easy、moderate、hard根據標注框是否被遮擋、遮擋程度和框的高度進行定義的,具體數據如下:

  • 簡單:最小邊界框高度:40像素,最大遮擋級別:完全可見,最大截斷:15%
  • 中等:最小邊界框高度:25像素,最大遮擋水平:部分遮擋,最大截斷:30%
  • 困難:最小邊界框高度:25像素,最大遮擋級別:難以看到,最大截斷:50%

參考資料:

1. MMDet3d官方文檔

2. What is the resuls meaning? #185

3. KITTI數據集3d目標檢測的評價的含義

4. 機器學習算法評估指標——3D目標檢測

5. 點云感知算法面試知識點(一)

總結

以上是生活随笔為你收集整理的MMDetection3d对KITT数据集的训练与评估介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。