超全!2D單目標(biāo)跟蹤常用評價指標(biāo)及完整代碼
作者:大森林 | 來源:3D視覺工坊
在公眾號「3DCV」后臺,回復(fù)「原論文」即可獲取pdf和代碼鏈接。
添加微信:dddvisiona,備注:目標(biāo)檢測,拉你入群。文末附行業(yè)細分群。
2D單目標(biāo)跟蹤評價指標(biāo):
APE(Average Pixel Error):平均像素誤差,一般指預(yù)測框與真實框中心位置的像素距離取幀平均。用來判斷兩個矩形框的靠近程度。該值越小,說明誤差越小。
AOR(Average Overlap Rate):平均重疊率,即兩個矩形框交集的面積與并集的面積之比取幀平均。用來判斷兩個矩形框的重疊程度。值越高則重疊程度越高,即兩個框越靠近,跟蹤精度越高。
Pixel Error threshold:需要人為設(shè)定的像素誤差的閾值,Pixel Error低于該閾值的矩形框被認(rèn)為是命中目標(biāo),反之則被認(rèn)為未命中。用來作為區(qū)分矩形框是否命中目標(biāo)的指標(biāo),閾值越小則要求矩形框與真值像素誤差越小。
Overlap Rate threshold:需要人為設(shè)定的重疊率的閾值,重疊率高于該閾值的矩形框被認(rèn)為是命中目標(biāo),反之則被認(rèn)為未命中。用來作為區(qū)分矩形框是否命中目標(biāo)的指標(biāo),閾值越高則要求矩形框與真值重疊程度越高。
Success plot:序列中跟蹤成功的幀數(shù)占總幀數(shù)的比例定義為跟蹤成功率,選取不同的閾值,則可以得到各閾值下的成功率,連接各點形成success曲線。根據(jù)曲線下的面積來衡量tracker的跟蹤精確度。
TRE(Temporal Robustness Evaluation):時間魯棒性評估。從整個序列中截取若干段(可以重復(fù)),每段的初始幀利用ground truth進行初始化,在每一段上分別運行跟蹤算法,對每一段分別進行評估,最后對總體信息進行統(tǒng)計。
SRE(Spatial Robustness Evaluation):空間魯棒性評估。對起始幀的ground truth進行shift或scale操作形成若干段測試序列,在每一段上分別運行跟蹤算法,對每一段分別進行評估,最后對總體信息進行統(tǒng)計。
EAO(Expect Average Overlaprate)圖:以AOR作為精度的衡量標(biāo)準(zhǔn),以跟蹤算法跟丟目標(biāo)的次數(shù)作為魯棒性的衡量標(biāo)準(zhǔn)。在一張圖中同時反映精度和魯棒性。越靠近坐標(biāo)軸右上角,即AOR趨于1,SF趨于0,說明該算法精度和魯棒性越好。
這里分別展示了APE、AOR、Pixel Error threshold、Overlap Rate threshold、Success plot、TRE、SRE和EAO八種指標(biāo)的計算代碼。
#?APE(Average?Pixel?Error):平均像素誤差,一般指預(yù)測框與真實框中心位置的像素距離取幀平均。#?假設(shè)preds和gts是兩個列表,分別存儲預(yù)測框和真實框的中心坐標(biāo),如[(x1,?y1),?(x2,?y2),?...]#?假設(shè)n是幀數(shù)def?APE(preds,?gts,?n):????#?初始化總誤差為0????total_error?=?0????#?遍歷每一幀????for?i?in?range(n):????????#?計算預(yù)測框和真實框中心坐標(biāo)的歐式距離????????error?=?((preds[i][0]?-?gts[i][0])?**?2?+?(preds[i][1]?-?gts[i][1])?**?2)?**?0.5????????#?累加誤差????????total_error?+=?error????#?返回平均誤差????return?total_error?/?n#?AOR(Average?Overlap?Rate):平均重疊率,即兩個矩形框交集的面積與并集的面積之比取幀平均。#?假設(shè)preds和gts是兩個列表,分別存儲預(yù)測框和真實框的左上角和右下角坐標(biāo),如[(x1,?y1,?x2,?y2),?...]#?假設(shè)n是幀數(shù)def?AOR(preds,?gts,?n):????#?初始化總重疊率為0????total_overlap?=?0????#?遍歷每一幀????for?i?in?range(n):????????#?計算預(yù)測框和真實框的交集面積????????inter_area?=?max(0,?min(preds[i][2],?gts[i][2])?-?max(preds[i][0],?gts[i][0]))?*?max(0,?min(preds[i][3],?gts[i][3])?-?max(preds[i][1],?gts[i][1]))????????#?計算預(yù)測框和真實框的并集面積????????union_area?=?(preds[i][2]?-?preds[i][0])?*?(preds[i][3]?-?preds[i][1])?+?(gts[i][2]?-?gts[i][0])?*?(gts[i][3]?-?gts[i][1])?-?inter_area????????#?計算重疊率????????overlap?=?inter_area?/?union_area????????#?累加重疊率????????total_overlap?+=?overlap????#?返回平均重疊率????return?total_overlap?/?n#?Pixel?Error?threshold:需要人為設(shè)定的像素誤差的閾值,Pixel?Error低于該閾值的矩形框被認(rèn)為是命中目標(biāo),反之則被認(rèn)為未命中。#?假設(shè)preds和gts是兩個列表,分別存儲預(yù)測框和真實框的中心坐標(biāo),如[(x1,?y1),?(x2,?y2),?...]#?假設(shè)n是幀數(shù),t是閾值def?Pixel_Error_threshold(preds,?gts,?n,?t):????#?初始化命中數(shù)為0????hit_count?=?0????#?遍歷每一幀????for?i?in?range(n):????????#?計算預(yù)測框和真實框中心坐標(biāo)的歐式距離????????error?=?((preds[i][0]?-?gts[i][0])?**?2?+?(preds[i][1]?-?gts[i][1])?**?2)?**?0.5????????#?如果誤差小于閾值,認(rèn)為命中目標(biāo)????????if?error?<?t:????????????hit_count?+=?1????#?返回命中率????return?hit_count?/?n#?Overlap?Rate?threshold:需要人為設(shè)定的重疊率的閾值,重疊率高于該閾值的矩形框被認(rèn)為是命中目標(biāo),反之則被認(rèn)為未命中。#?假設(shè)preds和gts是兩個列表,分別存儲預(yù)測框和真實框的左上角和右下角坐標(biāo),如[(x1,?y1,?x2,?y2),?...]#?假設(shè)n是幀數(shù),t是閾值def?Overlap_Rate_threshold(preds,?gts,?n,?t):????#?初始化命中數(shù)為0????hit_count?=?0????#?遍歷每一幀????for?i?in?range(n):????????#?計算預(yù)測框和真實框的交集面積????????inter_area?=?max(0,?min(preds[i][2],?gts[i][2])?-?max(preds[i][0],?gts[i][0]))?*?max(0,?min(preds[i][3],?gts[i][3])?-?max(preds[i][1],?gts[i][1]))????????#?計算預(yù)測框和真實框的并集面積????????union_area?=?(preds[i][2]?-?preds[i][0])?*?(preds[i][3]?-?preds[i][1])?+?(gts[i][2]?-?gts[i][0])?*?(gts[i][3]?-?gts[i][1])?-?inter_area????????#?計算重疊率????????overlap?=?inter_area?/?union_area????????#?如果重疊率大于閾值,認(rèn)為命中目標(biāo)????????if?overlap?>?t:????????????hit_count?+=?1????#?返回命中率????return?hit_count?/?n#?Success?plot:序列中跟蹤成功的幀數(shù)占總幀數(shù)的比例定義為跟蹤成功率,選取不同的閾值,則可以得到各閾值下的成功率,連接各點形成success曲線。#?假設(shè)preds和gts是兩個列表,分別存儲預(yù)測框和真實框的左上角和右下角坐標(biāo),如[(x1,?y1,?x2,?y2),?...]#?假設(shè)n是幀數(shù),m是閾值個數(shù),thresholds是一個列表,存儲m個閾值def?Success_plot(preds,?gts,?n,?m,?thresholds):????#?初始化一個列表,存儲各閾值下的成功率????success_rates?=?[]????#?遍歷每個閾值????for?t?in?thresholds:????????#?初始化命中數(shù)為0????????hit_count?=?0????????#?遍歷每一幀????????for?i?in?range(n):????????????#?計算預(yù)測框和真實框的交集面積????????????inter_area?=?max(0,?min(preds[i][2],?gts[i][2])?-?max(preds[i][0],?gts[i][0]))?*?max(0,?min(preds[i][3],?gts[i][3])?-?max(preds[i][1],?gts[i][1]))????????????#?計算預(yù)測框和真實框的并集面積????????????union_area?=?(preds[i][2]?-?preds[i][0])?*?(preds[i][3]?-?preds[i][1])?+?(gts[i][2]?-?gts[i][0])?*?(gts[i][3]?-?gts[i][1])?-?inter_area????????????#?計算重疊率????????????overlap?=?inter_area?/?union_area????????????#?如果重疊率大于閾值,認(rèn)為命中目標(biāo)????????????if?overlap?>?t:????????????????hit_count?+=?1????????#?計算并存儲當(dāng)前閾值下的成功率????????success_rate?=?hit_count?/?n????????success_rates.append(success_rate)????#?返回一個列表,表示success曲線上的點坐標(biāo)(thresholds,?success_rates)????return?list(zip(thresholds,?success_rates))#?TRE(Temporal?Robustness?Evaluation):時間魯棒性評估。從整個序列中截取若干段(可以重復(fù)),每段的初始幀利用ground?truth進行初始化,在每一段上分別運行跟蹤算法,對每一段分別進行評估,最后對總體信息進行統(tǒng)計。#?假設(shè)preds和gts是兩個列表,分別存儲預(yù)測框和真實框的左上角和右下角坐標(biāo),如[(x1,?y1,?x2,?y2),?...]#?假設(shè)n是幀數(shù),m是截取段數(shù),segments是一個列表,存儲m個截取段的起始幀和結(jié)束幀,如[(s1,?e1),?(s2,?e2),?...]def?TRE(preds,?gts,?n,?m,?segments):????#?初始化一個列表,存儲各段的平均重疊率????overlap_rates?=?[]????#?遍歷每個截取段????for?s,?e?in?segments:????????#?初始化該段的總重疊率為0????????total_overlap?=?0????????#?遍歷該段的每一幀????????for?i?in?range(s,?e?+?1):????????????#?計算預(yù)測框和真實框的交集面積????????????inter_area?=?max(0,?min(preds[i][2],?gts[i][2])?-?max(preds[i][0],?gts[i][0]))?*?max(0,?min(preds[i][3],?gts[i][3])?-?max(preds[i][1],?gts[i][1]))????????????#?計算預(yù)測框和真實框的并集面積????????????union_area?=?(preds[i][2]?-?preds[i][0])?*?(preds[i][3]?-?preds[i][1])?+?(gts[i][2]?-?gts[i][0])?*?(gts[i][3]?-?gts[i][1])?-?inter_area????????????#?計算重疊率????????????overlap?=?inter_area?/?union_area????????????#?累加重疊率????????????total_overlap?+=?overlap????????#?計算并存儲該段的平均重疊率????????overlap_rate?=?total_overlap?/?(e?-?s?+?1)????????overlap_rates.append(overlap_rate)????#?返回一個列表,表示TRE曲線上的點坐標(biāo)(segments,?overlap_rates)????return?list(zip(segments,?overlap_rates))#?SRE(Spatial?Robustness?Evaluation):空間魯棒性評估。對起始幀的ground?truth進行shift或scale操作形成若干段測試序列,在每一段上分別運行跟蹤算法,對每一段分別進行評估,最后對總體信息進行統(tǒng)計。#?假設(shè)preds和gts是兩個列表,分別存儲預(yù)測框和真實框的左上角和右下角坐標(biāo),如[(x1,?y1,?x2,?y2),?...]#?假設(shè)n是幀數(shù),m是測試序列數(shù),sequences是一個列表,存儲m個測試序列的起始幀ground?truth變化情況,如[("shift",?dx1,?dy1),?("scale",?r1),?...]def?SRE(preds,?gts,?n,?m,?sequences):????#?初始化一個列表,存儲各序列的平均重疊率????overlap_rates?=?[]????#?遍歷每個測試序列????for?seq?in?sequences:????????#?初始化該序列的總重疊率為0????????total_overlap?=?0????????#?判斷該序列是shift還是scale操作????????if?seq[0]?==?"shift":????????????#?獲取平移量dx和dy????????????dx,?dy?=?seq[1],?seq[2]????????????#?對起始幀的ground?truth進行平移操作????????????gts[0]?=?(gts[0][0]?+?dx,?gts[0][1]?+?dy,?gts[0][2]?+?dx,?gts[0][3]?+?dy)????????elif?seq[0]?==?"scale":????????????#?獲取縮放比例r????????????r?=?seq[1]????????????#?對起始幀的ground?truth進行縮放操作????????????gts[0]?=?(gts[0][0]?*?r,?gts[0][1]?*?r,?gts[0][2]?*?r,?gts[0][3]?*?r)????????#?遍歷該序列的每一幀????????for?i?in?range(n):????????????#?計算預(yù)測框和真實框的交集面積????????????inter_area?=?max(0,?min(preds[i][2],?gts[i][2])?-?max(preds[i][0],?gts[i][0]))?*?max(0,?min(preds[i][3],?gts[i][3])?-?max(preds[i][1],?gts[i][1]))????????????#?計算預(yù)測框和真實框的并集面積????????????union_area?=?(preds[i][2]?-?preds[i][0])?*?(preds[i][3]?-?preds[i][1])?+?(gts[i][2]?-?gts[i][0])?*?(gts[i][3]?-?gts[i][1])?-?inter_area????????????#?計算重疊率????????????overlap?=?inter_area?/?union_area????????????#?累加重疊率????????????total_overlap?+=?overlap????????#?計算并存儲該序列的平均重疊率????????overlap_rate?=?total_overlap?/?n????????overlap_rates.append(overlap_rate)????#?返回一個列表,表示SRE曲線上的點坐標(biāo)(sequences,?overlap_rates)????return?list(zip(sequences,?overlap_rates))#?EAO(Expect?Average?Overlaprate):期望平均重疊率,綜合考慮跟蹤精度和魯棒性,通過一種方式,在一張圖中同時反映精度和魯棒性。#?假設(shè)preds和gts是兩個列表,分別存儲預(yù)測框和真實框的左上角和右下角坐標(biāo),如[(x1,?y1,?x2,?y2),?...]#?假設(shè)n是幀數(shù),SF是跟蹤算法跟丟目標(biāo)的次數(shù)def?EAO(preds,?gts,?n,?SF):????#?初始化總重疊率為0????total_overlap?=?0????#?初始化總幀數(shù)為0????total_frames?=?0????#?遍歷每一幀????for?i?in?range(n):????????#?如果該幀沒有跟丟目標(biāo),計算重疊率并累加????????if?i?not?in?SF:????????????#?計算預(yù)測框和真實框的交集面積????????????inter_area?=?max(0,?min(preds[i][2],?gts[i][2])?-?max(preds[i][0],?gts[i][0]))?*?max(0,?min(preds[i][3],?gts[i][3])?-?max(preds[i][1],?gts[i][1]))????????????#?計算預(yù)測框和真實框的并集面積????????????union_area?=?(preds[i][2]?-?preds[i][0])?*?(preds[i][3]?-?preds[i][1])?+?(gts[i][2]?-?gts[i][0])?*?(gts[i][3]?-?gts[i][1])?-?inter_area????????????#?計算重疊率????????????overlap?=?inter_area?/?union_area????????????#?累加重疊率????????????total_overlap?+=?overlap????????????#?累加幀數(shù)????????????total_frames?+=?1????#?返回期望平均重疊率,即總重疊率除以總幀數(shù)乘以(n-SF)/n,其中(n-SF)/n是沒有跟丟目標(biāo)的概率????return?total_overlap?/?total_frames?*?(n?-?len(SF))?/?n