簡介
對于自動駕駛應用來說,3D 場景感知至關重要。3D點云數據就是具有3D特征的數據。一方面,3D 點云可以直接用來獲取障礙物的距離和大小,以及場景的語義信息。另一方面,3D 點云也可以與 2D 圖像進行融合,以充分利用兩者所提供的不同信息:圖像的優勢在于語義信息更加豐富,點云的優勢在于距離和深度感知精確。隨著深度學習架構的發展,出現了很多基于3D 點云感知模型,通過提取 3D 空間的點云特征,可以構建一種更精確、高維度、高分辨率的場景表示形式,助力下游預測與規控任務的發展。對于檢測模型,相比圖像感知模型,對于 3D 感知任務,基于3D 點云的感知模型通常擁有非常明顯的精度優勢。
同時,在自動駕駛系統中,可行駛區域分割是一項重要的任務。可行駛區域的提取是ADAS的關鍵技術,旨在使用傳感器感知技術感知駕駛車輛周圍的道路環境,識別并分割出當前駕駛場景下可行駛的區域,防止偏離車道或違規駕駛。
在部署過程中,相比圖像模型,3D 點云的輸入處理過程更復雜,量化難度高,導致難以部署。當前常見的對點云數據處理方式包括point-based、pillar-based、voxel-based等方式。考慮到部署的實時性需求,地平線選用了基于pillar-based的 Centerpoint,同時提出了基于3D點云的多任務模型,實現可行駛區域分割的感知功能。本文即對如何在地平線征程5芯片上高效部署基于3D點云的多任務模型進行介紹。
整體框架
本文介紹的多任務模型輸入為3D點云,通過感知模型可同時輸出 3D 目標檢測結果和 2D 可行駛區域的分割結果。多任務模型網絡結構可分為以下三個部分:
?點云前處理。該部分是對3D點云做基于pillar-based的處理,將點劃分到pillars中,形成偽圖像。包括以下三個部分:
a. Pillar 化:將輸入的原始點云轉換為 pillar 特征;
b. PFNLayer:提取 pillar 特征,特征通道數提升至 64;
c. Scatter:完成 pillar 特征到偽圖像化的轉換;
?特征提取和融合: 該層選用 MixVarGENet+UNET 結構,提取多層特征并加以融合,獲得高層語義特征;
?多任務輸出頭: 輸出多類別的 3D 目標檢測和二分類的可行駛區域分割結果。
部署優化
在部署優化之前,首先明確針對Centerpoint多任務模型的各部分的結構做性能和量化精度上分析,然后進一步給出優化方向和優化思路。
量化精度優化
在前面有提到,點云數據具有不均勻的特征,這種分布特點的數據使用PTQ量化方式很大可能會有量化精度問題,因此在 Centerpoint 多任務模型的量化過程中,我們使用 Calibration+QAT 的量化方式來保證點云模型的量化精度。需要提到的是地平線的calibration對于大部分模型就可以達到預期的量化精度,少量模型在較小的QAT訓練代價下可以達到量化精度。由于 Centerpoint 多任務模型中所有算子的量化在征程5上是完全支持的,得到初版的量化精度是非常簡單的。
QAT量化方式是根據數據的分布選取量化系數,將fp32的數據截斷到int8范圍,由于點云數據分布不均勻,其表現在部分數據(點云坐標)的數值范圍較大,部分(點到中心的距離)數值范圍較小,這種情況對量化是很不友好的,因此在量化訓練中,會導致精度掉點;為了使數據分布處于均勻范圍內,一般都會做歸一化處理(歸一化對浮點的精度也是有利的),因此,為了提升量化精度,我們增加了對點云特征的歸一化處理。
Python def _voxel_feature_encoder(self, features, norm_dims, norm_range,feature,num_points_in_voxel): # normolize features for idx, dim in enumerate(norm_dims): start = norm_range[idx] norm = norm_range[idx + len(norm_range) // 2] - norm_range[idx] features[:, :, dim] = features[:, :, dim] - start features[:, :, dim] = features[:, :, dim] / norm ... return features
在nuscenes數據集上的驗證,經歸一化處理后,量化精度損失在 1% 以內。
性能優化
點云前處理優化
前處理包括Voxelization操作和特征的擴維操作-VoxelAugment。我們將分析公版的實現在征程5上部署的困難點,然后基于困難點介紹優化方式以及地平線對點云前處理的部署優化。
Voxelization:體素化,是把三維空間中的點云數據轉換到體素(voxel,即三維空間中的網格)。 Centerpoint中的 Pillars 可以看作是特殊( z 軸沒有空間限制)的 voxel,為了與社區名稱和代碼實現名稱相統一,我們下文統一稱為 Voxelization、voxel。 |
Voxelization部署分析
假設用 (x, y, z, r, t) 表示點云數據中的一個點,其中(x, y, z) 坐標,r 為點云的反射強度,t為時間戳。
Centerpoint中的Pillar化(一種特殊的 Voxelization 操作,是把 z 軸看作一個整體,把三維空間離散化為 x-y 平面中均勻間隔的網格),在 Voxelization 過程中,需要依次、逐個對密集點云中的每個點進行判斷,并將其劃分入對應的 voxel 中,且每個 voxel 都需要存儲點云中對應區域的信息。隨著點云密度的增加,處理的體素數量也相應增多,導致需要更多的計算和內存資源,其計算復雜度可能導致較長的部署時間。
VoxelAugment部署分析
繼voxelization 中把每個點云 point 劃分到各個 pillar 中之后,公版 Centerpoint中對點云 point 做了特征增強,即前文提到的把基于 nuscenes 數據集的5 維點云 point 數據(x, y, z, r, t)根據點到中心的距離擴充到了 11 維(x, y, z, r, t,xc, yc, zc,xp, yp, zp,)。然而,這樣的處理方式,無論是對量化精度還是部署性能方面,都存在一些不足:
?量化精度方面:前文已提到,這里不再贅述;
?部署性能方面: 在從 5 維擴充到 11 維時,對中心點距離的求解,增加了計算量和相應的耗時。而在我們的實驗中發現,增加的后 6 維數據,實際對模型的浮點精度影響很小。
針對以上兩個問題,下面介紹地平線的優化方法。
VoxelAugment優化
根據實驗,原11維的方案會導致耗時增加,精度收益不大,因此在我們的改進方法中,點云 point 僅使用前5維(x, y, z, r, t),見板端c++代碼:
Python void QATCenterpointPreProcessMethod::GenFeatureDim5(float scale) { for (int i = 0; i < voxel_num_; i++) { int idx = i * config_->kmax_num_point_pillar * config_->kdim; for (int j = 0; j < config_->kmax_num_point_pillar; ++j) { if (config_->pillar_point_num[i] > config_->kmax_num_point_pillar_vec[j]) { int index = idx + j * config_->kdim; voxel_data_[index + 0] = (voxel_data_[index + 0] - config_->kback_border) / config_->kx_range / scale; voxel_data_[index + 1] = (voxel_data_[index + 1] - config_->kright_border) / config_->ky_range / scale; voxel_data_[index + 2] = (voxel_data_[index + 2] - config_->kbottom_border) / config_->kz_range / scale; voxel_data_[index + 3] = (voxel_data_[index + 3] - config_->kr_lower) / config_->kr_range / scale; if (voxel_data_[index + 4] != 0) { voxel_data_[index + 4] = voxel_data_[index + 4] / scale; } } } } }
在優化后,該部分耗時減少了 4ms,精度上影響較小。
除了以上的優化外,考慮硬件對齊特性,對特征的layout也做了優化,以便模型可以高效率運行。征程5計算運算的時候有最小的對齊單位,若不滿足規則時會對Tensor自動進行padding,造成無效的算力浪費。例如conv的對齊大規則為2H16W8C/2H32W4C。基于硬件特征,采用H W維度轉換的方式,將大數據放到W維度以減少算力的浪費,因此在生成pillars特征對其做歸一化后使用permute將1x5x40000x20轉換為1x5x20x40000。
Python features = features.unsqueeze(0).permute(0, 3, 2, 1).contiguous()
Voxelization優化
對于點云的voxelization耗時問題,地平線提供了ARM和DSP部署方式。可以在OE包的AIBenchmerk中查看其具體實現。
DSP具有強大的并行計算能力,能夠同時處理多個數據,且具有快速讀寫內存的特點,利用 DSP 可以有效加速 Voxelization 過程,提高實時性能。例如,在 nuscenes數據集(點云數據量為30萬),經 DSP 優化后,前處理耗時由77ms 降低至20ms,性能提升3.8倍。具體數據可見實驗結果章節。
優化后,點云處理部分流程圖如下所示:
特征提取與融合PFNLayer
Centerpoint 的PFNLayer作用是將每個包含D維特征的點(由前文可知,公版Centerpoint中 D=11,地平線參考模型中D=5)用一個Linear+BatchNorm1d+ ReLU+max 的組合來進行特征提取,生成(C,P,N) 的張量。
而地平線征程5最早針對的是以CNN為基礎的圖像處理,在編譯器內部4d-Tensor是最高效的支持方式。如果不是4d-Tensor的話,編譯器內部會主動轉成4d(某些維度為1)來做,會多了很多無效的計算。我們可以使用常規的4維算子替換原來任意維度的設置,避免不必要的冗余計算。常見的替換方式如下,中間配合任意維度的reshape,permute來完成等價替換。因此,我們將公版中的 Linear + BatchNorm1d + ReLU + max 分別做了如下替換:
N dims | 4dims |
nn.Linear | nn.Conv2d |
nn.BacthNorm1d | nn.BacthNorm2d |
torch.max | nn.MaxPool2d |
偽圖像化
PillarScatter 是實現偽圖像轉換的最后一個步驟,該部分將(1, 1, P, C) 的特征映射獲得形如(C, H, W) 的偽圖像。為了便于量化訓練和上板推理優化,我們在 horizon_plugin_pytorch 和編譯器中均實現了point_pillars_scatter 算子。該算子由編譯器內部完成,用戶不需要感知。
horizon_plugin_pytorch 中 point_pillars_scatter 算子的調用方式為:
Python from horizon_plugin_pytorch.nn.functional import point_pillars_scatter pseudo_image_feature = point_pillars_scatter(voxel_features, coords, out_shape)
backbone+neck
關于特征提取與融合部分,由于點云處理部分生成的偽圖像特征輸出通道數較大,原 Centerpoint 模型中的 SECOND 結構部署速度不夠快,本文選用 MixVarGENet+UNET 結構,作為模型的 backbone 與 neck。
MixVarGENet 為地平線基于征程5硬件特性自研的backbone結構,特點是性能表現優異,可以達到雙核5845FPS。該結構的基本單元為MixVarGEBlock。如下為MixVarGEBlock的結構圖:
MixVarGENet高度秉承了“軟硬結合”的設計理念,針對征程5的算力特性做了一些定制化設計,其設計思路可以總結為:
1. 小channel時使用normal conv,發揮征程5算力優勢;
2. 大channel時引入group conv,緩解帶寬壓力;
3. Block內部擴大channel,提升網絡算法性能;
4. 縮短feature復用時間間隔,減少SRAM到DDR訪存。
充分考慮征程5的帶寬和硬件屬性,小neck+大backbone的組合比較經濟,且可以提高BPU的利用率,能達到平衡精度與速度的最佳組合!
多任務輸出頭
Centerpoint多任務模型的輸出頭分為兩部分,對于 3D 目標檢測,選用 Centerpoint 模型的預測頭,2D 可行駛區域的分割結果則選用了 FCN 結構做為輸出頭。
多任務模型的分割頭為 FCNHead,其中部分卷積模塊替換為深度可分離卷積,有利于部署性能的進一步提升。同理,多任務模型的檢測頭 CenterpointHead 也將部分卷積模塊替換為深度可分離卷積。替換后,模型部署性能得到了進一步的提升,同時浮點精度不受影響。
由于公版 Centerpoint 模型的二階段在 nuscenes 數據集上并無精度提升,因此這里只選用了一階段的輸出頭。
實驗結果
1. Centerpoint 多任務模型在征程5性能數據
數據集 | Nuscenes |
點云量 | 30W(5dim)(注1) |
點云范圍 | [-51.2, -51.2, -5.0, 51.2, 51.2, 3.0] |
Voxel size | [0.2, 0.2, 8] |
最大點數 | 20 |
最大pillars數 | 40000 |
FPS | 106.14 |
前處理時長(arm/arm+dsp) | 77ms/20ms |
latency | 23.79ms |
量化精度 |
浮點:NDS: 0.5809, mAP: 0.4727, miou:91.29 定點:NDS: 0.5762, mAP: 0.4653, miou:91.22 |
檢測類別 | 10類(注2) |
分割類別 | 二分類(注2) |
注
1:維度為(x,y,z,r,t),即:3維坐標、強度和時間
2:檢測任務:["car","truck","construction_vehicle","bus","trailer","barrier","motorcycle","bicycle","pedestrian","traffic_cone"]
分割任務:["others", "driveable_surface"]
2. 基于3D點云的多任務模型高效部署通用建議
?對輸入數據做歸一化,更有利于量化。
?如在部署中使用PTQ無法解決量化精度問題,考慮使用QAT做量化部署。
?對于點云數據,pillars_num較大,將大數據放到W維度提升計算效率。
?建議選擇小neck+大backbone的組合,減小帶寬壓力,達到性能提升。
?使用地平線提供的點云前處理,若前處理存在性能瓶頸,嘗試DSP方案。
總結
本文通過對基于3D點云的多任務模型在地平線征程5上量化部署的優化,使得模型以低于1%的量化精度損失,得到 latency 為 23.79ms 的部署性能。在點云處理方面,通過針對性的優化方法,靈活支持了不同點云輸入并大幅提高點云處理的速度;在特征提取方面,選用了征程5高效結構 MixVarGENet+UNET;在輸出設置上,采用多任務輸出設計,能夠同時得到 3D 目標檢測結果和可行駛區域的分割結果。
審核編輯:劉清
-
傳感器
+關注
關注
2552文章
51288瀏覽量
755133 -
dsp
+關注
關注
554文章
8057瀏覽量
349550 -
編譯器
+關注
關注
1文章
1638瀏覽量
49197 -
自動駕駛
+關注
關注
784文章
13896瀏覽量
166690 -
ADAS系統
+關注
關注
4文章
226瀏覽量
25733
原文標題:多維優化Centerpoint模型成果顯著!基于3D點云的多任務模型在板端實現高效部署
文章出處:【微信號:horizonrobotics,微信公眾號:地平線HorizonRobotics】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論