提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 前言
- 一、代碼
- 二、詳細解釋
- DISABLE_AUG_LIST
- AUG_CONFIG_LIST
- 1. gt_sampling
- 2. random_world_flip
- 3. random_world_rotation
- 4. random_world_scaling
- 總結
前言
提示:這里可以添加本文要記錄的大概內容:
openpcdet中yaml文件的DATA_AUGMENTOR學習
提示:以下是本篇文章正文內容,下面案例可供參考
一、代碼
DATA_AUGMENTOR:DISABLE_AUG_LIST: ['placeholder']AUG_CONFIG_LIST:- NAME: gt_samplingUSE_ROAD_PLANE: TrueDB_INFO_PATH:- kitti_dbinfos_train.pklPREPARE: {filter_by_min_points: ['Car:5', 'Pedestrian:5', 'Cyclist:5'],filter_by_difficulty: [-1],}SAMPLE_GROUPS: ['Car:15','Pedestrian:15', 'Cyclist:15']NUM_POINT_FEATURES: 4DATABASE_WITH_FAKELIDAR: FalseREMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0]LIMIT_WHOLE_SCENE: False- NAME: random_world_flipALONG_AXIS_LIST: ['x']- NAME: random_world_rotationWORLD_ROT_ANGLE: [-0.78539816, 0.78539816]- NAME: random_world_scalingWORLD_SCALE_RANGE: [0.95, 1.05]
二、詳細解釋
這個DATA_AUGMENTOR配置主要用于3D目標檢測或點云處理的數據增強。
以下是對這段配置的詳細解釋:
DISABLE_AUG_LIST
'placeholder':這里是一個占位符,表示沒有禁用任何數據增強方法。通常,這個列表會包含那些你希望禁用的數據增強方法的名稱。
AUG_CONFIG_LIST
這是一個列表,包含了多個數據增強的配置。
1. gt_sampling
NAME: gt_sampling
表示這種數據增強方法的名字是gt_sampling,通常用于從數據庫(DB)中采樣真值(ground truth)對象并將其放置在場景中。
USE_ROAD_PLANE: True 表示在采樣過程中會考慮道路平面。
DB_INFO_PATH:
這是一個列表,包含了數據庫信息(如對象的3D邊界框、類別等)的路徑。在這里,它指向了一個名為kitti_dbinfos_train.pkl的文件。
PREPARE:
filter_by_min_points: 這是一個列表,指定了每個類別對象所需的最小點數。例如,Car:5表示只考慮點數大于或等于5的汽車對象。
filter_by_difficulty: 這是一個列表,指定了過濾對象的難度級別。在這里,-1表示不過濾任何難度級別的對象。
SAMPLE_GROUPS: 這是一個列表,指定了每個類別對象在場景中應該被采樣的數量。例如,Car:15表示應該采樣15個汽車對象。
NUM_POINT_FEATURES: 表示每個點云點的特征數量,這里是4個。
DATABASE_WITH_FAKELIDAR: False 表示不使用模擬的激光雷達數據。
REMOVE_EXTRA_WIDTH: 一個列表,指定了在采樣對象時從對象的邊界框中移除的額外寬度(以x, y, z方向為順序)。在這里,沒有移除任何額外寬度。
LIMIT_WHOLE_SCENE: False 表示不限制整個場景的大小或內容。
2. random_world_flip
NAME: random_world_flip 表示這種數據增強方法的名字是隨機翻轉整個世界場景。
ALONG_AXIS_LIST: [‘x’] 表示只在x軸方向上進行隨機翻轉。
當采用random_world_flip這種數據增強方法后,數據會發生以下改變:
方向性變化:
原本的三維場景或對象會在指定的軸上(如x軸)進行隨機翻轉。這意味著場景或對象的方向會發生變化,可能是向左翻、向右翻,或者是上下翻轉(如果沿z軸翻轉)。
標簽和注釋的相應調整:
如果場景或對象帶有標簽或注釋(例如目標檢測任務中的邊界框或語義分割任務中的語義標簽),那么這些標簽和注釋也需要進行相應的翻轉調整,以確保它們仍然正確地與翻轉后的場景或對象對應。
數據多樣性的增加:
通過隨機翻轉,原始數據集中的每個場景或對象都會產生多個不同方向的變體,從而增加了數據的多樣性。這有助于訓練出更加魯棒和泛化能力更強的模型。
def random_world_flip(self, data_dict=None, config=None):if data_dict is None:return partial(self.random_world_flip, config=config)gt_boxes, points = data_dict['gt_boxes'], data_dict['points']for cur_axis in config['ALONG_AXIS_LIST']:assert cur_axis in ['x', 'y']gt_boxes, points, enable = getattr(augmentor_utils, 'random_flip_along_%s' % cur_axis)(gt_boxes, points, return_flip=True)data_dict['flip_%s'%cur_axis] = enableif 'roi_boxes' in data_dict.keys():num_frame, num_rois,dim = data_dict['roi_boxes'].shaperoi_boxes, _, _ = getattr(augmentor_utils, 'random_flip_along_%s' % cur_axis)(data_dict['roi_boxes'].reshape(-1,dim), np.zeros([1,3]), return_flip=True, enable=enable)data_dict['roi_boxes'] = roi_boxes.reshape(num_frame, num_rois,dim)data_dict['gt_boxes'] = gt_boxesdata_dict['points'] = pointsreturn data_dict
gt_boxes, points, enable = getattr(augmentor_utils, 'random_flip_along_%s' % cur_axis)(gt_boxes, points, return_flip=True)
這段代碼定義了一個名為random_world_flip的函數,它用于對三維點云數據及其對應的標簽(通常是目標邊界框)進行隨機的軸翻轉。
以下是對該代碼的詳細解釋:
函數定義
def random_world_flip(self, data_dict=None, config=None):
self: 表示這是一個類的方法,可能是一個數據增強類的一部分。
data_dict: 一個字典,包含點云數據(points)和對應的目標邊界框(gt_boxes)等信息。
config: 一個配置字典,其中包含了翻轉時要考慮的軸列表(ALONG_AXIS_LIST)。
主體部分
參數檢查
if data_dict is None: return partial(self.random_world_flip, config=config)
如果data_dict是None,則返回一個偏函數(partial function),該函數在稍后可以被調用,并自動傳入config參數。
數據遍歷和翻轉
for cur_axis in config['ALONG_AXIS_LIST']:
...
遍歷配置中指定的軸列表,對每個軸進行翻轉操作。
翻轉斷言
assert cur_axis in ['x', 'y']
確保當前軸只能是'x'或'y'。這通常是因為在三維空間中,沿z軸翻轉可能不符合物理世界的情況(如重力方向)。
調用翻轉函數
gt_boxes, points, enable = getattr(augmentor_utils, 'random_flip_along_%s' % cur_axis)( gt_boxes, points, return_flip=True
)
使用getattr從augmentor_utils模塊中動態獲取翻轉函數(如random_flip_along_x或random_flip_along_y),并傳入gt_boxes、points和return_flip=True。該函數會對數據進行翻轉,并返回翻轉后的數據以及一個布爾值enable,表示是否實際進行了翻轉。
def random_flip_along_x(gt_boxes, points, return_flip=False, enable=None):"""Args:gt_boxes: (N, 7 + C), [x, y, z, dx, dy, dz, heading, [vx], [vy]]points: (M, 3 + C)Returns:"""if enable is None:enable = np.random.choice([False, True], replace=False, p=[0.5, 0.5])if enable:gt_boxes[:, 1] = -gt_boxes[:, 1]gt_boxes[:, 6] = -gt_boxes[:, 6]points[:, 1] = -points[:, 1]if gt_boxes.shape[1] > 7:gt_boxes[:, 8] = -gt_boxes[:, 8]if return_flip:return gt_boxes, points, enablereturn gt_boxes, points
這段代碼定義了一個函數 random_flip_along_x,用于沿x軸隨機翻轉三維數據(如點云和目標邊界框)。
下面是對該代碼的詳細解釋:
函數定義
def random_flip_along_x(gt_boxes, points, return_flip=False, enable=None):
gt_boxes: 是一個形狀為 (N, 7 + C) 的二維數組,其中N表示目標邊界框的數量,7表示每個邊界框的基本屬性(x, y, z, dx, dy, dz, heading),C表示額外的屬性(如速度vx, vy等)。points: 是一個形狀為 (M, 3 + C) 的二維數組,其中M表示點的數量,3表示每個點的三維坐標(x, y, z),C表示額外的屬性。return_flip: 一個布爾值,如果為True,則除了返回翻轉后的gt_boxes和points外,還返回是否執行了翻轉的標志enable。enable: 一個布爾值,如果傳入,則指定是否執行翻轉。如果為None,則隨機決定是否執行翻轉。
函數體
隨機決定是否翻轉
if enable is None: enable = np.random.choice([False, True], replace=False, p=[0.5, 0.5])
如果enable是None,則使用numpy的random.choice函數隨機選擇是否執行翻轉。默認情況下,翻轉和不翻轉的概率都是0.5。
執行翻轉
if enable: gt_boxes[:, 1] = -gt_boxes[:, 1] gt_boxes[:, 6] = -gt_boxes[:, 6] points[:, 1] = -points[:, 1] if gt_boxes.shape[1] > 7: gt_boxes[:, 8] = -gt_boxes[:, 8]
如果決定執行翻轉:
邊界框的y坐標(索引為1)被取反,實現沿x軸的翻轉。邊界框的heading(索引為6)也被取反,因為heading通常表示目標的朝向,翻轉后朝向也會變化。點的y坐標(索引為1)也被取反。如果gt_boxes有額外的屬性(即C > 0),并且第一個額外屬性是速度vy(通常索引為8),則也將其取反(這取決于額外的屬性是否表示速度,并且vy是否是第一個)。
返回結果
if return_flip: return gt_boxes, points, enable
return gt_boxes, points
根據return_flip的值決定是否返回enable。如果return_flip為True,則返回翻轉后的gt_boxes、points和enable;否則只返回翻轉后的gt_boxes和points。
總結
這個函數允許你沿x軸隨機翻轉三維數據(如點云和目標邊界框),并可以返回是否執行了翻轉的標志。這在數據增強中很有用,可以幫助訓練出更魯棒的模型。
記錄翻轉狀態
data_dict[‘flip_%s’%cur_axis] = enable
將翻轉狀態記錄到data_dict中,以便后續處理。
處理ROI(Region of Interest)邊界框、
如果data_dict中包含'roi_boxes'鍵,則對ROI邊界框也進行相同的翻轉操作。這里,ROI邊界框可能是在多幀數據或特定區域中定義的邊界框。
更新數據字典
data_dict['gt_boxes'] = gt_boxes
data_dict['points'] = points
最后,將翻轉后的gt_boxes和points更新回data_dict中。
返回值
函數返回更新后的data_dict。
總結
這個函數實現了對三維點云數據和目標邊界框的隨機軸翻轉,同時考慮了ROI邊界框的翻轉,并將翻轉狀態記錄到數據字典中。這種數據增強方法有助于提高三維目標檢測或場景理解模型的泛化能力
3. random_world_rotation
NAME: random_world_rotation 表示這種數據增強方法的名字是隨機旋轉整個世界場景。
WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] 表示旋轉角度的范圍,單位是弧度。這個范圍大約對應于-45度到45度。
def global_rotation(gt_boxes, points, rot_range, return_rot=False, noise_rotation=None):"""Args:gt_boxes: (N, 7 + C), [x, y, z, dx, dy, dz, heading, [vx], [vy]]points: (M, 3 + C),rot_range: [min, max]Returns:"""if noise_rotation is None: noise_rotation = np.random.uniform(rot_range[0], rot_range[1])points = common_utils.rotate_points_along_z(points[np.newaxis, :, :], np.array([noise_rotation]))[0]gt_boxes[:, 0:3] = common_utils.rotate_points_along_z(gt_boxes[np.newaxis, :, 0:3], np.array([noise_rotation]))[0]gt_boxes[:, 6] += noise_rotationif gt_boxes.shape[1] > 7:gt_boxes[:, 7:9] = common_utils.rotate_points_along_z(np.hstack((gt_boxes[:, 7:9], np.zeros((gt_boxes.shape[0], 1))))[np.newaxis, :, :],np.array([noise_rotation]))[0][:, 0:2]if return_rot:return gt_boxes, points, noise_rotationreturn gt_boxes, points
這段代碼定義了一個名為 global_rotation 的函數,其主要目的是對給定的 gt_boxes(真實邊界框)和
points(點云數據)進行全局旋轉。這里的旋轉是沿著 z 軸進行的。
下面是詳細的解釋:
輸入參數:
gt_boxes: 一個形狀為 (N, 7 + C) 的數組,其中 N 是邊界框的數量,7 是邊界框的基本屬性(x, y, z, dx, dy, dz, heading),C 是可選的額外屬性(如速度 vx, vy)。points: 一個形狀為 (M, 3 + C) 的數組,其中 M 是點的數量,3 是點的三維坐標(x, y, z),C 是可選的額外屬性。rot_range: 一個長度為 2 的列表,表示旋轉角度的范圍(即 [min, max])。return_rot: 一個布爾值,決定是否返回旋轉角度。noise_rotation: 可選的旋轉角度,如果為 None,則隨機從 rot_range 中選擇一個。
函數執行:
如果 noise_rotation 為 None,則從 rot_range 中隨機選擇一個旋轉角度。
使用 common_utils.rotate_points_along_z 函數對 points 進行旋轉。這個函數會沿著 z 軸旋轉點云數據,并返回旋轉后的結果。同樣地,使用 common_utils.rotate_points_along_z 函數對 gt_boxes 的前三維(x, y, z)進行旋轉,并更新 gt_boxes。更新 gt_boxes 的 heading(方向角)屬性,將其加上 noise_rotation。如果 gt_boxes 有額外的屬性(如速度 vx, vy),并且這些屬性是二維的(可能是速度向量),則也對它們進行旋轉。根據 return_rot 的值,決定是否返回旋轉角度 noise_rotation。
輸出:
如果 return_rot 為 True,則返回旋轉后的 gt_boxes、points 和旋轉角度 noise_rotation。如果 return_rot 為 False(或省略),則只返回旋轉后的 gt_boxes 和 points。
這個函數在三維目標檢測或點云處理中可能很有用,特別是當你需要模擬真實世界中的旋轉或對數據集進行增強時。
4. random_world_scaling
NAME: random_world_scaling 表示這種數據增強方法的名字是隨機縮放整個世界場景。
WORLD_SCALE_RANGE: [0.95, 1.05] 表示縮放因子的范圍。這意味著場景可以被縮放到原始大小的95%到105%之間。
def global_scaling(gt_boxes, points, scale_range, return_scale=False):"""Args:gt_boxes: (N, 7), [x, y, z, dx, dy, dz, heading]points: (M, 3 + C),scale_range: [min, max]Returns:"""if scale_range[1] - scale_range[0] < 1e-3:return gt_boxes, pointsnoise_scale = np.random.uniform(scale_range[0], scale_range[1])points[:, :3] *= noise_scalegt_boxes[:, :6] *= noise_scaleif gt_boxes.shape[1] > 7:gt_boxes[:, 7:] *= noise_scaleif return_scale:return gt_boxes, points, noise_scalereturn gt_boxes, points
這段代碼定義了一個名為global_scaling的函數,其主要功能是對給定的點云(points)和地面真值邊界框(gt_boxes)進行全局縮放。縮放的比例(noise_scale)是從指定的縮放范圍(scale_range)中隨機選擇的。
以下是該函數的詳細解釋:
參數
gt_boxes: 形狀為 (N, 7) 的數組,其中 N 是邊界框的數量。每個邊界框有7個元素,分別是 [x, y, z, dx, dy, dz, heading]。其中 (x, y, z) 是邊界框的中心坐標,(dx, dy, dz) 是邊界框的尺寸(寬度、長度和高度),而 heading 是邊界框的朝向。points: 形狀為 (M, 3 + C) 的數組,其中 M 是點的數量,3 表示每個點的三維坐標 (x, y, z),C 表示每個點的其他特征數量(如果有的話)。scale_range: 一個長度為2的列表或數組,表示縮放比例的取值范圍,即 [min, max]。return_scale: 一個布爾值,如果為 True,則函數還會返回縮放比例 noise_scale。
返回值
如果 return_scale 為 False,則返回縮放后的 gt_boxes 和 points。如果 return_scale 為 True,則返回縮放后的 gt_boxes、points 和縮放比例 noise_scale。
功能
檢查縮放范圍:如果 scale_range 的兩個值之間的差小于 1e-3(即縮放范圍非常小),則不進行任何操作并直接返回原始的 gt_boxes 和 points。隨機選擇縮放比例:從 scale_range 中隨機選擇一個縮放比例 noise_scale。縮放點云:將 points 數組中的每個點的三維坐標 (x, y, z) 乘以縮放比例 noise_scale。縮放邊界框:將 gt_boxes 數組中的每個邊界框的中心坐標 (x, y, z) 和尺寸 (dx, dy, dz) 乘以縮放比例 noise_scale。如果 gt_boxes 的列數大于7(即存在額外的特征或屬性),則這些額外的特征或屬性也會被縮放。返回結果:根據 return_scale 的值,返回縮放后的 gt_boxes、points 和(可選的)縮放比例 noise_scale。
總結
總的來說,這個DATA_AUGMENTOR配置定義了一系列數據增強方法,這些方法可以幫助模型更好地泛化并處理各種復雜的場景和對象。
在訓練3D目標檢測模型時,使用這些數據增強方法通常可以提高模型的性能和魯棒性。