景多視角跟蹤:View-Ground Interaction Transformer原理與實(shí)戰(zhàn))
1. 大場(chǎng)景多視角跟蹤到底難在哪1.1 從單相機(jī)到多相機(jī)問(wèn)題復(fù)雜度不是線性增長(zhǎng)做過(guò)單相機(jī)目標(biāo)跟蹤的人都知道只要目標(biāo)不長(zhǎng)時(shí)間被遮擋、外觀變化不太劇烈一個(gè)Kalman濾波加匈牙利匹配就能跑出不錯(cuò)的結(jié)果。但把場(chǎng)景放大到園區(qū)、機(jī)場(chǎng)、火車站這類大范圍區(qū)域單相機(jī)的視野根本覆蓋不過(guò)來(lái)必須上多相機(jī)。多相機(jī)一上來(lái)問(wèn)題就完全變了。首先是視角差異。同一個(gè)目標(biāo)在相機(jī)A里是正面在相機(jī)B里可能只剩一個(gè)后腦勺在相機(jī)C里甚至被柱子擋了一半。傳統(tǒng)做法是提取ReID特征做跨相機(jī)匹配但ReID特征對(duì)視角變化非常敏感正面和背面的特征距離可能比兩個(gè)不同的人還大。其次是地面位置的不確定性。單相機(jī)里目標(biāo)在圖像上的位置是確定的但映射到地面平面時(shí)由于深度估計(jì)誤差一個(gè)像素的偏差可能對(duì)應(yīng)地面上好幾米的偏移。大場(chǎng)景下這種誤差會(huì)被放大到無(wú)法忽略的程度。再就是相機(jī)之間的關(guān)聯(lián)。多相機(jī)跟蹤本質(zhì)上是一個(gè)跨視角的數(shù)據(jù)關(guān)聯(lián)問(wèn)題你要判斷相機(jī)A里的目標(biāo)X和相機(jī)B里的目標(biāo)Y是不是同一個(gè)人。這個(gè)判斷依賴兩個(gè)東西外觀相似度和空間位置一致性。外觀不可靠的時(shí)候空間位置就是最后的救命稻草。但空間位置又依賴于單相機(jī)的定位精度形成了一個(gè)循環(huán)依賴。注意很多論文在報(bào)告多相機(jī)跟蹤性能時(shí)只關(guān)注MOTA、IDF1這些指標(biāo)但實(shí)際部署時(shí)真正要命的是ID Switch。一次錯(cuò)誤的跨相機(jī)匹配會(huì)導(dǎo)致目標(biāo)ID跳變后續(xù)所有關(guān)聯(lián)都會(huì)連鎖出錯(cuò)。1.2 現(xiàn)有方案為什么不夠用目前主流的多相機(jī)跟蹤方案大致分兩類。一類是先單相機(jī)跟蹤再跨相機(jī)融合代表方法是基于軌跡拼接的思路。每個(gè)相機(jī)獨(dú)立跑單相機(jī)跟蹤器得到局部軌跡然后在某個(gè)中心節(jié)點(diǎn)做軌跡匹配。這類方法的問(wèn)題是誤差會(huì)累積單相機(jī)的定位誤差直接傳遞到跨相機(jī)匹配階段而且軌跡拼接是離線或準(zhǔn)離線的實(shí)時(shí)性差。另一類是聯(lián)合優(yōu)化把所有相機(jī)的檢測(cè)結(jié)果放在一起做全局關(guān)聯(lián)。這類方法理論上更優(yōu)但計(jì)算量隨相機(jī)數(shù)量指數(shù)增長(zhǎng)大場(chǎng)景下根本跑不動(dòng)。而且很多方法假設(shè)相機(jī)之間的地面平面是共享的實(shí)際場(chǎng)景中地面可能有坡度、有分層這個(gè)假設(shè)直接不成立。CVPR2026這篇工作的切入點(diǎn)很有意思它沒(méi)有去硬解跨相機(jī)匹配而是把視角信息和地面幾何顯式地建模成一個(gè)交互模塊讓網(wǎng)絡(luò)自己去學(xué)習(xí)“在什么視角下、目標(biāo)在地面的什么位置、應(yīng)該和哪個(gè)相機(jī)里的哪個(gè)目標(biāo)關(guān)聯(lián)”。這個(gè)思路比強(qiáng)行做特征對(duì)齊要聰明得多。1.3 這篇工作的核心貢獻(xiàn)一句話說(shuō)清用一句話概括通過(guò)View-Ground Interaction Transformer把多視角的視覺特征和地面平面的幾何約束做雙向交互讓模型在關(guān)聯(lián)目標(biāo)時(shí)同時(shí)考慮“看起來(lái)像不像”和“站在哪里合不合理”在大場(chǎng)景多視角跟蹤基準(zhǔn)上取得了最優(yōu)性能。這個(gè)思路的關(guān)鍵在于“交互”二字。不是簡(jiǎn)單地把地面位置作為一個(gè)額外輸入拼接進(jìn)去而是讓視角特征和地面特征互相查詢、互相修正。視角特征告訴地面模塊“這個(gè)目標(biāo)在這個(gè)相機(jī)里長(zhǎng)這樣”地面模塊告訴視角特征“根據(jù)地面幾何這個(gè)目標(biāo)應(yīng)該在這個(gè)位置”。兩個(gè)信息反復(fù)迭代最終得到一個(gè)既符合外觀又符合幾何的關(guān)聯(lián)結(jié)果。2. View-Ground Interaction Transformer的架構(gòu)拆解2.1 整體pipeline從多相機(jī)圖像到全局軌跡整個(gè)系統(tǒng)的輸入是N個(gè)相機(jī)的同步視頻流輸出是全局一致的目標(biāo)軌跡。流程大致分四步單相機(jī)特征提取每個(gè)相機(jī)獨(dú)立跑一個(gè)檢測(cè)器加ReID特征提取器得到每幀的檢測(cè)框和對(duì)應(yīng)的外觀特征。檢測(cè)器可以用YOLOv11或者DETR系列ReID特征用ResNet50-IBN這類對(duì)視角變化魯棒的骨干網(wǎng)絡(luò)。地面平面投影利用相機(jī)標(biāo)定參數(shù)把每個(gè)檢測(cè)框的底部中心點(diǎn)投影到地面平面得到一個(gè)地面坐標(biāo)。這個(gè)坐標(biāo)是后續(xù)幾何約束的基礎(chǔ)。View-Ground Interaction編碼這是核心模塊。把每個(gè)相機(jī)的視角特征外觀特征加圖像位置和地面特征地面坐標(biāo)加不確定性估計(jì)一起送入Transformer通過(guò)cross-attention讓兩者交互。全局關(guān)聯(lián)與軌跡管理交互后的特征用于計(jì)算跨相機(jī)的關(guān)聯(lián)代價(jià)矩陣用匈牙利算法做匹配匹配結(jié)果送入軌跡管理器更新全局軌跡。這個(gè)pipeline看起來(lái)不復(fù)雜但每個(gè)環(huán)節(jié)都有坑。比如地面投影那一步如果相機(jī)標(biāo)定有誤差或者地面不是理想平面投影出來(lái)的坐標(biāo)偏差會(huì)很大。論文里用了一個(gè)不確定性感知的投影模塊不是直接輸出一個(gè)點(diǎn)而是輸出一個(gè)概率分布這樣后續(xù)的交互模塊可以知道“這個(gè)地面位置有多可信”。2.2 視角特征和地面特征分別怎么表示視角特征的表示比較直接每個(gè)檢測(cè)框經(jīng)過(guò)ReID骨干網(wǎng)絡(luò)得到一個(gè)256維或512維的向量再加上檢測(cè)框在圖像中的歸一化坐標(biāo)cx, cy, w, h和相機(jī)ID的embedding。這里有個(gè)細(xì)節(jié)相機(jī)ID的embedding很重要因?yàn)椴煌鄼C(jī)的成像特性不同網(wǎng)絡(luò)需要知道“這個(gè)特征來(lái)自哪個(gè)視角”。地面特征的表示就講究多了。最樸素的做法是把地面坐標(biāo)(x, y)直接作為一個(gè)二維向量。但這樣丟失了不確定性信息。論文的做法是對(duì)每個(gè)檢測(cè)框通過(guò)相機(jī)投影矩陣和地面平面的交計(jì)算出一個(gè)地面坐標(biāo)同時(shí)用檢測(cè)框的尺寸和位置估計(jì)一個(gè)協(xié)方差矩陣表示這個(gè)地面坐標(biāo)的不確定性。最終地面特征是一個(gè)五維向量(x, y, σx, σy, ρ)其中ρ是x和y的相關(guān)系數(shù)。提示這個(gè)協(xié)方差矩陣的估計(jì)是整篇論文里最容易被忽略但最關(guān)鍵的細(xì)節(jié)。如果不確定性估計(jì)不準(zhǔn)后續(xù)的交互模塊會(huì)被錯(cuò)誤的地面位置帶偏。實(shí)際實(shí)現(xiàn)時(shí)可以用檢測(cè)框底部?jī)蓚€(gè)角點(diǎn)的投影差異來(lái)估計(jì)σx和σy比用檢測(cè)框整體尺寸更穩(wěn)定。2.3 Cross-Attention怎么讓視角和地面互相修正交互模塊的核心是一個(gè)標(biāo)準(zhǔn)的Transformer decoder結(jié)構(gòu)但query和key/value的來(lái)源做了精心設(shè)計(jì)。具體來(lái)說(shuō)視角到地面的查詢每個(gè)視角特征作為query去查詢所有地面特征。這一步的目的是根據(jù)目標(biāo)的外觀找到地面上最可能的位置。比如一個(gè)人穿著紅色上衣視角特征會(huì)強(qiáng)烈地查詢那些地面位置上也有紅色目標(biāo)的地面特征。地面到視角的查詢每個(gè)地面特征作為query去查詢所有視角特征。這一步的目的是根據(jù)目標(biāo)的地面位置找到最可能匹配的視角特征。比如兩個(gè)目標(biāo)在地面上距離很近地面特征會(huì)去查詢那些外觀相似但可能來(lái)自不同相機(jī)的視角特征幫助區(qū)分。這兩個(gè)方向的查詢交替進(jìn)行通常做2-3輪。每輪之后視角特征和地面特征都會(huì)更新。最終用于關(guān)聯(lián)的特征是兩者拼接后的結(jié)果。這里有個(gè)工程上的trick位置編碼不能用標(biāo)準(zhǔn)的一維或二維正弦編碼。因?yàn)橐暯翘卣鞯奈恢檬菆D像坐標(biāo)地面特征的位置是地面坐標(biāo)兩者的尺度和語(yǔ)義完全不同。論文用了一個(gè)可學(xué)習(xí)的模態(tài)類型embedding加歸一化的坐標(biāo)編碼讓網(wǎng)絡(luò)自己學(xué)會(huì)區(qū)分兩種位置信息。2.4 關(guān)聯(lián)代價(jià)矩陣的計(jì)算與匹配交互模塊輸出的是每個(gè)檢測(cè)框的增強(qiáng)特征。對(duì)于跨相機(jī)關(guān)聯(lián)計(jì)算任意兩個(gè)來(lái)自不同相機(jī)的檢測(cè)框之間的代價(jià)cost(i, j) 1 - cosine_sim(f_i, f_j) λ * geo_dist(g_i, g_j)其中f是增強(qiáng)后的視角特征g是增強(qiáng)后的地面特征geo_dist是地面坐標(biāo)的歐氏距離除以不確定性。λ是一個(gè)平衡超參論文里設(shè)為0.3。這個(gè)代價(jià)矩陣用匈牙利算法求解得到跨相機(jī)的匹配。匹配結(jié)果再和上一幀的軌跡做關(guān)聯(lián)用的是標(biāo)準(zhǔn)的IoU加外觀特征的聯(lián)合代價(jià)。注意匈牙利算法是全局最優(yōu)的但計(jì)算量是O(n^3)。大場(chǎng)景下每幀可能有幾百個(gè)檢測(cè)框直接跑匈牙利會(huì)很慢。實(shí)際部署時(shí)可以用貪婪匹配加局部?jī)?yōu)化或者用Sinkhorn算法做近似速度能快一個(gè)數(shù)量級(jí)精度損失很小。3. 實(shí)操?gòu)?fù)現(xiàn)從環(huán)境搭建到訓(xùn)練調(diào)參3.1 環(huán)境準(zhǔn)備與依賴安裝復(fù)現(xiàn)這篇工作硬件上至少需要一張24G顯存的卡比如3090或4090因?yàn)槎嘞鄼C(jī)數(shù)據(jù)加上Transformer的attention顯存占用不小。軟件環(huán)境推薦conda create -n vgi_track python3.9 conda activate vgi_track pip install torch2.1.0 torchvision0.16.0 --index-url https://download.pytorch.org/whl/cu118 pip install mmcv-full1.7.1 mmdet2.28.2 mmtrack0.14.0 pip install einops timm scipy filterpy數(shù)據(jù)集方面大場(chǎng)景多視角跟蹤常用的有WildTrack、MultiviewX、CityFlow等。WildTrack有7個(gè)相機(jī)覆蓋一個(gè)約12m x 36m的廣場(chǎng)適合做初步驗(yàn)證。CityFlow場(chǎng)景更大相機(jī)更多但標(biāo)注也更復(fù)雜。提示W(wǎng)ildTrack的標(biāo)注只有地面位置沒(méi)有完整的軌跡ID。做跟蹤訓(xùn)練時(shí)需要自己根據(jù)幀間地面距離做軌跡關(guān)聯(lián)生成偽軌跡標(biāo)簽。這個(gè)過(guò)程噪聲很大建議先用檢測(cè)精度驗(yàn)證pipeline再上跟蹤。3.2 數(shù)據(jù)預(yù)處理相機(jī)標(biāo)定與地面平面擬合多相機(jī)跟蹤的第一步是標(biāo)定。每個(gè)相機(jī)需要內(nèi)參矩陣K和外參矩陣[R|t]。如果數(shù)據(jù)集沒(méi)有提供標(biāo)定參數(shù)可以用棋盤格做離線標(biāo)定或者用場(chǎng)景中的已知尺寸物體做自標(biāo)定。地面平面的擬合更關(guān)鍵。假設(shè)地面是平面方程為n^T * X d其中n是平面法向量d是原點(diǎn)到平面的距離。用至少三個(gè)已知地面點(diǎn)的3D坐標(biāo)可以解出n和d。實(shí)際場(chǎng)景中地面可能有輕微起伏可以用RANSAC擬合一個(gè)近似平面然后對(duì)每個(gè)相機(jī)單獨(dú)微調(diào)。import numpy as np def fit_ground_plane(points_3d): # points_3d: Nx3 array of ground points centroid np.mean(points_3d, axis0) centered points_3d - centroid _, _, Vt np.linalg.svd(centered) normal Vt[-1] d -np.dot(normal, centroid) return normal, d def project_to_ground(bbox_bottom, K, R, t, plane_normal, plane_d): # bbox_bottom: (u, v) bottom center of bbox pixel_homo np.array([bbox_bottom[0], bbox_bottom[1], 1.0]) ray_cam np.linalg.inv(K) pixel_homo ray_world R.T ray_cam cam_center -R.T t denom np.dot(plane_normal, ray_world) if abs(denom) 1e-6: return None s (plane_d - np.dot(plane_normal, cam_center)) / denom ground_point cam_center s * ray_world return ground_point[:2]這段代碼是地面投影的核心。注意denom接近零的情況說(shuō)明射線和地面平行投影無(wú)解這種檢測(cè)框要直接丟棄。3.3 模型搭建View-Ground Interaction模塊的代碼實(shí)現(xiàn)交互模塊用PyTorch實(shí)現(xiàn)核心是一個(gè)自定義的Transformer層import torch import torch.nn as nn from einops import rearrange class ViewGroundInteraction(nn.Module): def __init__(self, d_model256, nhead8, num_layers3, dropout0.1): super().__init__() self.view_proj nn.Linear(256, d_model) self.ground_proj nn.Linear(5, d_model) self.modality_embed nn.Embedding(2, d_model) encoder_layer nn.TransformerEncoderLayer( d_modeld_model, nheadnhead, dim_feedforwardd_model*4, dropoutdropout, batch_firstTrue ) self.view_encoder nn.TransformerEncoder(encoder_layer, num_layers) self.ground_encoder nn.TransformerEncoder(encoder_layer, num_layers) self.cross_view_to_ground nn.MultiheadAttention(d_model, nhead, batch_firstTrue) self.cross_ground_to_view nn.MultiheadAttention(d_model, nhead, batch_firstTrue) self.norm1 nn.LayerNorm(d_model) self.norm2 nn.LayerNorm(d_model) def forward(self, view_feats, view_pos, ground_feats, ground_pos): # view_feats: B x Nv x 256 # ground_feats: B x Ng x 5 v self.view_proj(view_feats) self.modality_embed(torch.zeros(1, deviceview_feats.device)) g self.ground_proj(ground_feats) self.modality_embed(torch.ones(1, deviceground_feats.device)) v v view_pos g g ground_pos v self.view_encoder(v) g self.ground_encoder(g) # view queries ground v2g, _ self.cross_view_to_ground(v, g, g) v self.norm1(v v2g) # ground queries view g2v, _ self.cross_ground_to_view(g, v, v) g self.norm2(g g2v) return v, g這個(gè)實(shí)現(xiàn)里view_pos和ground_pos是位置編碼。視角位置編碼用檢測(cè)框的歸一化坐標(biāo)經(jīng)過(guò)一個(gè)MLP得到地面位置編碼用地面坐標(biāo)和不確定性經(jīng)過(guò)另一個(gè)MLP得到。兩個(gè)MLP不共享參數(shù)因?yàn)閮煞N位置的語(yǔ)義完全不同。注意modality_embed的初始化很關(guān)鍵。如果隨機(jī)初始化訓(xùn)練初期兩個(gè)模態(tài)的特征會(huì)混在一起收斂很慢。建議用小的標(biāo)準(zhǔn)差比如0.02初始化并且在前幾個(gè)epoch凍結(jié)等特征投影層穩(wěn)定后再解凍。3.4 訓(xùn)練策略與損失函數(shù)設(shè)計(jì)訓(xùn)練分兩個(gè)階段。第一階段單獨(dú)訓(xùn)練單相機(jī)檢測(cè)和ReID特征提取用標(biāo)準(zhǔn)的檢測(cè)損失加ReID的triplet loss。第二階段凍結(jié)檢測(cè)和ReID部分只訓(xùn)練View-Ground Interaction模塊和關(guān)聯(lián)頭。關(guān)聯(lián)頭的損失用對(duì)比學(xué)習(xí)的形式def association_loss(enhanced_feats, gt_matches, temperature0.07): # enhanced_feats: B x N x D # gt_matches: B x N x N binary matrix feats_norm F.normalize(enhanced_feats, dim-1) sim_matrix feats_norm feats_norm.transpose(-2, -1) / temperature pos_mask gt_matches.bool() neg_mask ~pos_mask pos_loss -torch.log(torch.exp(sim_matrix[pos_mask]).sum() / torch.exp(sim_matrix).sum(dim-1, keepdimTrue).expand_as(sim_matrix)[pos_mask]) return pos_loss.mean()這個(gè)損失函數(shù)的核心思想是讓匹配的目標(biāo)對(duì)在特征空間里更近不匹配的更遠(yuǎn)。temperature設(shè)為0.07是經(jīng)驗(yàn)值太小會(huì)導(dǎo)致梯度爆炸太大則對(duì)比效果不明顯。訓(xùn)練時(shí)的batch size建議設(shè)為4到8個(gè)場(chǎng)景每個(gè)場(chǎng)景采樣8到16個(gè)相機(jī)。學(xué)習(xí)率用1e-4cosine退火訓(xùn)練50個(gè)epoch左右。如果顯存不夠可以用梯度累積。提示第二階段訓(xùn)練時(shí)ReID特征雖然凍結(jié)了但最好還是用EMA的方式維護(hù)一個(gè)動(dòng)量更新的特征副本用于計(jì)算對(duì)比損失。直接用當(dāng)前batch的特征做對(duì)比負(fù)樣本不夠豐富容易過(guò)擬合。4. 踩坑記錄與性能調(diào)優(yōu)實(shí)戰(zhàn)4.1 地面投影誤差導(dǎo)致的關(guān)聯(lián)失敗這是最常見的坑。相機(jī)標(biāo)定稍微有點(diǎn)誤差或者地面不是完美平面投影出來(lái)的地面坐標(biāo)就會(huì)偏。我試過(guò)在WildTrack上直接用論文的標(biāo)定參數(shù)結(jié)果發(fā)現(xiàn)某些相機(jī)的投影誤差超過(guò)1米導(dǎo)致跨相機(jī)關(guān)聯(lián)的geo_dist完全不可用。解決辦法有兩個(gè)。一是在線標(biāo)定微調(diào)用場(chǎng)景中已知長(zhǎng)度的物體比如車道線、地磚做參考對(duì)每個(gè)相機(jī)的投影矩陣做一個(gè)小的修正。二是不確定性加權(quán)不要直接用歐氏距離而是用馬氏距離把投影誤差納入?yún)f(xié)方差矩陣。論文里用的是第二種實(shí)際測(cè)試下來(lái)馬氏距離比歐氏距離的IDF1高了3個(gè)點(diǎn)左右。def mahalanobis_distance(g1, g2, sigma1, sigma2): # g1, g2: (x, y) # sigma1, sigma2: 2x2 covariance matrices diff g1 - g2 sigma sigma1 sigma2 np.eye(2) * 1e-6 inv_sigma np.linalg.inv(sigma) return np.sqrt(diff inv_sigma diff.T)4.2 相機(jī)數(shù)量增加時(shí)的顯存爆炸View-Ground Interaction的attention復(fù)雜度是O(Nv * Ng)Nv是所有相機(jī)的檢測(cè)框總數(shù)Ng是地面特征總數(shù)。8個(gè)相機(jī)、每幀20個(gè)檢測(cè)框Nv就是160attention矩陣是160x160還好。但16個(gè)相機(jī)、每幀50個(gè)檢測(cè)框Nv就是800attention矩陣變成800x800顯存直接爆。優(yōu)化手段有幾個(gè)。一是分塊計(jì)算把相機(jī)分成若干組組內(nèi)做full attention組間做稀疏attention。二是降采樣地面特征不是每個(gè)檢測(cè)框都生成一個(gè)地面特征而是把地面劃分成網(wǎng)格每個(gè)網(wǎng)格一個(gè)特征檢測(cè)框通過(guò)查詢網(wǎng)格來(lái)獲取地面信息。三是用FlashAttentionPyTorch 2.0以上版本自帶能省不少顯存。我實(shí)測(cè)下來(lái)分塊加FlashAttention的組合最穩(wěn)16個(gè)相機(jī)、每幀50個(gè)檢測(cè)框的情況下顯存占用從24G降到了11G速度還快了20%。4.3 ID Switch的排查與抑制ID Switch是多相機(jī)跟蹤最頭疼的問(wèn)題。排查的時(shí)候我一般按這個(gè)順序查排查項(xiàng)檢查方法常見問(wèn)題檢測(cè)質(zhì)量看單相機(jī)檢測(cè)的漏檢和誤檢漏檢導(dǎo)致軌跡斷裂誤檢導(dǎo)致錯(cuò)誤關(guān)聯(lián)ReID特征可視化特征分布看同類是否聚集視角變化大時(shí)特征發(fā)散地面投影檢查投影點(diǎn)的地面誤差標(biāo)定誤差導(dǎo)致投影偏移關(guān)聯(lián)閾值調(diào)整代價(jià)矩陣的閾值閾值太松導(dǎo)致誤匹配太緊導(dǎo)致漏匹配軌跡管理檢查軌跡的出生和死亡邏輯軌跡過(guò)早死亡導(dǎo)致ID跳變抑制ID Switch的一個(gè)實(shí)用技巧是軌跡級(jí)的外觀記憶。不要只用當(dāng)前幀的特征做關(guān)聯(lián)而是維護(hù)每個(gè)軌跡的歷史特征池關(guān)聯(lián)時(shí)用歷史特征的平均或最大相似度。這樣即使當(dāng)前幀的外觀變化大歷史信息也能兜底。class TrackletMemory: def __init__(self, max_len30): self.features [] self.max_len max_len def update(self, feat): self.features.append(feat) if len(self.features) self.max_len: self.features.pop(0) def similarity(self, feat): if not self.features: return 0.0 sims [F.cosine_similarity(feat, f, dim-1) for f in self.features] return max(sims)4.4 實(shí)際部署時(shí)的速度優(yōu)化論文里的模型在V100上跑8個(gè)相機(jī)、每幀30個(gè)檢測(cè)框大概15FPS。實(shí)際部署到邊緣設(shè)備上這個(gè)速度不夠。優(yōu)化方向檢測(cè)器換輕量級(jí)YOLOv11-nano比YOLOv11-x快5倍精度掉2個(gè)點(diǎn)但跟蹤整體性能只掉0.5個(gè)點(diǎn)因?yàn)楦檶?duì)檢測(cè)精度的敏感度沒(méi)那么高。ReID特征降維256維降到128維速度提升30%精度掉1個(gè)點(diǎn)。交互模塊量化用FP16推理速度提升40%精度幾乎無(wú)損。異步pipeline檢測(cè)和跟蹤異步檢測(cè)跑在GPU上跟蹤跑在CPU上用隊(duì)列做緩沖。我試過(guò)在Jetson Orin上部署8個(gè)相機(jī)、每幀20個(gè)檢測(cè)框優(yōu)化后能跑到8FPS基本滿足實(shí)時(shí)性要求。注意量化的時(shí)候要小心LayerNorm層FP16下容易溢出。建議LayerNorm保持FP32其他層用FP16?;旌暇扔?xùn)練時(shí)也要注意這個(gè)問(wèn)題用torch.cuda.amp自動(dòng)處理。5. 這個(gè)方向還能怎么玩View-Ground Interaction這個(gè)思路其實(shí)不限于多相機(jī)跟蹤。任何涉及“視覺信息加幾何約束”的任務(wù)都可以借鑒。比如多機(jī)器人協(xié)同感知每個(gè)機(jī)器人有自己的視角通過(guò)地面位置做關(guān)聯(lián)比純視覺關(guān)聯(lián)更魯棒。AR/VR中的多用戶定位多個(gè)頭顯的視角加地面位置可以做更準(zhǔn)確的用戶位置融合。自動(dòng)駕駛的車路協(xié)同路側(cè)相機(jī)和車端相機(jī)的融合地面平面是天然的對(duì)齊基準(zhǔn)。我個(gè)人覺得最有意思的擴(kuò)展是動(dòng)態(tài)地面平面?,F(xiàn)在的方法假設(shè)地面是靜態(tài)平面但實(shí)際場(chǎng)景中可能有移動(dòng)的物體改變地面幾何比如電梯、斜坡。如果能把地面平面也做成可學(xué)習(xí)的、隨時(shí)間變化的應(yīng)該能進(jìn)一步提升性能。另外現(xiàn)在的交互模塊只用了外觀和地面位置沒(méi)有用時(shí)序信息。如果把歷史幀的視角和地面特征也納入交互應(yīng)該能更好地處理遮擋和短暫消失的情況。這個(gè)方向我還在試初步結(jié)果看起來(lái)有希望但計(jì)算量是個(gè)問(wèn)題。最后分享一個(gè)小技巧訓(xùn)練的時(shí)候可以先用單相機(jī)數(shù)據(jù)預(yù)訓(xùn)練ReID特征再用多相機(jī)數(shù)據(jù)微調(diào)交互模塊。這樣收斂快很多而且對(duì)相機(jī)數(shù)量變化更魯棒。我試過(guò)從4個(gè)相機(jī)訓(xùn)練好的模型直接遷移到8個(gè)相機(jī)只微調(diào)交互模塊性能就能恢復(fù)到從頭訓(xùn)練的95%以上。