"); //-->
1.簡介該示例為參考算法,僅作為在征程 6 上模型部署的設計參考,非量產算法
SparseBevFusionMultitaskOE 模型是一個 bev 多任務感知模型,包含感知三大任務的檢測頭:sparse 動態檢測頭,sparse 靜態元素檢測頭和通用障礙物檢測頭。整體的模型結構如下:
sparse bev 類模型主要思路是通過關鍵點投影回 camera 空間采樣并進行預測。因此對于多任務模型來說,不同 task 之間可以共用的是 img_encoder 的 backbone 和 neck 部分,同時加入輔助分支 densedepthnet 用于輔助訓練,部署時不需要。動態檢測、靜態要素檢測和占用格預測任務可以分別抽象為三個 head:detection head(det head)、onlinemapping head(om head)和 occupancy head(occ head)。在模型的選擇上,我們選取了參考算法已集成的,也是較主流的模型-sparse4d、maptr、flashocc,在征程 6 上部署的效果更好。
2.性能精度指標3.地平線部署說明注:flashocc 掉點為分辨率降低導致;sparse 動態目標檢測掉點會在后續版本中優化。
sparse 多任務模型的每個 head 是基于公版模型做了優化后部署的,以下為模型相較于公版的改動點:
詳細可以參考地平線開發者社區官網單任務模型的參考文檔的改動說明章節:
地平線靜態目標檢測 MapTR 參考算法-V2.0
地平線 3D 目標檢測 bev_sparse 參考算法-V2.0
地平線占用預測 FlashOcc 參考算法-V1.0
3.1 訓練策略3.1.1 浮點訓練(一)數據結構說明參考算法已有的三個單任務模型都是基于 nuscenes 數據集的,它同時包含三個任務的標注數據。其中 dataset 使用 NuscenesSparseMapDataset,包含了地圖相關的標注。
NuscenesSparseMapDataset 繼承自 NuscenesMapDataset 和 NuscenesBevDataset,同時含有動態、靜態和 occ 的標注。因此多任務模型選用 NuscenesSparseMapDataset 作為數據集,可以同時對動態、靜態和 occ 任務一起監督訓練;動態檢測頭用到了時序信息,所以 data_loader 采用了 DistStreamBatchSampler,確保數據按時序返回。
訓練集和測試集的處理流程見:hat/data/datasets/nuscenes_map_dataset.py
(二)訓練架構HAT 使用的是注冊機制,模型結構和參數在 config(configs/bev/bev_sparse_det_maptr_flashocc_henet_tinym_nuscenes.py)中通過 dict 定義,在 config 中構建多個 head 的 dict,然后通過配置 enable_xx_head 參數選擇需要合入的任務。
Plain體驗AI代碼助手代碼解讀復制代碼det_head = dict( type="SparseBEVOEHead", enable_dn=True, level_index=[2], cls_threshold_to_reg=0.05, instance_bank=dict( type="MemoryBankOE", ... )
構建一個 OrderedDict,通過標識選擇加入哪些模型,然后在整體 model 中,傳入 task_heads。
Plain體驗AI代碼助手代碼解讀復制代碼task_heads = OrderedDict() if enable_det_head: task_heads["det"] = det_head if enable_om_head: task_heads["om"] = om_head if enable_occ_head: task_heads["occ"] = occ_head model = dict( type="SparseBevFusionMultitaskOE", compiler_model=False,
多任務的 forward 流程為遍歷 dict(每個 dict 可以理解為一個 task_head),依次執行各自的 head,代碼可見:hat/models/structures/sparse_multitask.py
Plain體驗AI代碼助手代碼解讀復制代碼def forward_single_head( self, head, feature_maps, data, lidar_feature, compiler_model ): if isinstance(head, (SparseBEVOEHead, FlashOccHead)): return head( feature_maps=feature_maps, metas=data, lidar_feature=lidar_feature, compiler_model=compiler_model, )
(三)訓練策略注:為了兼容 lidar 融合的模型,head 中保留 lidar_feature,在不使用 lidar net 的情況下 lidar_feature=None
SparseBevFusionMultitaskOE 模型在訓練上:
SparseBevFusionMultitaskOE 模型為同源數據集,多個任務一起訓練,非單獨的訓練某個 head。
模型訓練時需要增加添加 BevRotation,經過在 nescenes 上驗證,不添加會導致掉點。
訓練策略復用了單任務模型 。
對模型配置 loss weight,根據模型表現動態的調整權重值。
為量化精度保證,我們采取了 HistogramObserver 的校準方式(OE 3.7.0 版本及以后支持),精度上優于 MSEObserver。校準數據為訓練數據,校準的 step 為 50,無 qat 訓練。
Plain體驗AI代碼助手代碼解讀復制代碼calibration_data_loader = copy.deepcopy(data_loader) calibration_data_loader["dataset"]["transforms"] = val_data_loader["dataset"][ "transforms" ] calibration_batch_processor = copy.deepcopy(val_batch_processor) calibration_step = 50 calibration_qconfig_setter = QconfigSetter( reference_qconfig=get_qconfig( # 1. 主要用于獲取 observer # observer=(observer_v2.MSEObserver) observer=(observer_v2.HistogramObserver)
q_template 為量化配置,分為全局的配置和自定義的 ModuleNameTemplate、基于敏感度的 SensitivityTemplate 算子的配置。ModuleNameTemplate 主要作為全局量化配置和個別層的量化配置,被用于配置全局量化類型和對算子配置 int16、固定算子的 scale 操作,以上都是基于經驗的。SensitivityTemplate 為敏感度的配置,它是基于 debug 結果,對敏感排行較高的算子通過 topk_or_ratio 配置 int16 算子比例。詳細的使用方法可見用戶手冊*量化感知訓練--開發指南--Qconfig 詳解 *章節。
在多任務時,建議先將已知的在單任務中需要 fix-scale 的層(特別是具有物理意義、范圍固定的 op)做固定 scale 處理、對已知需要 int16 精度的算子配置高精度。例如動態單任務的 fix-scale 為:
多任務時可以做復用:
模型基于 int8 的量化配置下做 calibration,若出現精度掉點問題參考用戶手冊中的*量化感知訓練--開發指南--精度調優工具使用指南 *選取 badcase 做 debug 分析,基于 debug 信息對部分算子配置更高的精度或者嘗試手動處理。
多任務量化推薦流程:
若未部署過單任務則可以按照用戶手冊推薦流程(*量化感知訓練--開發指南--量化精度調優指南)*做部署。
4.總結與建議4.1 部署建議嘗試訓練時增加數據增強(BEV Rotate)提高模型的泛化能力
對精度較差的任務可以適當的增大 loss weight
量化優先嘗試 HistogramObserver 校準方式
多任務量化時建議基于單任務的經驗,對需要固定 scale 的算子做 fixscale,可以有效縮短量化周期。
本文通過對 SparseBevFusionMultitaskOE 在地平線征程 6 上量化部署的優化,使得模型在征程 6M 上得到 latency 為 28 ms 的部署性能,同時,通過 SparseBevFusionMultitaskOE 的部署經驗,可以推廣到其他多任務模型的部署中。
作者:地平線開發者
鏈接:https://juejin.cn/spost/7616666565057642511
來源:稀土掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。
相關推薦
數字PID控制及其改進算法的應用
[轉帖]us/os就緒表的維護算法分析
自動駕駛的時代,呼喚線控底盤
ADI:傳感技術助力未來自動駕駛的發展
基于LPC2138的血壓測量算法開發平臺電路圖
攜手ADI贏得未來
加密算法之MD5算法
目標跟蹤算法在紅外熱成像跟蹤技術上的應用
為什么可擴展高性能 SoC 是自動駕駛汽車的未來
ZF與SiliconAuto推出用于自動駕駛的實時I/O芯片
采用Mean-Shift和Camshift算法相結合的火焰視頻圖像跟蹤設計
采埃孚與SiliconAuto推出自動駕駛實時I/O接口芯片
vxwokrs下靜態圖像壓縮算法(上)
加快實現自動駕駛(完整小組討論)
PID算法
賦能自動駕駛和機器人感知,讀懂二維可尋址VCSEL | 硬科技有點意思
簡單實用的單片機CRC 快速算法
地平線HSD引領智能駕駛普惠新時代
物理人工智能如何在自動駕駛和電動汽車中應用?
CRC算法原理及C語言實現
求FSK信號的解調算法,主要是鐵路上的移頻信號!
數字PID控制算法之一
有關指紋算法
自動駕駛的現狀與未來(節選)
76-81GHz自動駕駛CMOS RADAR
日產聯手優步與 Wayve,計劃在東京推出自動駕駛出租車服務
英偉達 “全天候” 芯片實現毫秒級人臉檢測
計算機科學與技術反思錄(2)
英偉達宣布與比亞迪、吉利展開自動駕駛業務合作
無線傳感器網絡低功耗分簇路由算法設計