? 作者:大森林?
3D點(diǎn)云目標(biāo)跟蹤的評價指標(biāo),可以根據(jù)跟蹤的目標(biāo)是單個還是多個,分為單目標(biāo)跟蹤(SOT)和多目標(biāo)跟蹤(MOT)兩種。一般來說,SOT的評價指標(biāo)主要關(guān)注跟蹤的準(zhǔn)確性和魯棒性,而MOT的評價指標(biāo)則需要考慮跟蹤的完整性和一致性。
SOT的常用評價指標(biāo)有:
平均重疊率(Average Overlap Rate, AOR):表示預(yù)測的3D邊界框與真實的3D邊界框之間的重疊比例的平均值。
平均中心誤差(Average Center Error, ACE):表示預(yù)測的3D邊界框與真實的3D邊界框之間的中心點(diǎn)距離的平均值。
成功率(Success Rate, SR):表示預(yù)測的3D邊界框與真實的3D邊界框之間的重疊比例超過某個閾值(如0.5)的幀數(shù)占總幀數(shù)的比例。
精確率(Precision Rate, PR):表示預(yù)測的3D邊界框與真實的3D邊界框之間的中心點(diǎn)距離小于某個閾值(如1米)的幀數(shù)占總幀數(shù)的比例。
MOT的常用評價指標(biāo)有:
多目標(biāo)跟蹤精度(Multiple Object Tracking Accuracy, MOTA):綜合考慮了漏檢率、誤檢率和ID切換率對跟蹤精度的影響。
多目標(biāo)跟蹤精確度(Multiple Object Tracking Precision, MOTP):表示預(yù)測的3D邊界框與真實的3D邊界框之間的重疊比例或中心點(diǎn)距離的平均值。
跟蹤長度(Track Length, TL):表示每個目標(biāo)被成功跟蹤的幀數(shù)。
跟蹤片段(Track Fragment, TF):表示每個目標(biāo)被中斷跟蹤的次數(shù)。
ID切換率(ID Switch Rate, ISR):表示每個目標(biāo)被錯誤地分配給另一個ID或從另一個ID切換過來的次數(shù)。
評價指標(biāo)詳細(xì)代碼:
首先,我們需要導(dǎo)入一些必要的庫,如numpy, scipy和sklearn。然后,我們需要定義一些輔助函數(shù),如計算兩個3D邊界框之間的重疊比例(IoU),計算兩個3D點(diǎn)之間的歐氏距離,以及使用匈牙利算法進(jìn)行數(shù)據(jù)關(guān)聯(lián)。
import?numpy?as?np from?scipy.spatial.transform?import?Rotation?as?R from?scipy.optimize?import?linear_sum_assignment from?sklearn.metrics?import?pairwise_distances #?計算兩個3D邊界框之間的重疊比例(IoU) def?iou_3d(box1,?box2): ????#?box1和box2都是7維向量,表示(x,?y,?z,?w,?l,?h,?yaw) ????#?其中(x,?y,?z)是中心點(diǎn)坐標(biāo),(w,?l,?h)是寬度、長度和高度,yaw是偏航角 ????#?返回兩個邊界框之間的IoU值,范圍在[0,?1] ????#?將邊界框轉(zhuǎn)換為8個頂點(diǎn)的矩陣 ????box1_corners?=?box_to_corners(box1) ????box2_corners?=?box_to_corners(box2) ????#?計算兩個邊界框在每個軸上的投影區(qū)間 ????box1_xmin?=?np.min(box1_corners[:,?0]) ????box1_xmax?=?np.max(box1_corners[:,?0]) ????box1_ymin?=?np.min(box1_corners[:,?1]) ????box1_ymax?=?np.max(box1_corners[:,?1]) ????box1_zmin?=?np.min(box1_corners[:,?2]) ????box1_zmax?=?np.max(box1_corners[:,?2]) ????box2_xmin?=?np.min(box2_corners[:,?0]) ????box2_xmax?=?np.max(box2_corners[:,?0]) ????box2_ymin?=?np.min(box2_corners[:,?1]) ????box2_ymax?=?np.max(box2_corners[:,?1]) ????box2_zmin?=?np.min(box2_corners[:,?2]) ????box2_zmax?=?np.max(box2_corners[:,?2]) ????#?計算兩個邊界框在每個軸上的交集區(qū)間 ????inter_xmin?=?max(box1_xmin,?box2_xmin) ????inter_xmax?=?min(box1_xmax,?box2_xmax) ????inter_ymin?=?max(box1_ymin,?box2_ymin) ????inter_ymax?=?min(box1_ymax,?box2_ymax) ????inter_zmin?=?max(box1_zmin,?box2_zmin) ????inter_zmax?=?min(box1_zmax,?box2_zmax) ????#?如果沒有交集,返回0 ????if?inter_xmax??
接下來,我們需要定義一些評價指標(biāo)的計算函數(shù),如AOR,ACE,SR,PR,MOTA,MOTP,TL,TF,ISR等。我們已經(jīng)有了預(yù)測的3D邊界框和真實的3D邊界框的列表,以及每個邊界框的置信度得分。我們還需要定義一些閾值,如重疊比例閾值(iou_threshold),中心點(diǎn)距離閾值(dist_threshold),置信度得分閾值(score_threshold)等,這些閾值將在代碼中具體給出。
#?計算平均重疊率(AOR) def?average_overlap_rate(pred_boxes,?gt_boxes): ????#?pred_boxes是一個p?x?7的矩陣,表示p個預(yù)測的3D邊界框 ????#?gt_boxes是一個g?x?7的矩陣,表示g個真實的3D邊界框 ????#?返回平均重疊率(AOR)值 ????#?如果沒有預(yù)測或真實邊界框,返回0 ????if?pred_boxes.shape[0]?==?0?or?gt_boxes.shape[0]?==?0: ????????return?0.0 ????#?計算預(yù)測和真實邊界框之間的重疊比例矩陣,大小為p?x?g ????iou_matrix?=?np.zeros((pred_boxes.shape[0],?gt_boxes.shape[0])) ????for?i?in?range(pred_boxes.shape[0]): ????????for?j?in?range(gt_boxes.shape[0]): ????????????iou_matrix[i][j]?=?iou_3d(pred_boxes[i],?gt_boxes[j]) ????#?使用匈牙利算法進(jìn)行數(shù)據(jù)關(guān)聯(lián),得到匹配結(jié)果 ????matches?=?data_association(-iou_matrix) ????#?計算并返回平均重疊率(AOR)值 ?ace?=?np.mean(dist_matrix[matches?!=?-1]) ????return?ace #?計算成功率(SR) def?success_rate(pred_boxes,?gt_boxes,?iou_threshold=0.5): ????#?pred_boxes是一個p?x?7的矩陣,表示p個預(yù)測的3D邊界框 ????#?gt_boxes是一個g?x?7的矩陣,表示g個真實的3D邊界框 ????#?iou_threshold是一個浮點(diǎn)數(shù),表示重疊比例的閾值,默認(rèn)為0.5 ????#?返回成功率(SR)值 ????#?如果沒有預(yù)測或真實邊界框,返回0 ????if?pred_boxes.shape[0]?==?0?or?gt_boxes.shape[0]?==?0: ????????return?0.0 ????#?計算預(yù)測和真實邊界框之間的重疊比例矩陣,大小為p?x?g ????iou_matrix?=?np.zeros((pred_boxes.shape[0],?gt_boxes.shape[0])) ????for?i?in?range(pred_boxes.shape[0]): ????????for?j?in?range(gt_boxes.shape[0]): ????????????iou_matrix[i][j]?=?iou_3d(pred_boxes[i],?gt_boxes[j]) ????#?使用匈牙利算法進(jìn)行數(shù)據(jù)關(guān)聯(lián),得到匹配結(jié)果 ????matches?=?data_association(-iou_matrix) ????#?計算并返回成功率(SR)值 ????sr?=?np.sum(iou_matrix[matches?!=?-1]?>=?iou_threshold)?/?pred_boxes.shape[0] ????return?sr #?計算精確率(PR) def?precision_rate(pred_boxes,?gt_boxes,?dist_threshold=1.0): ????#?pred_boxes是一個p?x?7的矩陣,表示p個預(yù)測的3D邊界框 ????#?gt_boxes是一個g?x?7的矩陣,表示g個真實的3D邊界框 ????#?dist_threshold是一個浮點(diǎn)數(shù),表示中心點(diǎn)距離的閾值,默認(rèn)為1.0 ????#?返回精確率(PR)值 ????#?如果沒有預(yù)測或真實邊界框,返回0 ????if?pred_boxes.shape[0]?==?0?or?gt_boxes.shape[0]?==?0: ????????return?0.0 ????#?提取預(yù)測和真實邊界框的中心點(diǎn)坐標(biāo) ????pred_centers?=?pred_boxes[:,?:3] ????gt_centers?=?gt_boxes[:,?:3] ????#?計算預(yù)測和真實邊界框之間的中心點(diǎn)距離矩陣,大小為p?x?g ????dist_matrix?=?pairwise_distances(pred_centers,?gt_centers) ????#?使用匈牙利算法進(jìn)行數(shù)據(jù)關(guān)聯(lián),得到匹配結(jié)果 ????matches?=?data_association(dist_matrix) ????#?計算并返回精確率(PR)值 ????pr?=?np.sum(dist_matrix[matches?!=?-1]?<=?dist_threshold)?/?pred_boxes.shape[0] ????return?pr #?計算多目標(biāo)跟蹤精度(MOTA) def?multiple_object_tracking_accuracy(pred_boxes,?gt_boxes,?iou_threshold=0.5): ????#?pred_boxes是一個列表,長度為t,表示t個時間步的預(yù)測的3D邊界框 ????#?gt_boxes是一個列表,長度為t,表示t個時間步的真實的3D邊界框 ????#?iou_threshold是一個浮點(diǎn)數(shù),表示重疊比例的閾值,默認(rèn)為0.5 ????#?返回多目標(biāo)跟蹤精度(MOTA)值 ????#?如果沒有預(yù)測或真實邊界框,返回0 ????if?len(pred_boxes)?==?0?or?len(gt_boxes)?==?0: ????????return?0.0 ????#?初始化漏檢數(shù)、誤檢數(shù)、ID切換數(shù)和總真實數(shù)為0 ????miss_count?=?0 ????false_count?=?0 ????switch_count?=?0 ????total_count?=?0 ????#?初始化上一時間步的匹配結(jié)果為空字典 ????prev_matches?=?{} ????#?遍歷每個時間步 ????for?t?in?range(len(pred_boxes)): ????????#?獲取當(dāng)前時間步的預(yù)測和真實邊界框 ????????pred_box?=?pred_boxes[t] ????????gt_box?=?gt_boxes[t] ????????#?計算當(dāng)前時間步的真實邊界框的數(shù)量,并累加到總真實數(shù)中 ????????total_count?+=?gt_box.shape[0] ????????#?如果當(dāng)前時間步?jīng)]有預(yù)測或真實邊界框,跳過該時間步 ????????if?pred_box.shape[0]?==?0?or?gt_box.shape[0]?==?0: ????????????continue ????????#?計算當(dāng)前時間步的預(yù)測和真實邊界框之間的重疊比例矩陣,大小為p?x?g ????????iou_matrix?=?np.zeros((pred_box.shape[0],?gt_box.shape[0])) ????????for?i?in?range(pred_box.shape[0]): ????????????for?j?in?range(gt_box.shape[0]): ????????????????iou_matrix[i][j]?=?iou_3d(pred_box[i],?gt_box[j]) ????????#?使用匈牙利算法進(jìn)行數(shù)據(jù)關(guān)聯(lián),得到匹配結(jié)果 ????????matches?=?data_association(-iou_matrix) ????????#?初始化當(dāng)前時間步的匹配結(jié)果為空字典 ????????curr_matches?=?{} ????????#?遍歷每個預(yù)測邊界框 ????????for?i?in?range(pred_box.shape[0]): ????????????#?如果沒有匹配的真實邊界框,或者重疊比例低于閾值,累加誤檢數(shù),并跳過該預(yù)測邊界框 ????????????if?matches[i]?==?-1?or?iou_matrix[i][matches[i]]?以上就是我?guī)痛蠹铱偨Y(jié)的3D點(diǎn)云目標(biāo)跟蹤中常見的評價指標(biāo)和代碼詳解,希望可以幫助到大家。
編輯:黃飛
?
評論
查看更多