# [ChipNet: Real-Time LiDAR Processing for Drivable Region Segmentation on an FPGA](https://arxiv.org/pdf/1808.03506.pdf)
## [Github](https://github.com/hashi0203/ChipNet-LiDAR-Segmentation)
## Algorithm Design
### A. LiDAR data preparation
KITTI使用的是64線的光達。通常,database裡面會包含x、y、z座標,以及物體反射強度r,如圖一(a)。從點雲投影至相機視角,如圖一(b),或是原始光達視角,如圖一(c\),在空間分佈的密度都不同。因此需要針對光達所掃出來的點進行重新修改座標、採樣。

> 反射強度 -> 會受物體、角度等影響
如表一所示,並沒有統一的點雲座標與視角形式。又由於,大量的LiDAR點,容易散佈在ROI。因此,非ROI區域,稀疏性是較高的。需要耗費大量運算資源來處理”0”。
> 座標 -> sampling view
> 視角 -> space subdivision
> ROI -> Region of interesting

因此,本文使用球座標系。在角方位\[-45º, 45º)為ROI區域,並將64線分別進行切割。在每一行上,每0.5º進行切割。因此,ROI的所有點,會散佈在180*64的網格當中。會使用0.5º,是因為他為角分辨率的3倍,因此每個網格中,會存在至少兩個點。然而實際上,可能會受強度影響,造成空洞現象。根據採樣,會存留14個特徵點,分別為7個較近的掃描點,與7個較遠的掃描點。這7個又可分為笛卡爾坐標x、y、z、球坐標θ、φ、ρ和激光反射強度r。
如表一所示,球座標系具有較高的ROI點雲使用率,稀疏度也較為密集。
### B. ChipNet: a hardware friendly and extendable CNN architecture
#### 1) ChipNet convolutional block:

ChipNet的block如圖四所示,它包括三個分支。第一個分支使用殘差方式,將Input直接連接至output,減少梯度消失及爆炸。第二個分支使用一般的3*3卷積。第三個分支為一個3*3的擴張卷積,用於處理更多資料,但是減少參數及運算量。使用此block,能夠有更穩定的梯度及更少的參數。ChipNet的block僅有73856個參數、8.02億次乘法。傳統的5x5卷積,需要102464個參數,11.8億次乘法。ChipNet的block減少28%的參數量、32%的乘法量。
#### 2) ChipNet network architecture:

架構如表二所示,ConvEncoder會將張量從14提升至64。隨後經過10次的ChipNetBlock。最後輸出透過channel-wise mapping將輸出改為180*64*1。
#### 3) Simulated quantization:
使用Fixed point在FPGA領域中,優於浮點數。他能夠減少硬體資源、內存、Clock。
然而,並不能直接將float轉成fixed point,這可能會丟失一些訊息。因此,本文提出一種量化的方式,來訓練神經網路。
##### Simulated quantization of weights and variables:
在[[21]](https://arxiv.org/pdf/1712.05877.pdf)的reference中,在反向傳播的權重與梯度會被存成float,正向傳播會將數值量化成fixed point。優點是權重和梯度在連續空間中更新,因此可以避免由於量化引起的局部最優。缺點為在tensorflow中,需要修改一些特定函數。

本文提出一個權重調節器。如Algorithm 1.所示。其實就是將數值左移F位,進行四捨五入,最後在右移F位,將數值轉為N位元的小數。在過程中,不使用tensorflow的BP,因此使用StopGradient。

##### Evaluation of quantization:
本文使用ford的dataset進行chipnet的訓練、量化、微調。如表三所示,將數值精度降低,並不會造成精度下降。

### C. View of drivable region
網路輸出後的結果為車輛前20m寬40m的俯視,會進行後處理,將輸出投影至頂視圖。因為他與KITTI的格式相同,容易進行比較。

如Algorithm 2.所示。1, 2, 3主要針對模型輸出進行輪廓提取,4, 5主要針對輪廓進行填充,將區域內的點逐格標記。
後處理使用[GridMap](https://github.com/ANYbotics/grid_map)在CPU上實現。內部包含iterator,能夠將區域內的點逐格標記。

在CPU處理上,能狗以每幀5ms處理。
後處理會造成精度下降可分為兩部分。1. 投影至鳥瞰圖時,LiDAR在較遠處的點雲較為稀疏,轉換時可能會造成失真。2. 在Algorithm 2. 時,假設外部區域為不可駕駛,內部區域為可駕駛,因此,如果可駕駛區域包含空洞時,可能會造成誤差。最後使用KITTI進行頻估,將結果與KITTI的鳥瞰圖進行比較,F1-Score為95.5%。
### D. Network training and evaluation
ChipNet在Xeon 2.4 GHz CPU 和 NVidia K20 GPU的平台,並使用Keras進行訓練。輸入為180*64*14的tensor輸出為180*64*1的tensor。每幀為256ms。使用Ford與KITTI的資料集進行頻估。
Ford的資料集3871筆資料。LiDAR使用10Hz進行採樣。由於資料集本身沒進行Label,因此本文手動標記ROI區域。為減少連續幀數重複性,因此每5幀為一個單位。實際上,1秒內能被採用2幀。在數據集中,刪除一些off-road的的樣本。因此,在Ford的資料集中,總共包含600筆資料。

原圖會從1243*1616剪裁至與LiDAR大小相同的800*600。Algorithm 4.表示LiDAR轉至camera view的演算法。本文使用400筆資料進行訓練/驗證,200筆進行測試。在400筆中,使用(-10, -5, 0, 5, 10)º進行旋轉,增加訓練樣本。因此總共有2000筆訓練資料。
本文使用Cross entropy當作loss function,adam當作optimizer。首先在沒使用量化的方式對網路進行30次迭代(4.5hr),隨後使用量化方式進行10次迭代(1.5hr),以獲得fixed point權重。
在測試階段,使用F1 score (F1)、average precision (AP)、precision (PRE)、recall (REC)、false positive rate (FPR)、false negative rate (FNR)當作評估指標。表三為不同bit情況下的評估結果。本文最終選擇18bit當作FPGA實現目標。
本文也在KITTI進行評估。包括289筆train data與290筆test data。圖片會被剪裁至375*1242,與Ford不同,KITTI是在鳥瞰圖進行評估。
在訓練時,將資料進行(–10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10)º旋轉,來擴增資料集。總共包括3179筆資料,其中3000筆進行訓練,179筆進行測試。訓練時,使用Ford前30次的迭代當作pretrain,隨後僅用KITTI的dataset進行10次的迭代(2.05hr)。

表4為KITTI的實驗結果,並與其他學者進行比較。紅色區域為假駕駛區、藍色區域為缺失駕駛區、綠色區域為正確駕駛區、其餘部分為正確非駕駛區。
## Hardware Architecture



Clock 350MHz
Xilinx UltraScale XCKU115 FPGA-> 12.59ms
NVidia K20 GPU-> 162ms
Intel Core i5-5200U CPU-> 549ms
FPGA 實現的速度比 CPU 快 43 倍,比 GPU 快 13 倍。
以FPGA進行LiDAR運算文章較少,無法比較。
所提出的 FPGA 解決方案的功耗僅為 NVidia K20 GPU 的 11.8%,即 107 W。