天天看點

KITTI 3D目标檢測資料集解析(完整版)1. KITTI資料集概述2. 3D目标檢測資料集概述

  1. KITTI官網
  2. Vision meets Robotics: The KITTI Dataset

1. KITTI資料集概述

1.1 傳感器配置

  由于彩色相機成像過程中的拜耳陣列(Bayer Pattern)插值處理過程,彩色圖像分辨率較低,而且對于光照敏感性不高,是以采集車配備了兩組雙目相機,一組灰階的,一組彩色的。個人猜測為了增加相機的水準視場角,每個相機鏡頭前又各安裝了一個光學鏡頭。

傳感器類型 詳細資訊
灰階相機 2台140像素的PointGray Flea2灰階相機, FL2-14S3M-C
彩色相機 2台140萬像素PointGray Flea2彩色相機, FL2-14S3C-C
光學鏡頭 4個Edmund光學鏡頭,焦距4mm,90°水準孔徑,35°垂直孔徑角
雷射雷達 1台Velodyne HDL-64E雷射,掃描頻率10Hz,64線,0.09°角度分辨率,2cm探測精度,每秒130萬點數,探測距離120m
GPS/IMU慣導系統 1個OXTS TR3003慣導,6軸,采集頻率100Hz,L1/L2信号波段,0.02m和0.1°的精度

  傳感器車身排布如下圖所示。

KITTI 3D目标檢測資料集解析(完整版)1. KITTI資料集概述2. 3D目标檢測資料集概述
KITTI 3D目标檢測資料集解析(完整版)1. KITTI資料集概述2. 3D目标檢測資料集概述

1.2 資料采集

  KITTI整個資料集是在德國卡爾斯魯厄采集的,采集時長6小時。KITTI官網放出的資料大約占采集全部的25%,去除了測試集中相關的資料片段,按場景可以分為“道路”、“城市”、“住宅區”、“校園”和“行人”5類。

  采集車形式路徑如下圖所示,用紅藍黑區分GPS信号的品質,紅色是精度最高的,有RTK矯正;藍色無矯正信号;黑色缺失GPS信号,該部分資料已從資料集中剔除。

KITTI 3D目标檢測資料集解析(完整版)1. KITTI資料集概述2. 3D目标檢測資料集概述
KITTI 3D目标檢測資料集解析(完整版)1. KITTI資料集概述2. 3D目标檢測資料集概述
  1. 圖像:采用8bit PNG格式儲存。裁剪掉了原始圖像的引擎蓋和天空部分,并且根據相機參數進行了畸變矯正,最終圖檔為50萬像素左右。
  2. 雷射:逆時針旋轉,采用浮點數二進制檔案儲存。儲存了雷射點 ( x , y , z ) (x,y,z) (x,y,z)坐标和反射率 r r r資訊,每一幀平均12萬個雷射點。
  3. 圖像和雷射同步:相機曝光時機是由雷射控制的,當雷射掃描到正前方(即相機朝向角度)時,會觸發相機快門,KITTI會記錄雷射3個時間戳,旋轉起始和結束的時刻,以及觸發相機曝光的時刻。

1.3 資料标注

  對于相機視野内的每個動态目标,KITTI都提供了基于雷射坐标系的3D标注資訊,定義了小車、面包車、 卡車、行人、坐着的人、自行車、有軌電車7種目标類型,其他比如拖車、代步車的小衆類型目标統一歸為“Misc”類别。3D标注資訊包括目标尺寸、世界坐标以及偏航角(翻滾角和俯仰角預設等于0)。

KITTI 3D目标檢測資料集解析(完整版)1. KITTI資料集概述2. 3D目标檢測資料集概述

1.4 傳感器标定

  為了盡可能降低時間來帶的系統偏差,KITTI每天采集完資料後,都會對所有傳感器重新進行一次标定。

傳感器同步

  使用雷射雷達的時間戳作為基準類同步其他傳感器。對于相機,通過雷射雷達觸發相機快門的方式來最小化動态目标帶來的偏差。GPS/IMU無法進行同步,但是由于采集頻率較高,最大的時間誤差也隻有5ms。所有傳感器的時間戳使用系統時鐘記錄。

相機标定

  4個相機光心均對齊到同一平面上。由于成像存在枕形畸變,畸變矯正圖像均從 1392 × 512 1392\times512 1392×512裁剪到 1224 × 370 1224\times370 1224×370像素大小。

雷射标定

  首先根據左側灰階相機的位置安裝雷射雷達,然後基于選擇50個手工選點的标定誤差進行最優化,并根據KITTI立體視覺榜單Top3方法的性能變化來保證标定的魯棒性。

2. 3D目标檢測資料集概述

2.1 資料下載下傳

KITTI 3D目标檢測資料集解析(完整版)1. KITTI資料集概述2. 3D目标檢測資料集概述

  3D目标檢測資料集包含7481張訓練圖檔,7518張測試圖檔,以及相應的點雲資料,共包含80256個标注目标。對應的官方下載下傳路徑如下(建議複制連結用迅雷下載下傳):

  1. Download left color images of object data set (12 GB)
  2. Download the 3 temporally preceding frames (left color) (36 GB) (非必需)
  3. Download Velodyne point clouds, if you want to use laser information (29 GB)
  4. Download camera calibration matrices of object data set (16 MB)
  5. Download training labels of object data set (5 MB)
  6. Download object development kit (1 MB) (including 3D object detection and bird’s eye view evaluation code)

圖檔、雷射點雲、标注真值、标定參數通過圖檔序号一一對應。

KITTI 3D目标檢測資料集解析(完整版)1. KITTI資料集概述2. 3D目标檢測資料集概述

2.2 資料解析

2.2.1 3D框标注

字段 字段長度 機關 含義
Type 1 - 目标類型
Truncated 1 -

目标截斷程度:0~1之間的浮點數

表示目标距離圖像邊界的程度

Occluded 1 -

目标遮擋程度:0~3之間的整數

0:完全可見 1:部分遮擋 2:大部分遮擋 3:未知

Alpha 1 弧度 目标觀測角: [ − p i , p i ] [-pi, pi] [−pi,pi]
Bbox 4 像素 目标2D檢測框位置:左上頂點和右下頂點的像素坐标
Dimensions 3 3D目标尺寸:高、寬、長
Location 3 目标3D框底面中心坐标: ( x , y , z ) (x, y,z) (x,y,z),相機坐标系,
Rotation_y 1 弧度 目标朝向角: [ − p i , p i ] [-pi, pi] [−pi,pi]

  3D框标注資訊格式如下,這裡說明一下Alpha和Rotaion_y的差別和聯系:

  • Rotation_y是目标的朝向角,即車頭方向和相機 x x x軸正方向的夾角(順時針方向為正),描述的是目标在現實世界中的朝向,不随目标位置的變化而變化,如圖 ∠ B O C \angle BOC ∠BOC所示。
  • Alpha是目标觀測角,描述的是目标相對于相機視角的朝向,随目标方位角theta變化而變化,如圖 ∠ B O D \angle BOD ∠BOD所示。
  • Rotation_y和Alpha之間可以互相轉換。因為 ∠ A O C = 90 ° − t h e t a \angle AOC=90°-theta ∠AOC=90°−theta,是以有 ∠ A O B = ∠ A O C − ∠ B O C = 90 ° − t h e t a − r o t a i o n _ y \angle AOB=\angle AOC-\angle BOC=90°-theta-rotaion\_y ∠AOB=∠AOC−∠BOC=90°−theta−rotaion_y又因為 ∠ A O B + ∠ B O D = 90 ° \angle AOB+ \angle BOD=90° ∠AOB+∠BOD=90°可得 a l p h a = ∠ B O D = 90 ° − ∠ A O B = t h e t a + r o t a t i o n _ y alpha=\angle BOD=90°-\angle AOB=theta + rotation\_y alpha=∠BOD=90°−∠AOB=theta+rotation_y考慮到rotation_y和alpha都是逆時針方向為負,是以有 − a l p h a = t h e t a − r o t a t i o n _ y -alpha=theta-rotation\_y −alpha=theta−rotation_y即 a l p h a = r o t a t i o n _ y − t h e t a alpha=rotation\_y-theta alpha=rotation_y−theta有興趣的同學也可以自己用KITTI标簽資料驗證一下,會發現總是會有零點幾度的偏差,估計是KITTI儲存有效位數造成的資料損失。
KITTI 3D目标檢測資料集解析(完整版)1. KITTI資料集概述2. 3D目标檢測資料集概述

2.2.2 雷射點雲

  雷射點雲資料采用二進制存儲,逐點儲存,每個雷射點對應4個float資料 ( x , y , z , r ) (x,y,z,r) (x,y,z,r),依次解析即可,python解析代碼如下:

import numpy as np
import struct

def read_lidar_info(file_path):
    size = os.path.getsize(file_path)
    point_num = int(size / 16)
    assert point_num * 16 == size

    lidar_pt_list = np.zeros((point_num, 4), np.float)
    with open(file_path, 'rb') as f:
        for i in range(point_num * 4):
            data = f.read(4)
            val = struct.unpack('f', data)
            row = int(i / 4)
            col = i % 4
            lidar_pt_list[row][col] = val[0]
    lidar_pt_list = lidar_pt_list.transpose()

    return lidar_pt_list
           

2.2.3 标定資料

  為了盡可能減少标定的系統誤差,KITTI每天都會重新對傳感器進行一次标定,是以每張圖檔都有一個對應的txt标定參數檔案,如下圖所示。

KITTI 3D目标檢測資料集解析(完整版)1. KITTI資料集概述2. 3D目标檢測資料集概述
參數名稱 含義
P0~P3 3 × 4 3 \times 4 3×4的相機投影矩陣,0~3分别對應左側灰階相機、右側灰階相機、左側彩色相機、右側彩色相機
R0_rect 3 × 3 3 \times 3 3×3的旋轉修正矩陣
Tr_velo_to_cam 3 × 4 3 \times 4 3×4的雷射坐标系到Cam 0坐标系的變換矩陣
Tr_imu_to_velo 3 × 4 3 \times 4 3×4的IMU坐标系到雷射坐标系的變換矩陣

目标3D框到圖像的投影

  目标在相機坐标系下的坐标 X = ( x , y , z , 1 ) T X=(x,y,z,1)^T X=(x,y,z,1)T到圖像像素坐标系 Y = ( u , v , 1 ) T Y=(u,v,1)^T Y=(u,v,1)T的投影遵循: Y = P r e c t ( i ) X Y=P^{(i)}_{rect}X Y=Prect(i)​X雷射點雲到圖像的投影

  目标在雷射坐标系下的坐标 X = ( x , y , z , 1 ) T X=(x,y,z,1)^T X=(x,y,z,1)T到圖像像素坐标系 Y = ( u , v , 1 ) T Y=(u,v,1)^T Y=(u,v,1)T的投影遵循: Y = P r e c t ( i ) R r e c t ( 0 ) T v e l o c a m X Y=P^{(i)}_{rect}R^{(0)}_{rect}T^{cam}_{velo}X Y=Prect(i)​Rrect(0)​Tvelocam​X其中 P r e c t ( i ) P^{(i)}_{rect} Prect(i)​對應标定參數的P0~P3,因為這裡使用的左側彩色相機,是以用的是P2投影矩陣。另外, R r e c t ( 0 ) R^{(0)}_{rect} Rrect(0)​和 T v e l o c a m T^{cam}_{velo} Tvelocam​在标定檔案中是 3 × 3 3\times 3 3×3的矩陣,實際使用時需要用0擴充到 4 × 4 4\times4 4×4大小,并指派 R r e c t ( 0 ) ( 3 , 3 ) = 1 R^{(0)}_{rect}(3, 3)=1 Rrect(0)​(3,3)=1, T v e l o c a m ( 3 , 3 ) = 1 T^{cam}_{velo}(3,3)=1 Tvelocam​(3,3)=1。

  最終效果如下:

KITTI 3D目标檢測資料集解析(完整版)1. KITTI資料集概述2. 3D目标檢測資料集概述

繼續閱讀