在 Amazon SageMaker Ground Truth 中標記數據,以實現 3D 對象跟蹤與傳感器融合

Original URL: https://aws.amazon.com/cn/blogs/machine-learning/labeling-data-for-3d-object-tracking-and-sensor-fusion-in-amazon-sagemaker-ground-truth/

Amazon SageMaker Ground Truth 現在支持對3D點雲數據進行標記。關於其他功能的更多詳細信息,請參閱AWS News博客。在本文中,我們將專門介紹如何對3D點雲數據執行數據轉換,從而使用SageMaker Ground Truth來標記3D對象跟蹤。

自動駕駛車輛(AV)廠商通常使用LiDAR傳感器生成對車輛周邊環境的3D成像結果。例如,他們會將LiDAR安裝在車輛頂端,藉此連續捕捉周邊3D環境的時間點快照。LiDAR傳感器輸出的是一系列3D點雲圖像幀(常見的捕捉速率爲每秒10幀)。爲了建立起能夠自動跟蹤車輛周邊重點對象(例如其他車輛及行人)的感知系統,自動駕駛廠商往往首先在3D點雲圖像幀中手動標記對象,而後使用標記後的3D圖像幀訓練機器學習(ML)模型。

在構建感知系統方面,目前最常見的做法是使用來自多個傳感器的輸入以彌補單一傳感器的侷限。例如,攝像機能夠提供重要的上下文信息——例如當前交通信號燈顯示紅色、黃色還是綠色。但其在黑暗條件下的感知能力卻非常有限。在另一方面,LiDAR傳感器無法提供特定的上下文背景(例如交通信號燈的顏色),但卻能在360度範圍內實現縱深信息的收集,且無論外部光照條件如何。

SageMaker Ground Truth能夠輕鬆在一系列3D點雲幀上標記對象以構建機器學習訓練數據集,且支持將多達8臺攝像機輸入的LiDAR傳感數據加以融合。SageMaker Ground Truth做圖像融合要求視頻幀與3D點雲幀進行預先同步。在啓用傳感器融合功能之後,標記人員可以配合同步視頻幀查看3D點雲幀。除了爲標記工作提供更多視覺環境信息之外,傳感器融合功能還會將3D點雲中繪製的任何標籤投射至視頻幀,保證在某一幀內完成的標記調整將準確出現在另一幀中。

在本文中,我們將演示如何準備3D點雲數據與同步視頻數據,以供SageMaker Ground Truth使用。我們從 KITTI Vision Benchmark Suite開始,這是現有流行的自動駕駛數據集。[1] 除了視頻數據外,該數據集還包含由Velodyne LiDAR傳感器生成的3D點雲數據。具體操作步驟如下:

  • 明確SageMaker Ground Truth 3D點雲標記作業的輸入數據格式與要求。
  • 將KITTI數據集從局部座標系轉換爲世界座標系。
  • 將視頻數據與同步LiDAR數據相關聯,以進行傳感器融合。
  • 準備一個輸入SageMaker Ground Truth 的 manifest文件。
  • 爲3D點雲對象檢測創建一個標記作業,並跨越一系列幀進行跟蹤。
  • 在工作人員標記UI界面當中使用輔助標記工具。

要完成本輪演練,請使用Ground Truth Labeling Jobs下notebook實例中Amazon SageMaker Examples選項卡下的3D-point-cloud-input-data-processing.ipynb notebook。您也可以在GitHub上獲取此notebook

3D點雲標記作業輸入數據

在本節中,我們將介紹Ground Truth輸入數據的概念,以及對於3D點雲標記作業的基本要求。

3D點雲幀與3D點雲序列

所謂“點雲幀”,是指某一時刻3D場景下所有3D點的集合。每個點都使用三個座標來描述,分別爲x、y與z。向點雲中添加顏色及點強度變化,即可使點具備其他屬性,例如強度i或者紅色(r)、綠色(g)及藍色(b)色彩通道的值(8位)。所有位置座標(x, y, z)皆以米爲單位。在創建Ground Truth 3D點雲標記作業時,大家可以使用ASCII或者二進制格式的點雲數據。

而“序列”的定義,則是在LiDAR移動時(例如位於車輛頂端的LiDAR)所捕捉到的3D點雲幀的時間序列集合。SageMaker Ground Truth將序列文件格式定義爲各幀的有序排列結果,其中每個幀都與時間戳相關聯。

在本文中,我們將演示如何根據KITTI數據集創建SageMaker Ground Truth序列文件,並以此爲基礎創建用於3D對象跟蹤的標記作業。

世界座標系

在對象跟蹤中,大家可以在參考點(自動駕駛汽車)移動時跟蹤對象(例如人行道上的行人)的運動軌跡。您的參考點上安裝有傳感器以感應周邊的環境,這也是目前“自主車輛”的常見設計思路。

在執行對象跟蹤時,我們需要使用世界座標系(也稱爲全局參照系),這是因爲自主車輛本身確實是在世界範圍內移動。通常,SageMaker Ground Truth要求您將點雲數據轉換爲您所選定的參考座標系。大家一般可以通過將3D幀中的各個點與LiDAR傳感器的外部矩陣相乘來完成此類轉換。傳感器的外部矩陣是一種同構轉換矩陣,用於將數據的透視圖從傳感器自身的座標系轉換爲世界座標系。均勻變換是指對三個旋轉軸(x軸、y軸與z軸)以及原點平移的序列轉換,旋轉矩陣則爲定義三者旋轉序列的3 x 3矩陣。

本文將向大家介紹如何使用外部矩陣將KITTI 3D幀從局部座標系轉換爲世界座標系。KITTI數據集爲每個3D點雲幀提供一對應的外部矩陣。您可以使用來自自主車輛的GPS數據得出外部矩陣,並使用NumPy矩陣乘法函數將此矩陣與幀中的各個點相乘,將其轉換爲KITTI數據集使用的世界座標系。

通過自定義設置,大家還可以使用GPS/IMU與自主車輛上LiDAR傳感器的相對位置與方向(緯度/經度/高度/側傾角/俯角/仰角)計算外部變換矩陣。例如,您可以基於 pose = convertOxtsToPose(oxts) 從KITTI原始數據計算車輛姿態,並將oxts數據轉換爲由4 x 4剛性變換矩陣指定的局部歐氏姿勢。接下來,您可以使用世界座標系中的參考幀轉換矩陣將該姿態轉換矩陣轉換爲全局參考幀。

傳感器融合

LiDAR傳感器與每臺攝像機都擁有自己的外部矩陣,SageMaker Ground Truth利用它們來實現傳感器融合功能。要將標籤從3D點雲投射至攝像機平面圖像,SageMaker Ground Truth需要將3D點由LiDAR座標系轉換爲攝像機座標系。這一轉換通常是使用LiDAR外部矩陣將3D點從LiDAR自有座標轉換爲世界座標系來完成的。接下來,我們使用攝像機外部矩陣的逆(從世界到攝像機)將上一步中獲得的世界座標系 3D點轉換爲攝像機平面圖像。如果您的3D點雲數據已經轉換爲世界座標系形式,則無需進行第一次轉換,而且3D與2D之間的轉換將僅需要使用攝像機外部矩陣。

如果在世界座標系中存在一個旋轉矩陣(由軸旋轉組成)與平移矢量(或原點),而非單一外部變換矩陣,則可以直接使用旋轉與平移來計算車輛姿態。具體參見以下代碼:

Python

rotation = [[ 9.96714314e-01, -8.09890350e-02,  1.16333982e-03],
[ 8.09967396e-02,  9.96661051e-01, -1.03090934e-02],
[-3.24531964e-04,  1.03694477e-02,  9.99946183e-01]]
 
 origin= [1.71104606e+00
          5.80000039e-01
          9.43144935e-01]
         
from scipy.spatial.transform import Rotation as R
# position is the origin
position = origin 
r = R.from_matrix(np.asarray(rotation))
# heading in WCS using scipy 
heading = r.as_quat()

如果您擁有一個4 x 4外部矩陣,且矩陣形式爲[R T; 0 0 0 1],其中R爲旋轉矩陣,T爲原點平移矢量,則意味着您可以從矩陣中提取旋轉矩陣與平移矢量,具體如下所示:

Python

import numpy as np

transformation 
= [[ 9.96714314e-01, -8.09890350e-02,  1.16333982e-03, 1.71104606e+00],
   [ 8.09967396e-02,  9.96661051e-01, -1.03090934e-02, 5.80000039e-01],
   [-3.24531964e-04,  1.03694477e-02,  9.99946183e-01, 9.43144935e-01],
   [              0,               0,               0,              1]]

transformation  = np.array(transformation )
rotation = transformation[0:3][0:3]
translation= transformation[0:3][3]

from scipy.spatial.transform import Rotation as R
# position is the origin translation
position = translation
r = R.from_matrix(np.asarray(rotation))
# heading in WCS using scipy 
heading = r.as_quat()
print(f"position:{position}\nheading: {heading}")

在傳感器融合當中,我們可以通過原點位置(用於平移)以及四元數指向(用於指示xyz軸的旋轉)以傳感器姿態的形式提供外部矩陣。以下示例代碼是在輸入manifest文件中使用的姿態JSON文件:

Json

{
    "position": {
        "y": -152.77584902657554,
        "x": 311.21505956090624,
        "z": -10.854137529636024
      },
      "heading": {
        "qy": -0.7046155108831117,
        "qx": 0.034278837280808494,
        "qz": 0.7070617895701465,
        "qw": -0.04904659893885366
      }
}

所有位置座標(x, y, z)皆以米爲單位,所有姿態朝向(qx, qy, qz, qw)均以四元數在空間方向上的朝向爲指標。對於每臺攝像機,分別提供自攝像機外部提取到的姿態數據。

攝像機校準、內部與失真

幾何攝像機校準(也稱爲攝像機切除)用來標定攝像機的鏡頭和圖像傳感器參數。您可以使用這些參數校正鏡頭失真、測量對象的真實大小或確定場景中攝像機的位置。此外,如果相機圖像失真,您可以提供額外的校準參數(如內部和失真)來校正圖像。

相機參數包括本徵矩陣參數、外部矩陣參數與失真係數,點擊此處瞭解更多。詳見以下代碼:

Python

# intrinsic paramaters
fx (float) - focal length in x direction.
fy (float) - focal length in y direction.
cx (float) - x coordinate of principal point.
cy (float) - y coordinate of principal point.
# Radial distortion parameters
k1 (float) - Radial distortion coefficient.
k2 (float) - Radial distortion coefficient.
k3 (float) - Radial distortion coefficient.
k4 (float) - Radial distortion coefficient.
# Tangential distortion parameters
p1 (float) - Tangential distortion coefficient.
p2 (float) - Tangential distortion coefficient.

攝像機的內部變換通過以下公式進行定義,其中*代表矩陣乘法。

Python

|x|   |f_x, 0, c_x|   |X|
|y| = |0, f_y, c_y| * |Y|
|z|   | 0,  0,  1 |   |Z|

輸入manifest文件

Ground Truth採用輸入manifest文件,其中的每一行都描述了需要由註釋人員(或者對某些內置任務類型進行自動標記)完成的任務單元。輸入manifest文件的格式由您的實際任務類型決定:

  • 3D點雲對象檢測或者語義分段標記作業——輸入manifest文件中的每一行,都包含與單一3D點雲幀及傳感器融合數據相關的信息。此manifest文件被稱爲3D點雲幀輸入manifest。
  • 3D點雲對象檢測與標記作業跟蹤——輸入manifest文件中的每一行都包含指向某一序列文件的鏈接,該文件負責定義一系列與3D點雲幀及傳感器融合瞻前顧後 數據。其中各序列被稱爲3D點雲序列,而此manifest被稱爲點雲序列輸入manifest。

在本次實驗中,我們將創建一個點雲序列manifest文件。大家也可以修改解決方案以創建自己的點雲幀輸入manifest。示例notebook中提供更多詳細信息。

將KITTI數據集轉換爲世界座標系

您可以使用notebook運行本節中的各代碼片段。

世界座標系由具體數據集決定。某些數據集會使用第一幀中的LiDAR位置作爲原點,數據集中所有其他3D幀皆以第一幀作爲參考對象,包括車輛的行駛方向與位置也將以第一幀爲原點。也有一部分數據集會選取不同於原點的設備位置作爲起點。KITTI數據集數據集使用第一幀位置作爲其世界座標系的參考對象。

本文將展示如何相對於第一幀中的LiDAR傳感器原點,將KITTI數據集轉換爲全局參考幀,以便SageMaker Ground Truth能夠實際使用。KITTI原始數據集中包含各個幀的旋轉矩陣與平移矢量,您可以使用此數據爲各個幀計算外部矩陣。處理原始數據可能比較困難,因此建議大家使用pykitti Python模塊以降低KITTI數據集的處理門檻。

在數據集中,dataset.oxts[i].T_w_imu負責給出第i幀的LiDAR外部變換,您可以將其與該幀中的各點相乘,以使用NumPy矩陣乘法函數 matmul: matmul(lidar_transform_matrix, points)將其轉換爲世界座標系下的幀。通常,將LiDAR幀中的各點與LiDAR外部矩陣相乘,即可實現世界座標系轉換。其中T_w_imu約定即代表從IMU到世界座標系的轉移(因此標記爲T_destinationFrame_originFrame)。

以下示例代碼,說明了如何將KITTI點雲幀轉換爲世界座標系:

Python

import pykitti
import numpy as np

basedir = '/Users/nameofuser/kitti-data'
date = '2011_09_26'
drive = '0079'

# The 'frames' argument is optional - default: None, which loads the whole dataset.
# Calibration, timestamps, and IMU data are read automatically. 
# Camera and velodyne data are available via properties that create generators
# when accessed, or through getter methods that provide random access.
data = pykitti.raw(basedir, date, drive, frames=range(0, 50, 5))

# i is frame number
i = 0

# customer computes lidar extrinsics
lidar_extrinsic_matrix = data.oxts[i].T_w_imu

# velodyne raw point cloud in lidar scanners own coordinate system
points = data.get_velo(i)

# transform points from lidar to global frame using lidar_extrinsic_matrix
def generate_transformed_pcd_from_point_cloud(points, lidar_extrinsic_matrix):
    tps = []
    for point in points:
        transformed_points = np.matmul(lidar_extrinsic_matrix, np.array([point[0], point[1], point[2], 1], dtype=np.float32).reshape(4,1)).tolist()
        if len(point) > 3 and point[3] is not None:
            tps.append([transformed_points[0][0], transformed_points[1][0], transformed_points[2][0], point[3]])
       
    return tps
    
# customer transforms points from lidar to global frame using lidar_extrinsic_matrix
transformed_pcl = generate_transformed_pcd_from_point_cloud(points, lidar_extrinsic_matrix)

將視頻數據與LiDAR數據相關聯,以實現傳感器融合

KITTI提供LiDAR外部與相機外部矩陣。您可以使用這些矩陣提取姿態數據,而後根據3D點雲序列輸入manifest的需求將這部分數據轉換爲JSON格式。

對於KITTI數據集,您可以使用pykitti Python模塊加載KITTI數據。在數據集中, .oxts[i].T_w_imu負責給出第i幀的LiDAR外部矩陣(lidar_extrinsic_transform)。您可以將其轉換爲平移與四元數指向形式,分別代表JSON格式的LiDAR朝向與位置。具體請參見以下代碼:

Python

from scipy.spatial.transform import Rotation as R

# utility to convert extrinsic matrix to pose heading quaternion and position
def convert_extrinsic_matrix_to_trans_quaternion_mat(lidar_extrinsic_transform):
    position = lidar_extrinsic_transform[0:3, 3]
    rot = np.linalg.inv(lidar_extrinsic_transform[0:3, 0:3])
    quaternion= R.from_matrix(np.asarray(rot)).as_quat()
    trans_quaternions = {
        "translation": {
            "x": position[0],
            "y": position[1],
            "z": position[2]
        },
        "rotation": {
            "qx": quaternion[0],
            "qy": quaternion[1],
            "qz": quaternion[2],
            "qw": quaternion[3]
            }
    }
    return trans_quaternions

同樣,您也可以使用相機外部參數提取相機姿態數據。您可以通過inv(matmul(dataset.calib.T_cam0_velo, inv(dataset.oxts[i].T_w_imu)))在第i幀中計算cam0Camera_extrinsic_transform,進而將其轉換爲cam0的朝向與位置。詳見以下代碼:

Python

def convert_camera_inv_extrinsic_matrix_to_trans_quaternion_mat(camera_extrinsic_transform):
    position = camera_extrinsic_transform[0:3, 3]
    rot = np.linalg.inv(camera_extrinsic_transform[0:3, 0:3])
    quaternion= R.from_matrix(np.asarray(rot)).as_quat()
    trans_quaternions = {
        "translation": {
            "x": position[0],
            "y": position[1],
            "z": position[2]
        },
        "rotation": {
            "qx": quaternion[0],
            "qy": quaternion[1],
            "qz": quaternion[2],
            "qw": -quaternion[3]
            }
    }
    return trans_quaternions

相機校準:內部與失真

KITTI數據集爲每臺攝像機提供一項校準參數。例如,data.calib.K_cam0當中就包含以下相機內部矩陣:

Python

            fx 0  cx
            0  fy cy
            0  0   1

創建輸入manifest文件

將KITTI數據集中的一系列幀轉換爲世界座標系,並從LiDAR及相機外部矩陣提取姿態信息之後,大家就可以創建一個包含傳感器融合數據的3D點雲序列manifest文件了。您可以使用以下函數爲序列輸入manifest文件自動創建序列文件:

Python

def convert_to_gt():
    # The 'frames' argument is optional - default: None, which loads the whole dataset.
    # Calibration, timestamps, and IMU data are read automatically. 
    # Camera and velodyne data are available via properties that create generators
    # when accessed, or through getter methods that provide random access.
    data = pykitti.raw(basedir, date, drive, frames=range(0, 50, 5))
    image_paths  = [data.cam0_files,  data.cam1_files, data.cam2_files, data.cam3_files]
    camera_extrinsic_calibrations = [data.calib.T_cam0_velo, data.calib.T_cam1_velo, data.calib.T_cam2_velo, data.calib.T_cam3_velo]
    camera_intrinsics = [data.calib.K_cam0, data.calib.K_cam1, data.calib.K_cam2, data.calib.K_cam3]
    seq_json = {}
    seq_json["seq-no"] = 1
    seq_json["prefix"] = 's3://pdx-groundtruth-lidar-test-bucket/pdx-groundtruth-sequences/kittiseq2/frames/'
    seq_json["number-of-frames"] = len(data)
    seq_json["frames"] = []
    default_position = {"x": 0, "y": 0, "z": 0}
    default_heading = {"qx": 0, "qy": 0, "qz": 0, "qw": 1}
    for i in range(len(data)):
        # customer computes lidar extrinsics
        lidar_extrinsic_matrix = data.oxts[i].T_w_imu        
        # velodyne raw point cloud in lidar scanners own coordinate system
        points = data.get_velo(i)
        # customer transforms points from lidar to global frame using lidar_extrinsic_matrix
        transformed_pcl = generate_transformed_pcd_from_point_cloud(points, lidar_extrinsic_matrix)    
        # Customer computes rotation quaternion and translation from LiDAR Extrinsic
        trans_quaternions = convert_extrinsic_matrix_to_trans_quaternion_mat(lidar_extrinsic_matrix)
        # Customer uses trans_quaternions to populates GT ego veicle pose
        ego_vehicle_pose = {}
        ego_vehicle_pose['heading'] = trans_quaternions['rotation']
        ego_vehicle_pose['position'] = trans_quaternions['translation']
        # open file to write the transformed pcl
        with open(output_base+"/"+str(i)+'.txt', "w") as out:
            writer = csv.writer(out, delimiter=' ', quotechar='"', quoting=csv.QUOTE_MINIMAL)
            for point in transformed_pcl:
                writer.writerow((point[0], point[1], point[2], point[3]))
        frame = {}
        frame["frame-no"] = i
        frame["frame"] = str(i)+'.txt'
        frame["unix-timestamp"] = data.timestamps[i].replace(tzinfo=timezone.utc).timestamp()
        frame["ego-vehicle-pose"] = ego_vehicle_pose
        images = []
        image_dir_path = os.path.join(output_base, 'images')
        if not os.path.exists(image_dir_path):
            os.makedirs(image_dir_path)
        for j in range(len(image_paths)):
            # copy image
            image_path = image_paths[j][i]
            image_suffix_path = 'images/frame_'+str(i)+'_camera_'+str(j)+'.jpg'
            copyfile(image_path, os.path.join(output_base, image_suffix_path))
            # If customer has the camera extrinsics then they use them to compute the camera transform
            camera_transform= np.linalg.inv(np.matmul(camera_extrinsic_calibrations[j], np.linalg.inv(data.oxts[i].T_w_imu)))
            # Customer computes rotation quaternion and translation from camera inverse Extrinsic
            cam_trans_quaternions = convert_camera_inv_extrinsic_matrix_to_trans_quaternion_mat(camera_transform)
            image_json = {}
            image_json["image-path"] = image_suffix_path
            image_json["unix-timestamp"] = frame["unix-timestamp"]
            image_json['heading'] = cam_trans_quaternions['rotation']
            image_json['position'] = cam_trans_quaternions['translation']
            image_json['fx'] = camera_intrinsics[j][0][0]
            image_json['fy'] = camera_intrinsics[j][1][1]
            image_json['cx'] = camera_intrinsics[j][0][2]
            image_json['cy'] = camera_intrinsics[j][1][2]
            image_json['k1'] = 0
            image_json['k2'] = 0
            image_json['k3'] = 0
            image_json['k4'] = 0
            image_json['p1'] = 0
            image_json['p2'] = 0
            image_json['skew'] = 0
            images.append(image_json)
        frame["images"]=images
        seq_json["frames"].append(frame)
    with open(output_base+'/mykitti-seq2.json', 'w') as outfile:
        json.dump(seq_json, outfile)

創建標記作業

輸入manifest文件創建完成之後,即可以用notebook創建一個標記作業。在創建標記作業時(參照notebook內的相關說明),請使用內部工作團隊,以保證您能夠在工作人員門戶中隨時查看各工作人員任務並與工作人員標記UI進行交互。

標記作業的預處理時間,是任務開始時顯示在工作人員門戶中的所需時間。具體時長取決於輸入數據的大小、點雲的分辨率以及用於傳感器融合的數據(如果存在)。因此,在使用notebook時,您的標記作業可能需要幾分鐘時間纔會顯示在工作人員門戶當中。在任務出現後,將其選定並選擇Start Working。

關於工作人員UI的更多詳細信息,請參閱3D點雲對象跟蹤。以下爲工作人員標記UI中提供的部分輔助標記工具:

  • 標籤自動填充——當工作人員向幀中添加框體時,此功能會自動將框體請回至序列中的所有幀。當工作人員手動調整其他幀中同一對象的註釋時,自動填充標籤也將進行自動調整。
  • 標籤插值——工作人員在兩個幀中標記單一對象後,Ground Truth會使用這些註釋在兩幀之間的移動中對該對象進行插值。
  • 捕捉——工作人員可以在對象周邊添加一個框體,並使用鍵盤快捷鍵或菜單選項讓Ground Truth自動擬合工具緊緊貼合對象的邊界。
  • 適應地面——在工作人員向3D場景中添加框體後,工作人員可以自動使該框體與地面相適應。例如,工作人員可以使用此功能將框體貼合至場景中的道路或人行道。
  • 多視圖標記——工作人員將3D框體添加至3D場景之後,側面板上會顯示正面與側面兩個透視圖,以幫助工作人員在對象周邊緊密調整該框體。工作人員可以在3D點雲或側面板上調整標籤,相應調整也會實時顯示在其他視圖當中。
  • 傳感器融合——如果您提供傳感器融合數據,則工作人員可以在3D場景與2D圖像當中調整註釋,且該註釋會被實時投射至其他視圖當中。

以下視頻演示了插值的過程。工作人員只需要將兩個長方形框體添加至序列中的第一幀與最後一幀。這些手動添加的框體將在左下方的導航欄中以紅色段表示,中間的所有標籤(在導航欄中顯示爲藍色)均由Ground Truth負責插入。

下圖所示,爲多視圖標記與傳感器融合。將長方形框體添加至3D點雲可視化圖後,我們可以在三個側視圖與攝像機圖像中對其進行調整。

除了標籤之外,大家還可以添加標籤屬性以收集各個對象上的其他元數據。在以下視頻中,可以看到帶有“Car”標籤的長方形框體。該標籤還包含與之關聯的兩項標籤屬性:Occlusion與Color。工作人員可以爲各個標籤屬性選擇對應的值。

Ground Truth每15分鐘自動保存一次註釋。在作業完成之後,選擇Submit。當任務完成後,輸出數據將被保存於您在HumanTaskConfig中指定的Amazon Simple Storage Service (Amazon S3)存儲桶當中。

要了解關於輸出數據格式的更多詳細信息,請參閱Ground Truth輸出數據頁面中的3D點雲對象跟蹤部分。

總結

在本次實驗中,我們瞭解了Ground Truth 3D點雲標記作業對於輸入數據的要求與選項,同時嘗試創建了對象跟蹤標記作業。關於我們能夠在3D點雲標記作業中實現的其他任務類型,請參閱3D點雲任務類型。另外,我們還要感謝KITTI團隊爲我們提供這套寶貴的數據集,用於演示如何準備3D點雲數據並將其引入SageMaker Ground Truth。

[1] KITTI數據集擁有自己的使用許可。請保證您對數據集的使用方式完全符合其中提出的條款與要求。

作者介紹

Vikram Madan

Vikram Madan 是 Amazon SageMaker Ground Truth 產品經理。他專注於交付可以更輕鬆構建機器學習解決方案的產品。閒暇時間,他喜歡長跑和觀看紀錄片。

Zahid Rahman

AWS AI高級軟件開發工程師。他主要負責開發複雜的機器學習服務與大規模分佈式系統。他對計算機視覺、人工智能以及大數據技術抱有濃厚興趣。在業餘時間,他喜歡閱讀歷史書籍。

Talia Chopra

是一位專攻機器學習和人工智能的 AWS 技術撰稿人。她與 AWS 的多個團隊合作,爲使用 Amazon SageMaker、MxNet 和AutoGluon 的客戶創建技術文檔和教程。閒暇時,她喜歡在大自然中冥想和散步。

本文轉載自亞馬遜AWS官方博客。

原文鏈接

在 Amazon SageMaker Ground Truth 中標記數據,以實現 3D 對象跟蹤與傳感器融合

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章