近期在學習目標跟蹤演算法的過程中發現,cmt演算法的**實測效果非常不錯。對比之前學習過的scm之類基於稀疏表示的跟蹤演算法,cmt的魯棒性雖然不一定比之更高,但稀疏表示的方法普遍耗時很嚴重,導致其無法應用於實際工程專案,而cmt卻能兼顧實時性和魯棒性。
查閱資料發現,cmt對應的**曾經拿下了2023年wacv會議的最佳**獎。作者後來進一步完善了該演算法,並在cvpr2015上發表了相關的**,由此看來,cmt演算法確實值得研究研究。值得稱讚的是,作者已經將完整的演算法原始碼公布在了**主頁上其中包含了c++和python的全部**。由於不懂python,這幾天仔細讀了一下c++原始碼,不得不說,作者的**風格非常規範,注釋也寫得非常詳細,讀起來酣暢淋漓。另外,在此**的主頁上還有作者本人的簡介,其實他就是opentld**的作者,由此可見其程式設計功底之深厚。
結合**,理解cmt的原始碼還是不太困難的,作者在**中做了一些工程上的處理,主要體現在關鍵點的兩次匹配和融合,看起來簡單但卻很有效。下面我用visio畫出了整個演算法的流程圖,以便更加清晰地理解cmt演算法的核心思想和具體實現方法。
void cmt::processframe(mat im_gray)函式的處理流程
整個cmt演算法的全部函式都在cmt類中實現,其包括4大元件,分別封裝成4個類:tracker、matcher、consensus、fusion。另外,cmt類中還包括fast detector和brisk descriptor。
tracker.track(im_prev, im_gray, points_active, points_tracked, status);
已知第t-1幀中的有效關鍵點points_active,通過計算前向光流(第t-1幀到第t幀)和後向光流(第t幀到第t-1幀),再比較兩次得到的對應關鍵點之間的距離,距離大於閾值的關鍵點對排除掉,剩下的關鍵點即作為跟蹤到的關鍵點。
matcher.initialize(points_normalized, descs_fg, classes_fg, descs_bg, center);
將第一幀中所有前景和背景關鍵點的特徵描述構造成乙個特徵描述庫database。注意,這裡把背景關鍵點的特徵描述desc_bg儲存在前,後面在構造database_potential時,儲存前景關鍵點索引indices_potential時需要再加上背景關鍵點的總個數num_bg_points。
matcher.matchglobal(keypoints, descriptors, points_matched_global, classes_matched_global);
將當前幀中檢測器得到的所有關鍵點的特徵描述與database進行knnmatch匹配(k=2),每個特徵描述子在database尋找最佳的2個匹配結果,將符合以下條件之一的匹配關鍵點排除:
匹配到了背景關鍵點;
最佳匹配的匹配距離大於閾值0.25;
最佳匹配與次佳匹配的匹配距離之比大於閾值0.8(比率越小,最佳匹配越優於次佳匹配)
matcher.matchlocal(keypoints, descriptors, center, scale, rotation,points_matched_local,
classes_matched_local);
比較當前幀中檢測得到的每乙個關鍵點與第一幀中經過旋轉和尺度變換之後的所有前景關鍵點之間的歐氏距離,小於閾值20則該前景關鍵點是有可能匹配上的,將這些可能的前景關鍵點構造成乙個特徵描述庫database_potential;
將當前幀中檢測得到的每乙個關鍵點的特徵描述與database_potential進行knnmatch匹配,每個特徵描述子在database_potential尋找最佳的2個匹配結果,排除不穩定的關鍵點的策略與matchglobal類似。
consensus.initialize(points_normalized);
計算並儲存第一幀中所有歸一化前景關鍵點points_normalized與x軸的夾角(反正切)angles_pairwise以及關鍵點兩兩之間的距離distances_pairwise。
consensus.estimatescalerotation(points_fused, classes_fused, scale, rotation);
計算matchglobal匹配後融合得到的關鍵點的夾角以及關鍵點兩兩之間的距離,並與對應的points_normalized關鍵點的夾角求差、距離求商,再分別取平均值,評估出當前幀中目標的尺度因子scale和旋轉角度rotation。
consensus.findconsensus(points_fused, classes_fused, scale, rotation, center,
points_inlier, classes_inlier);
計算matchglobal匹配後融合得到的關鍵點的投票,即每乙個關鍵點與對應的經過尺度和旋轉變換後的points_normalized關鍵點之間構成的向量;
計算兩兩投票(1中的向量)之間的距離,按距離的大小進行公升序排列;
聚類並得到結果中最大的類;(當兩個類之間的距離小於閾值,合併這兩個類)
將此類中的所有關鍵點作為points_inlier;
將所有points_inlier關鍵點的座標均值作為目標中心點center。
fusion.preferfirst(points_tracked, classes_tracked, points_matched_global, classes_matched_global,
points_fused, classes_fused);
將光流跟蹤到的關鍵點與matchglobal匹配到的關鍵點融合,得到的關鍵點用於評估目標的旋轉角度和尺度,以及投票尋找目標中心位置。
fusion.preferfirst(points_matched_local, classes_matched_local, points_inlier, classes_inlier,
points_active, classes_active);
將matchlocal匹配到的關鍵點與inliers關鍵點融合,得到最終有效的目標關鍵點points_active,這些關鍵點用於下一幀的跟蹤。
————————————————————————————————
main函式中的**與演算法本身無關,在此就不總結了,原始碼中都有詳細的注釋幫助讀者理解。
關於**的細節和**的理解,下次再寫。
CMT跟蹤演算法學習筆記
近期在學習目標跟蹤演算法的過程中發現,cmt演算法的 實測效果非常不錯。對比之前學習過的scm之類基於稀疏表示的跟蹤演算法,cmt的魯棒性雖然不一定比之更高,但稀疏表示的方法普遍耗時很嚴重,導致其無法應用於實際工程專案,而cmt卻能兼顧實時性和魯棒性。查閱資料發現,cmt對應的 曾經拿下了2014年...
CVPR2015跟蹤11 CMT跟蹤演算法分析
cmt跟蹤演算法分析 clustering of static adaptive correspondences for deformable object tracking 基本原理 對於物體的跟蹤,基本的思路就是能夠不斷檢測到物體的特徵,從而不斷地得到物體的位置實現跟蹤。常見的有三種方法 第一種...
演算法學習筆記(一)
mapreduce 分治演算法的應用 是 google 大資料處理的三駕馬車之一,另外兩個是 gfs 和 bigtable。它在倒排索引 pagerank 計算 網頁分析等搜尋引擎相關的技術中都有大量的應用。儘管開發乙個 mapreduce 看起來很高深,感覺遙不可及。實際上,萬變不離其宗,它的本質...