一些改進模型速度/精度的工程方法
點選上方“視學演算法”,選擇加"星標"或“置頂”
重磅乾貨,第一時間送達
作者: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和簡歷模板,向我私聊「進群」二字即可進入高質量交流群。
↓掃描二維碼進群↓
喜歡文章,點個在看
相關文章
- 改進大語言模型的最全方法!模型
- 如何改進手上的機器學習模型機器學習模型
- 程式碼維護:改進程式碼的一些方法 (轉)
- 我期待 Vue 改進的一些地方Vue
- 改進JAVA字串分解的方法Java字串
- 速度與精度的結合 - EfficientNet 詳解
- 用 ASP.NET 2.0 改進的 ViewState 加快網站速度ASP.NETView網站
- Photoshop改進UI設計的一些技巧UI
- 如何透過Graph+AI的方法打造高精度風控模型AI模型
- 騰訊AI Lab提出翻譯改進模型Transformer的3個優化方法AI模型ORM優化
- 對通用骨架提取方法的改進
- 多維灰色預測模型的一點改進模型
- 騰訊AI Lab提出翻譯改進模型Transformer的3個最佳化方法AI模型ORM
- 模型評估與改進:交叉驗證模型
- 回顧一些重要的CNN改進模型(你真的瞭解 Convolutional Neural Networks 麼)CNN模型
- 改進AI/ML部署的5種方法AI
- 精益流程改進的方法的有哪些?
- MindSpore模型精度調優實戰:常用的定位精度除錯調優思路模型除錯
- MindSpore模型精度調優實戰:如何更快定位精度問題模型
- 進一步改進GPT和BERT:使用Transformer的語言模型GPTORM模型
- 計算方法之祖沖之的精度
- 從經典結構到改進方法,神經網路語言模型綜述神經網路模型
- 精度高、模型小、速度快!梯形DenseNets結構實現語義分割新高度!模型SENet
- 掙值管理在系統工程專案中的改進(轉)
- 使用tensorrt對ram++模型進行fp16精度加速指導模型
- [Java] 浮點數的精度丟失問題與精度控制方法Java
- meteor 安裝 android sdk慢的改進方法Android
- 提高學習改進記憶的科學方法
- NOISEDIFFUSION: 改進基於擴散模型的球面線性插值模型
- 改進蛋白突變穩定性預測,清華龔海鵬團隊AI蛋白工程模型登Nature子刊AI模型
- Laravel框架改進Web App開發的9種方法Laravel框架WebAPP
- mysql處理海量資料時的一些優化查詢速度方法MySql優化
- js進擊--一些常用小方法JS
- MIT新開發的 AI 模型有望改進惡性腦瘤治療MITAI模型
- 模型僅有7M:輕量級高精度人臉識別方法DBFace模型
- 微軟工程師希望獨立impl程式改進Chromium的滾動效果微軟軟工工程師
- oracle資料值型資料改精度測試Oracle
- 損失函式改進方法之Focal Loss函式