定目標(biāo)的關(guān)鍵技術(shù))
搞智能駕駛視覺感知的人對(duì)這樣的場景應(yīng)該不陌生模型明明框到了前方的車但框在連續(xù)幾幀里左右跳類別一會(huì)兒是轎車一會(huì)兒是貨車框的中心位置漂移得離譜。你要是敢把這個(gè)結(jié)果直接丟給AEB或者ACC去用車在高速上能給你來一腳莫名其妙的剎車。模型輸出的是“框”是單幀的、帶噪聲的、彼此獨(dú)立的“檢測假設(shè)”而下游功能要的是“目標(biāo)”——是連續(xù)、穩(wěn)定、帶著運(yùn)動(dòng)狀態(tài)和置信度評(píng)價(jià)的對(duì)象。這中間缺的那一大塊就是視覺后處理。這篇是視覺障礙物后處理系列的第五篇聊的主題是視覺后處理與輔助駕駛功能。前面幾篇分別講了檢測輸入、前后處理鏈路、以及障礙物基本信息處理這篇更側(cè)重一個(gè)層面后處理好的障礙物目標(biāo)到底怎么跟FCW、AEB、ACC這些輔助駕駛功能銜接后處理結(jié)果的質(zhì)量會(huì)怎么影響功能表現(xiàn)以及實(shí)操過程中那些文檔里不會(huì)告訴你的坑。適合做感知后處理、融合、功能算法或者系統(tǒng)集成的人參考也適合想搞清楚“感知和功能之間到底發(fā)生了什么”的入門者。1. 先弄清楚后處理在整條鏈路里到底要干什么1.1 從“框”到“目標(biāo)”后處理解決的不是檢測而是信任問題很多剛接觸這個(gè)領(lǐng)域的人覺得后處理不就是把檢測結(jié)果的置信度過濾一下、把重疊框去掉嗎如果只做這兩件事那叫“檢測結(jié)果清理”不叫后處理。真正的視覺后處理任務(wù)是把單幀的檢測假設(shè)變成時(shí)間上連續(xù)、物理上可信、語義上穩(wěn)定的目標(biāo)級(jí)輸出。換句話說它解決的是“信任”問題——讓下游功能愿意相信這個(gè)目標(biāo)存在、位置可信、狀態(tài)可預(yù)測。你看檢測模型的輸出格式就知道了每幀給出一堆結(jié)構(gòu)化數(shù)據(jù)包含類別標(biāo)簽、框坐標(biāo)、置信度分?jǐn)?shù)。這些數(shù)據(jù)之間沒有任何關(guān)聯(lián)前一幀的框和后一幀的框誰是誰、哪里去了模型不關(guān)心。而后處理恰恰要解決這個(gè)問題幀與幀之間的目標(biāo)如何關(guān)聯(lián)目標(biāo)被遮擋了怎么辦目標(biāo)的速度和加速度怎么估算目標(biāo)類別閃變了怎么平滑這些如果不處理ACC跟車時(shí)前方車輛速度稍微變一下感知速度就跳一下跟車就會(huì)一沖一沖的坐在車?yán)锏娜朔址昼姇炣?。所以整體鏈路是這樣的檢測模型感知→ 障礙物后處理目標(biāo)化→ 決策規(guī)劃功能決策→ 執(zhí)行器控制。后處理是感知的“收尾者”也是功能的“接口者”。它的質(zhì)量好不好用戶體感最直觀的兩個(gè)指標(biāo)就是誤報(bào)率和漏報(bào)率。誤報(bào)率高AEB天天制造驚險(xiǎn)瞬間漏報(bào)率高FCW該響不響功能就成了擺設(shè)。1.2 為什么模型輸出不能直接進(jìn)功能一個(gè)例子看清楚我舉個(gè)特別典型的例子。某次我調(diào)一個(gè)前向的FCW功能最初直接把YOLO系檢測器的輸出拿來計(jì)算TTC碰撞時(shí)間。正常跟車時(shí)前方目標(biāo)相對(duì)速度大約20km/h相對(duì)距離30米TTC應(yīng)該穩(wěn)定在5秒左右。但由于檢測框的寬度抖動(dòng)比較厲害目標(biāo)在圖像上的尺寸一會(huì)兒大一會(huì)兒小換算出的相對(duì)距離就是33米、28米、35米這樣來回波動(dòng)TTC也跟著從4秒跳到7秒FCW的觸發(fā)邏輯被搞得疲于奔命該報(bào)警的時(shí)候沒報(bào)不該報(bào)警的時(shí)候響個(gè)不停。檢測框抖動(dòng)是必然的神經(jīng)網(wǎng)絡(luò)對(duì)目標(biāo)邊緣的回歸有噪聲光照變化、目標(biāo)部分遮擋、車輛顛簸都會(huì)放大這種噪聲。而后處理的一個(gè)重要工作就是對(duì)這些有噪聲的輸入做時(shí)間和空間上的濾波讓輸出的目標(biāo)位置、尺寸、速度有“慣性感”。這不是簡單做一下平均而是需要建立目標(biāo)狀態(tài)估計(jì)模型用歷史信息和當(dāng)前觀測融合還得考慮目標(biāo)的運(yùn)動(dòng)模型是勻速還是勻加速、傳感器的觀測噪聲有多大。這些都是后處理的核心內(nèi)容。2. 視覺后處理的核心細(xì)節(jié)從框到軌跡的關(guān)鍵技術(shù)2.1 目標(biāo)關(guān)聯(lián)怎么判斷這兩幀的框是同一個(gè)人后處理的第一步也是最基礎(chǔ)的一步是幀間目標(biāo)關(guān)聯(lián)。上一幀檢測到前方第1輛車、第2輛車這一幀又檢測到一輛車你得知道這一幀的這輛車是不是上一幀的1號(hào)車這個(gè)問題解決不好后面全是空中樓閣。常用的關(guān)聯(lián)方法有兩大類一類是基于位置重疊的比如IoU交并比一類是基于特征相似度的比如外觀特征、尺寸特征。但在純視覺后處理里最主流、性價(jià)比最高的做法是“預(yù)測框與檢測框的IoU匹配”。你先用上一幀目標(biāo)的位置和速度預(yù)測出這一幀它大概在哪然后用預(yù)測框和一幀檢測框算IoU如果IoU大于某個(gè)閾值就可以認(rèn)為是同一個(gè)目標(biāo)。實(shí)際操作中我用的是匈牙利算法來做全局最優(yōu)匹配。先構(gòu)建一個(gè)代價(jià)矩陣矩陣元素是預(yù)測框和檢測框的IoU或距離的負(fù)值然后通過匈牙利算法找到整體代價(jià)最小的匹配方案。核心經(jīng)驗(yàn)是IoU閾值的選擇——我一般設(shè)0.30.5之間。閾值太低比如0.2容易出現(xiàn)兩個(gè)不同目標(biāo)錯(cuò)配在一起閾值太高比如0.7目標(biāo)稍微移動(dòng)快一點(diǎn)就斷開連接、重新分配ID。低速城區(qū)場景可以設(shè)高一些高速場景建議設(shè)低一些因?yàn)楦咚傧孪嗤瑫r(shí)間間隔內(nèi)目標(biāo)的位移更大幀間重疊率天然偏小。2.2 軌跡生命周期管理目標(biāo)不是一出現(xiàn)就是“真”的目標(biāo)發(fā)出來一個(gè)ID不是馬上就推給下游使用的。因?yàn)闄z測模型偶爾會(huì)對(duì)背景誤檢比如路牌、樹影、橋上橫梁都可能被誤檢為障礙物。如果誤檢也被當(dāng)成穩(wěn)定目標(biāo)FCW會(huì)對(duì)天降橫梁瘋狂報(bào)警。因此我會(huì)給每條軌跡定義幾個(gè)生命周期狀態(tài)未確認(rèn)候選、已確認(rèn)、丟失中、已刪除。一個(gè)新目標(biāo)進(jìn)入系統(tǒng)時(shí)先掛一個(gè)候選軌跡連續(xù)幾幀都能匹配到檢測框才升級(jí)為已確認(rèn)軌跡并輸出給下游功能。反過來已確認(rèn)目標(biāo)連續(xù)多幀匹配不上比如被前車遮擋軌跡進(jìn)入丟失狀態(tài)在丟失狀態(tài)下目標(biāo)位置繼續(xù)用運(yùn)動(dòng)模型推測但置信度會(huì)隨時(shí)間衰減。連續(xù)丟失時(shí)間超過閾值軌跡直接刪除ID不再復(fù)用。參數(shù)怎么定我自己的經(jīng)驗(yàn)是確認(rèn)幀數(shù)設(shè)3~5幀丟失幀數(shù)設(shè)30~50幀。確認(rèn)幀數(shù)設(shè)太短誤檢容易混進(jìn)來設(shè)太長真實(shí)目標(biāo)剛出現(xiàn)在視野邊緣時(shí)功能層遲遲拿不到確認(rèn)結(jié)果等都確認(rèn)完目標(biāo)已經(jīng)離很近了留給系統(tǒng)的反應(yīng)時(shí)間變短。丟失幀數(shù)的設(shè)置要考慮目標(biāo)遮擋場景。高速上如果前車被旁邊大車擋住通常只會(huì)遮擋一兩秒30~50幀假設(shè)25~30fps足夠撐過遮擋期目標(biāo)ID不會(huì)丟但遮擋時(shí)間再長軌跡預(yù)測的置信度已經(jīng)很低繼續(xù)跟下去反而可能導(dǎo)致目標(biāo)位置漂移很遠(yuǎn)的假軌跡這時(shí)候刪除軌跡反而干凈。2.3 目標(biāo)運(yùn)動(dòng)狀態(tài)估計(jì)卡爾曼濾波和它的工程落地輔助駕駛功能里目標(biāo)的速度、加速度是核心輸入。ACC要知道前車是加速還是減速AEB要知道碰撞時(shí)間還有多少FCW要判斷危險(xiǎn)等級(jí)。那么目標(biāo)速度怎么來最樸素的方法是相鄰兩幀位置差除以時(shí)間差但這樣算出來的速度噪聲非常大你根本沒法用。所以工程上普遍用卡爾曼濾波做運(yùn)動(dòng)狀態(tài)估計(jì)。這里分享一個(gè)基礎(chǔ)的勻速模型CV模型實(shí)現(xiàn)思路。目標(biāo)狀態(tài)定義為 x [pos_x, pos_y, vel_x, vel_y]觀測是檢測輸出的目標(biāo)中心位置 [pos_x, pos_y]。每幀做兩步操作先通過運(yùn)動(dòng)模型預(yù)測目標(biāo)狀態(tài)預(yù)測步再用當(dāng)前幀檢測結(jié)果對(duì)預(yù)測進(jìn)行修正更新步。核心要調(diào)的兩個(gè)參數(shù)是過程噪聲協(xié)方差Q和觀測噪聲協(xié)方差R。Q大表示更信任觀測、響應(yīng)快但噪聲大Q小表示更平滑但滯后明顯。我調(diào)車時(shí)的經(jīng)驗(yàn)是初始先給Q設(shè)一個(gè)相對(duì)偏小的值讓速度曲線平滑再根據(jù)實(shí)際跟車體感逐步調(diào)整。如果發(fā)現(xiàn)目標(biāo)速度響應(yīng)太慢前車剎車了感知速度還在慢慢降就適當(dāng)增大Q如果速度曲線毛刺多就增大R。卡爾曼濾波在工程上的一個(gè)復(fù)雜點(diǎn)是目標(biāo)初始化和終止條件要做處理。第一幀出現(xiàn)的目標(biāo)沒有歷史速度需要用連續(xù)兩幀的位置差來初始化速度但這兩幀檢測噪聲會(huì)讓初始速度偏差很大。我的做法是限制初始速度的范圍比如相機(jī)感知的目標(biāo)速度不能超過物理極限比如200km/h超過就置為邊界值再用后續(xù)幀的觀測逐步修正。2.4 類別與置信度的時(shí)序平滑讓車不再“變性”檢測模型對(duì)目標(biāo)類別的判斷在單幀上會(huì)存在抖動(dòng)。同一個(gè)目標(biāo)這一幀輸出是Car下一幀輸出是Truck再下一幀又是Car。如果你直接把類別變化傳給下游功能層會(huì)非常困惑——Truck和Car的動(dòng)力學(xué)模型、剎車能力、危險(xiǎn)程度完全不一樣。我做類別平滑的方法很簡單給每條軌跡維護(hù)一個(gè)類別投票器。每幀匹配上檢測框時(shí)把檢測類別的得分加進(jìn)去最后輸出得分最高的類別且只有得分超過一定比例才允許類別切換。一個(gè)比較保守的策略是新類別連續(xù)N幀比如5幀都占優(yōu)勢才切換類別否則保持原類別輸出。這能有效過濾掉單幀的閃爍。代價(jià)是真實(shí)類別變化時(shí)比如拖掛車切換會(huì)有幾個(gè)幀的延遲但這對(duì)功能層面通常是可接受的。置信度的處理也類似。模型輸出的置信度分?jǐn)?shù)在不做處理時(shí)抖動(dòng)很大尤其夜間、逆光、雨天場景。我習(xí)慣對(duì)置信度做時(shí)間維度的加權(quán)平均當(dāng)前幀置信度占60%70%歷史置信度占30%40%。這樣單個(gè)低置信度的突變幀不會(huì)導(dǎo)致目標(biāo)被直接刪除也不會(huì)讓一個(gè)高置信度的偶然誤檢瞬間升級(jí)成穩(wěn)定目標(biāo)。置信度閾值的選擇則需要分場景城區(qū)場景我通常把初始閾值設(shè)0.4左右郊區(qū)高速設(shè)0.5因?yàn)楦咚偕险`檢代價(jià)更高寧可多漏一些也不能亂報(bào)。3. 實(shí)操后處理管線實(shí)現(xiàn)與輔助駕駛功能對(duì)接3.1 一個(gè)可復(fù)現(xiàn)的視覺后處理管線架構(gòu)理清核心點(diǎn)之后我直接給一套最常見的視覺后處理管線架構(gòu)。輸入是檢測模型輸出的檢測框列表輸出是帶有ID、類別、位置、速度、置信度等屬性的目標(biāo)列表。管線內(nèi)部通常分四個(gè)模塊預(yù)處理與坐標(biāo)轉(zhuǎn)換、目標(biāo)關(guān)聯(lián)與匹配、軌跡管理與狀態(tài)估計(jì)、輸出與接口適配。預(yù)處理模塊負(fù)責(zé)把檢測框從像素坐標(biāo)換到相機(jī)坐標(biāo)系或車身坐標(biāo)系。這里特別提醒一點(diǎn)像素坐標(biāo)框不能直接用于速度估算。如果不做坐標(biāo)轉(zhuǎn)換用像素位移近似物理位移目標(biāo)距離越遠(yuǎn)越不準(zhǔn)。通常我們是利用相機(jī)內(nèi)參、外參和地面平面假設(shè)把檢測框底邊中心點(diǎn)投影到地面上得到目標(biāo)的世界坐標(biāo)x, y。這一步的精度直接決定后續(xù)距離和速度的精度標(biāo)定參數(shù)要定期檢查和校驗(yàn)。輸出接口是給下游功能用的object list結(jié)構(gòu)。我常用的結(jié)構(gòu)體包含以下關(guān)鍵字段target_id // 全局唯一ID class_type // 障礙物類別轎車/卡車/行人/騎行者/未知 bbox // 原始圖像檢測框調(diào)試用 position_x // 車身坐標(biāo)系下的縱向位置米 position_y // 車身坐標(biāo)系下的橫向位置米 velocity_x // 縱向速度米/秒 velocity_y // 橫向速度米/秒 confidence // 目標(biāo)置信度得分 existence_score // 目標(biāo)存在概率 track_age // 軌跡已維持幀數(shù) lost_age // 軌跡丟失幀數(shù) valid_flag // 是否可作為可信目標(biāo)參與功能決策valid_flag這個(gè)字段在設(shè)計(jì)時(shí)一定要留。它表示該目標(biāo)是否滿足功能安全的最低要求比如是否經(jīng)過足夠幀數(shù)確認(rèn)、置信度是否超過閾值、時(shí)間戳是否新鮮。功能層拿到目標(biāo)列表后優(yōu)先只看valid_flag為真的目標(biāo)。這樣即使感知端有異常、目標(biāo)處于丟失狀態(tài)只要valid_flag置為false功能層就不會(huì)用它做決策從源頭避免誤觸發(fā)。3.2 關(guān)鍵模塊偽代碼目標(biāo)關(guān)聯(lián)、生命周期、狀態(tài)更新我寫一個(gè)簡化但可運(yùn)行的偽代碼流程方便大家對(duì)照自己的工程實(shí)現(xiàn)思路。# 偽代碼視覺后處理主循環(huán) for frame_idx in range(total_frames): detections detector.infer(image) # 當(dāng)前幀檢測結(jié)果 # 1. 坐標(biāo)轉(zhuǎn)換檢測框到車身坐標(biāo)系 dets_world world_coord_transform(detections) # 2. 預(yù)測用已有軌跡的運(yùn)動(dòng)模型預(yù)測當(dāng)前幀狀態(tài) predicted_tracks [track.predict(dt) for track in tracks] # 3. 關(guān)聯(lián)預(yù)測軌跡與當(dāng)前幀檢測做匹配 cost_matrix build_iou_cost_matrix(predicted_tracks, dets_world) matched_pairs, unmatched_dets, unmatched_tracks hungarian_match(cost_matrix) # 4. 更新匹配上的檢測用于修正軌跡狀態(tài) for track_idx, det_idx in matched_pairs: tracks[track_idx].update(dets_world[det_idx]) tracks[track_idx].confirm() # 累加確認(rèn)計(jì)數(shù) # 5. 處理未匹配的檢測新軌跡候選 for det_idx in unmatched_dets: new_track Tracker.initialize(dets_world[det_idx]) tracks.append(new_track) # 6. 處理未匹配的軌跡進(jìn)入丟失狀態(tài) for track_idx in unmatched_tracks: tracks[track_idx].mark_lost() # 7. 生命周期管理確認(rèn)/刪除 for track in tracks: track.update_state_machine() # 8. 產(chǎn)出過濾無效目標(biāo)輸出object list output_targets [track.to_object() for track in tracks if track.is_confirmed()] publish(message_frame_id, output_targets)這里每一步都有細(xì)節(jié)講究。第三步的代價(jià)矩陣如果純用IoU遇到快速接近的大貨車和遠(yuǎn)處的小轎車時(shí)容易匹配混亂。我建議代價(jià)矩陣不要只用IoU可以加入位置距離和高寬比約束IoU低于0.2的配對(duì)直接設(shè)為無窮大排除高寬比差異超過一定倍數(shù)也排除。這樣即使兩個(gè)目標(biāo)空間上接近但形狀差異大也不會(huì)錯(cuò)配。另外一個(gè)實(shí)操技巧是如果檢測幀率穩(wěn)定每次預(yù)測的dt要嚴(yán)格用時(shí)間戳計(jì)算不要默認(rèn)等于1/幀率。相機(jī)幀率在顛簸路面上可能偶發(fā)掉幀統(tǒng)一用時(shí)間戳計(jì)算dt可以讓速度估算更穩(wěn)。3.3 時(shí)間戳對(duì)齊最容易翻車的細(xì)節(jié)時(shí)間戳對(duì)齊是我見過最容易被忽略、也是最容易翻車的問題。視覺后處理輸出的目標(biāo)列表帶上時(shí)間戳是不夠的關(guān)鍵是你這個(gè)時(shí)間戳是“算法完成時(shí)間”還是“圖像曝光時(shí)間”。這兩個(gè)時(shí)間差了可能幾十到上百毫秒高速場景下100毫秒意味著車輛向前移動(dòng)了好幾米。如果你的目標(biāo)位置是100毫秒前的而下游功能按“當(dāng)前時(shí)間”做決策那AEB的反應(yīng)距離憑空縮短好幾米。我的做法是感知輸出里的每個(gè)目標(biāo)都帶兩個(gè)時(shí)間戳一個(gè)是圖像曝光時(shí)間一個(gè)是后處理完成時(shí)間。下游決策用曝光時(shí)間作為目標(biāo)狀態(tài)的有效時(shí)刻用完成時(shí)間判斷數(shù)據(jù)的時(shí)效性。如果完成時(shí)間和當(dāng)前規(guī)控時(shí)刻差超過一個(gè)閾值比如150ms這幀感知數(shù)據(jù)就不能參與實(shí)時(shí)安全決策功能層要降級(jí)處理。另外后處理內(nèi)部在計(jì)算速度時(shí)必須用相鄰兩幀曝光時(shí)間戳的差值作為dt而不是用算法執(zhí)行間隔否則速度里會(huì)混入處理延遲的誤差。3.4 后處理如何支撐FCW、AEB、ACC這些具體功能后處理做完最終要落到功能上。這里講三個(gè)最典型的對(duì)接實(shí)例。先看FCW前向碰撞預(yù)警。FCW的核心參數(shù)是TTC計(jì)算方式是相對(duì)距離除以相對(duì)速度。后處理給的是自車的目標(biāo)縱向位置和縱向速度經(jīng)過差值得出相對(duì)速度和相對(duì)距離再算出TTC。FCW的報(bào)警閾值一般分兩級(jí)預(yù)警級(jí)TTC在2.6~3.0秒介入級(jí)在1.2~1.5秒。但單純靠TTC觸發(fā)工程上會(huì)誤報(bào)很大因?yàn)槟繕?biāo)可能正在切入或者本身在制動(dòng)過程中。所以功能層通常還要求后處理額外提供目標(biāo)的生命周期穩(wěn)定度和橫向運(yùn)動(dòng)趨勢。如果目標(biāo)剛確認(rèn)不久、橫向速度明顯即使TTC很小也不會(huì)觸發(fā)FCW。我在調(diào)這個(gè)的時(shí)候發(fā)現(xiàn)后處理輸出的目標(biāo)橫向速度估算尤其重要橫向速度估算不準(zhǔn)功能會(huì)把旁邊車道正常行駛的車誤判為切入車輛。然后是AEB自動(dòng)緊急制動(dòng)。AEB對(duì)感知置信度的要求比FCW高得多因?yàn)樗鲃?dòng)制動(dòng)。功能層一般需要后處理提供一個(gè)“危險(xiǎn)目標(biāo)等級(jí)”的評(píng)價(jià)除了TTC還會(huì)結(jié)合目標(biāo)類別行人、騎行者、車輛權(quán)重不同、目標(biāo)是否被遮擋遮擋狀態(tài)、置信度分?jǐn)?shù)。AEB觸發(fā)的目標(biāo)后處理必須給出valid_flag為真且已經(jīng)確認(rèn)跟蹤超過一定幀數(shù)并且目標(biāo)位置必須經(jīng)過濾波穩(wěn)定。工程上這類目標(biāo)通常還要過一遍“安全邏輯”——如果后處理內(nèi)部檢出目標(biāo)狀態(tài)異常或者時(shí)間戳超時(shí)寧可延遲一幀制動(dòng)也不能在目標(biāo)不明確時(shí)誤制動(dòng)。ACC自適應(yīng)巡航是另一個(gè)典型場景。ACC的核心是選目標(biāo)從所有有效目標(biāo)里選出同車道內(nèi)距離最近的目標(biāo)作為跟隨目標(biāo)。后處理在這里要做的是保證每個(gè)目標(biāo)的速度估計(jì)平滑尤其是目標(biāo)剛進(jìn)入ACC跟隨范圍時(shí)速度不能突變。否則ACC控制端發(fā)現(xiàn)目標(biāo)速度從0突然跳到20m/s會(huì)先急減速再慢慢跟上那種駕駛體驗(yàn)約等于新手司機(jī)猛踩剎車。我的經(jīng)驗(yàn)是ACC用到的目標(biāo)速度至少經(jīng)過5幀以上的濾波再進(jìn)入控制且速度變化率也就是加速度也需要平滑輸出讓控制端有預(yù)測性。3.5 輸出質(zhì)量的評(píng)價(jià)閉環(huán)你說了不算回歸數(shù)據(jù)說了算后處理做得好不好不能靠主觀感覺需要一套評(píng)價(jià)閉環(huán)。我自己的習(xí)慣是除了常規(guī)的檢測指標(biāo)Precision/Recall對(duì)后處理效果重點(diǎn)盯三個(gè)指標(biāo)ID Switch次數(shù)ID切換率、軌跡中斷次數(shù)、以及跟車速度波動(dòng)幅度。ID Switch是行業(yè)里衡量追蹤穩(wěn)定性的核心指標(biāo)一幀之內(nèi)目標(biāo)ID發(fā)生切換的次數(shù)。高速場景下一次ID Switch就會(huì)讓ACC把目標(biāo)當(dāng)成新目標(biāo)處理導(dǎo)致一頓一挫。軌跡中斷次數(shù)統(tǒng)計(jì)的是已確認(rèn)軌跡因?yàn)檎趽趸騺G失而結(jié)束的次數(shù)如果一條軌跡在中遠(yuǎn)距離頻繁中斷下游功能就會(huì)頻繁重新選取目標(biāo)。速度波動(dòng)幅度則是直接在功能層看跟車目標(biāo)速度序列的方差正常情況波動(dòng)應(yīng)該很小。怎么測我的做法是錄一批包含城區(qū)、高速、夜晚、雨天、隧道進(jìn)出口等場景的測試數(shù)據(jù)跑完后處理算法用標(biāo)注工具比如分析追蹤結(jié)果的腳本腳本自動(dòng)統(tǒng)計(jì)上述指標(biāo)。每次改動(dòng)關(guān)聯(lián)閾值、卡爾曼參數(shù)或者生命周期參數(shù)都要跑一遍回歸對(duì)比指標(biāo)變化。我調(diào)參時(shí)最常遇到的情況是某個(gè)場景ID Switch變好了另一個(gè)場景誤檢變多了。這種時(shí)候就需要定義場景權(quán)重不是簡單求平均而是按場景安全性分配權(quán)重后綜合評(píng)分。4. 踩坑實(shí)錄視覺后處理常見問題與排查經(jīng)驗(yàn)4.1 目標(biāo)ID頻繁切換先別改算法先看數(shù)據(jù)ID Switch算是后處理問題里最讓人抓狂的一個(gè)。目標(biāo)ID頻繁切換會(huì)導(dǎo)致功能層對(duì)目標(biāo)狀態(tài)感知不連續(xù)AEB可能把同一個(gè)目標(biāo)當(dāng)成新目標(biāo)重新評(píng)估ACC會(huì)重新選目標(biāo)體感就是車在高速上“猶豫不決”。遇到ID Switch我的排查路徑是固定的。第一步把前后幾幀圖像數(shù)據(jù)抽出來看目標(biāo)在圖像上的重疊度。如果兩個(gè)相鄰目標(biāo)在圖像上幾乎完全重疊那是當(dāng)前匹配邏輯無法區(qū)分的正?,F(xiàn)象需要考慮加入特征匹配比如目標(biāo)外觀特征或者用多傳感器融合輔助分離。第二步檢查檢測框的穩(wěn)定性。如果檢測框?qū)挾仍谶B續(xù)幀內(nèi)劇烈變化導(dǎo)致IoU不穩(wěn)定優(yōu)先解決檢測框抖動(dòng)比如對(duì)檢測框做寬高比平滑。第三步調(diào)整匈牙利算法的代價(jià)矩陣。這個(gè)我在前面提過IoU閾值太嚴(yán)格會(huì)導(dǎo)致同一目標(biāo)短暫失配然后重新分配ID太寬松又會(huì)讓兩個(gè)目標(biāo)交叉時(shí)錯(cuò)配。我最終的做法是把IoU閾值作為場景參數(shù)緩存在不同場景高速、城市、隧道波動(dòng)而不是全局固定一個(gè)值。4.2 高速上的目標(biāo)速度突然跳到離譜值這是我自己踩過比較深的一個(gè)坑。某次測試中前方目標(biāo)速度在200多公里每小時(shí)和正常值之間來回跳。后來排查發(fā)現(xiàn)問題不在卡爾曼增益而在坐標(biāo)轉(zhuǎn)換。車輛在彎道上行駛時(shí)如果是做純像素到地面的投影目標(biāo)框底邊中心點(diǎn)在地面上的投影位置會(huì)有很大的系統(tǒng)偏差因?yàn)橄鄼C(jī)外參中的俯仰角在車輛加減速時(shí)會(huì)變化車輛抬頭點(diǎn)頭導(dǎo)致目標(biāo)底邊投影位置在前后方向上劇烈漂移速度自然就跳變了。解決思路有兩個(gè)方向。一是做俯仰角補(bǔ)償利用車道線消失點(diǎn)、或者IMU數(shù)據(jù)來實(shí)時(shí)估計(jì)相機(jī)俯仰角變化。二是目標(biāo)位置濾波時(shí)增加觀測噪聲的自適應(yīng)調(diào)整當(dāng)檢測到目標(biāo)在圖像上處于遠(yuǎn)距離、且地面投影不穩(wěn)定的邊緣區(qū)域時(shí)增大觀測噪聲R讓濾波器更信任預(yù)測而不是觀測。注意這是過濾問題不是根治問題根治還是需要前端做穩(wěn)定的相機(jī)姿態(tài)補(bǔ)償。但后處理端的這個(gè)自適應(yīng)R能極大緩解功能層面的體感問題。4.3 低置信度目標(biāo)造成誤檢置信度閾值不是一拍腦袋定的很多人一開始面試時(shí)問“置信度閾值設(shè)多少”脫口而出0.5。但0.5根本不具備普適性。檢測模型在不同天氣、不同距離上的置信度分布完全不一樣。遠(yuǎn)距離的行人置信度普遍在0.3~0.5之間你要是全局設(shè)0.5行人目標(biāo)全被濾掉AEB對(duì)行人功能就失效了。夜間大燈照射下目標(biāo)的置信度整體偏低但目標(biāo)往往是真的。所以閾值設(shè)定要考慮場景和距離維度。我的做法是把圖像劃分成近、中、遠(yuǎn)三個(gè)區(qū)域?qū)?yīng)不同閾值同時(shí)結(jié)合時(shí)間信息連續(xù)低置信度但穩(wěn)定的軌跡可以作為候選目標(biāo)不立即丟棄。還有一個(gè)技巧是利用“消失一致性”——如果一個(gè)低置信度的目標(biāo)軌跡在連續(xù)幾幀內(nèi)保持了穩(wěn)定的運(yùn)動(dòng)趨勢它比一個(gè)突然出現(xiàn)的高置信度目標(biāo)更值得保留。功能層更怕的是那種“突然冒出來、又突然消失”的不穩(wěn)定目標(biāo)。4.4 雨夜、逆光、隧道口的經(jīng)典翻車場景這幾個(gè)場景幾乎每個(gè)做后處理的人都會(huì)遇到我就直接給結(jié)論和經(jīng)驗(yàn)。白天進(jìn)隧道那一瞬間相機(jī)自動(dòng)曝光來不及調(diào)整畫面要么過曝要么全黑檢測結(jié)果基本沒法用。后處理這時(shí)候要做兩件事一是對(duì)感知結(jié)果的時(shí)間戳做“無效標(biāo)記”告訴下游這一幀數(shù)據(jù)不可信二是利用軌跡預(yù)測維持目標(biāo)輸出但不能讓目標(biāo)速度產(chǎn)生假變化。如果功能層因?yàn)檫M(jìn)隧道瞬間感知失效而退出ACC體驗(yàn)很糟糕但如果后處理強(qiáng)行輸出預(yù)測位置又可能因?yàn)轭A(yù)測誤差積累導(dǎo)致目標(biāo)位置偏差很大。折中方案是輸出預(yù)測軌跡但降低置信度同時(shí)告訴功能層數(shù)據(jù)處于“感知降級(jí)”狀態(tài)ACC可以繼續(xù)保持但限制加減速幅度。雨夜場景則是另一個(gè)問題。地面反光、雨滴在鏡頭前形成光暈檢測模型容易把水漬、燈光反射誤檢成障礙物。后處理層面能做的是加大確認(rèn)幀數(shù)讓這類誤檢因?yàn)闀r(shí)空不一致而被過濾掉。逆光場景目標(biāo)往往只檢測到上半部分或者出現(xiàn)“局部檢測”框高度偏矮這會(huì)導(dǎo)致目標(biāo)實(shí)際位置投影偏差。后處理可以加一個(gè)針對(duì)性的箱體過濾目標(biāo)高度低于物理合理高度比如0.5米以下且ID又是首次出現(xiàn)就提高確認(rèn)門檻。5. 一些個(gè)人經(jīng)驗(yàn)與后續(xù)擴(kuò)展方向說到這再補(bǔ)充一個(gè)我實(shí)際調(diào)試中摸索出來的經(jīng)驗(yàn)。后處理里面參數(shù)“跟著場景走”這件事不要只靠感覺去調(diào)最好做成一張場景參數(shù)表。高速、城市、隧道、雨天、夜晚分別配一組不同的確認(rèn)幀數(shù)、IoU閾值、置信度閾值、卡爾曼Q/R參數(shù)。運(yùn)行的時(shí)候根據(jù)當(dāng)前的場景識(shí)別結(jié)果光照、車速、雨刮狀態(tài)、車道場景自動(dòng)切換參數(shù)組。這比用一個(gè)全局參數(shù)跑所有場景要穩(wěn)得多。但也要注意參數(shù)不能切得太頻繁否則場景識(shí)別抖動(dòng)會(huì)造成參數(shù)反復(fù)切換目標(biāo)狀態(tài)也跟著抖。我一般對(duì)場景標(biāo)簽做5秒以上的“粘滯”處理標(biāo)簽變了至少保持幾秒再切換參數(shù)。另一個(gè)值得擴(kuò)展的方向是和雷達(dá)、超聲波的融合問題。純視覺后處理做到最后你會(huì)發(fā)現(xiàn)一些結(jié)構(gòu)性問題靠視覺本身很難解決比如單目視覺對(duì)目標(biāo)絕對(duì)距離估計(jì)天生不精確尤其是遠(yuǎn)距離目標(biāo)。這時(shí)候就需要多傳感器融合來做互補(bǔ)。視覺后處理的輸出結(jié)果可以作為融合的輸入之一而融合后的目標(biāo)質(zhì)量反過來也可以校驗(yàn)視覺后處理的好壞。這個(gè)我后續(xù)準(zhǔn)備單獨(dú)寫一篇這里先提一個(gè)核心觀點(diǎn)視覺后處理做到后半段目標(biāo)已經(jīng)不是“檢不出來”的問題而是“信不信得過”的問題而融合恰好是解決“信得過”的另一條關(guān)鍵路徑。最后再分享一個(gè)小技巧調(diào)試后處理算法時(shí)記得做一個(gè)可視化的調(diào)試工具在圖像上同時(shí)繪制檢測框和目標(biāo)軌跡、目標(biāo)ID、速度矢量能極大提升排查問題的效率。很多復(fù)雜問題比如ID切換、速度跳變、軌跡漂移你光看數(shù)字是看不出來的但在圖上放慢播放一眼就能定位。好的可視化調(diào)試工具是后處理算法迭代效率的分水嶺——這個(gè)工具值得你花時(shí)間建好越早越好。