一些改進模型速度/精度的工程方法

視學演算法發表於2020-04-06

點選上方“視學演算法”,選擇加"星標"或“置頂”

重磅乾貨,第一時間送達一些改進模型速度/精度的工程方法

作者:Captain Jack

https://zhuanlan.zhihu.com/p/92025012

本文已由作者授權,未經允許,不得二次轉載

一些自己的工作經驗總結,用於補救模型、提升速度的常用工程方法。

提速部分

1. 劃分大小目標檢測網路,針對性訓練 receptive field

同樣的任務,可以訓練兩套網路,通過控制網路的 receptive field,分別處理大目標、小目標。 為了檢測多尺度目標,模型都會採用類FPN的結構,直接結果就是減少模型的併發性。劃分大小網路後,可以減少FPN接面構的分支,同時也可以減少訓練難度,而且兩個網路也可以使用不同的複雜度。

2. 分割槽域不同解析度目標檢測,增加檢測目標距離

比如高速的視覺感知上,越在中間位置越需要更遠的識別距離,越在周邊位置目標越近。 就可以用一個低解析度的圖片檢測近距離目標,用中心區域的高解析度圖片檢測遠距離目標。

後續可以更加智慧,使用一個額外的網路,預測哪些區域需要高解析度檢測,哪些區域低分就可以。用來處理彎道、 特殊場景等情況。

同樣的思路也可以應用在不同焦距多攝像頭的系統上。

3. 黑白單通道圖片輸入,提升模型速度

這個方法我也用了多年,屢試不爽。由於CNN的特性,運算量集中在高解析度上,第一層conv往往佔用了很可觀的運算量。 所以,如果對色彩沒有特別要求的話,可以直接用黑白的單通道圖片。這樣就直接減少第一層 conv 2/3 的運算量。整體上甚至可能會有10%的速度提升。

4. 輕量分類網路 + 多個重量模型,根據場景分類載入模型

如果應用的場景有很大的變化,可以考慮先用分類網路來確定場景,然後選擇適合場景的模型。 分類模型可以很輕量,這樣用不同的重量網路來處理不同的場景,相當於一個N倍容量的單一重量模型。 比如,先分類確認白天、黑夜、隧道,然後再載入對應場景的檢測模型。

5. 跳幀

這個方法根據我的經驗和觀察應該是被普遍採用的。畢竟,很多應用實際使用中並不需要完全實時(30+FPS)。 根據自己的經驗,15FPS的檢測頻率,即使把檢測框打出來,人眼也是感覺不出來延時的。所以,之前工作中我都會有一個效能指標叫做準實時檢測速度在 15~20FPS 這個範圍內,在嵌入式裝置上會進一步降低到 10~13FPS。

6. Tracking by Detection + ReID

自己對 Tracking 並不支援,更願意用其他的方法來實現。

比如,可以將所有已檢目標和其附近區域作為一個 batch,塞給一個輕量級的檢測網路。或者用 ReID 的思路進一步來保持 ID。

由於檢測模型的訓練會對目標型別的特徵更加敏感,相對 Tracking 使用的通用 feature ,或者 online 生成的 feature 可能會更加有效,也能減少不少工程複雜度。

7. 多階段處理 / cascade 結構

多種任務合併後可能需要一個容量很大的網路才能獲得比較好的結果。可以考慮先將一個任務完成,後續增加一個分任務的網路。這樣整體上可能會獲得一個更好的效能提升。或者,先用一個網路完成到60分,後面可以針對性的用網路把60分提升到80分,Two-stage的Faster RCNN就是這個方法的一個典型。

比如,檢測目標後需要很多更加細緻的屬性分類。可以先將所有目標檢測出來,然後再交給一個後續網路完成細緻屬性的判斷。

8. 思考是否真的需要深度網路

很多人可能會直接利用現在各個網路庫提供的預訓練模型來解決自己的問題,這些模型的網路複雜度一般都是和 Res50 一致的(這一複雜度其實是在常用算力、訓練吞吐量、準確率、實用性之間trade-off的一個最優複雜度了)。

不過,實際任務未必需要這個複雜度,之前的經驗,即使在Res18的複雜度下,也可以應付10+類的檢測。減少網路複雜度可能 mAP 一類的指標會掉一點,但是速度大幅度提升,這個平衡就看實際情況了。

提升精度部分

1. 多幀確認,減少誤檢

用於應對偶爾的誤檢,這也算是普遍使用的基礎方法。每次檢出並不直接認為是目標,而是等待多次檢測後才認為檢出目標。具體可以用濾波方法、置信度模型、或者單純的連續5幀中檢出3次這樣的判斷。

2. Kalman濾波與平滑,平滑檢測狂,防止漏檢

這也是基本方法,可以用於避免目標偶爾漏檢、平滑檢測框,不廢話了。

3. 縮放比例

有些目標和場景未必需要保持影像比例:行人太細可以考慮拉寬點解析度訓練;一些車道檢測也會通過視角變化來獲得更好效果,或者方便使用傳統方法快速檢測。

4. 曝光調整,捨棄不重要區域

接觸過攝像頭或者攝影的都會知道,CMOS對於大光比是很無力的。如果對攝像頭的曝光有控制力的話,調整曝光是個很有效的方法。比如: 在行駛路面場景下,相機自動曝光因為天空太亮的原因,會趨向於讓路面變得更加黑暗,這樣地面目標檢測會容易誤檢或者漏檢。其實天空區域過曝關係並不大(除了有紅綠燈的情況),路面場景更加關心的是路面的各類目標,所以可以使用更加智慧的曝光,讓不重要的區域過曝或者欠曝。

或者能夠有一個足夠快速的HDR演算法,多個曝光選項的合併,但是這個難度和複雜度要比放棄部分割槽域的曝光更大,控制曝光更加簡單粗暴。

5. groupRectangle,NMS懶人替代

ROI檢測框合併會用NMS,或者其他的變種。不過,如果有時候偷懶的話,可以直接用 OpenCV 裡面的 groupRectangle。也可以完成檢測框的合併,考慮到這是個不用自己實現的介面,可以臨時省下一點工作量。實際上,用這個介面來合併檢測結果,被我自己用了很多年。

- END -

如果看到這裡,說明你喜歡這篇文章,請轉發、點贊掃描下方二維碼或者微信搜尋「perfect_iscas」,新增好友後即可獲得10套程式設計師全棧課程+1000套PPT和簡歷模板向我私聊「進群」二字即可進入高質量交流群。

掃描二維碼進群↓

一些改進模型速度/精度的工程方法

一些改進模型速度/精度的工程方法

一些改進模型速度/精度的工程方法

在看 一些改進模型速度/精度的工程方法

相關文章