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