點(diǎn)擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)

本文轉(zhuǎn)自|計(jì)算機(jī)視覺工坊
前言
這一篇的內(nèi)容主要要講一點(diǎn)在深度學(xué)習(xí)的3D目標(biāo)檢測網(wǎng)絡(luò)中,我們都采用了哪些數(shù)據(jù)預(yù)處理的方法,主要講兩個(gè)方面的知識,第一個(gè)是representation,第二個(gè)數(shù)據(jù)預(yù)處理內(nèi)容是數(shù)據(jù)增廣。
作為本篇博文的引言,我們先給一種博主制作的比較重要的3D檢測方法圖鑒,如下,就筆者的個(gè)人理解,今年的CVPR出現(xiàn)了很多的one-stage的方法,同時(shí)出現(xiàn)了很多融合的方法,這里的融合有信息融合,有representation融合,同時(shí)根據(jù)近兩年的發(fā)展來看,voxel-based的方法占據(jù)了主導(dǎo)地位,這是得益于卷積結(jié)構(gòu)優(yōu)越性(point-based方法采用pointnet++結(jié)構(gòu),是MLP搭建的),但是今年的oral文章3D-SSD是一篇在point-based方法上很有建樹的文章,所以在3D檢測中了解主要的representation代表方法也是很重要的。
1.representation
做3D視覺的,尤其是基于點(diǎn)云做3D視覺任務(wù)的同學(xué)們都比較清楚的知道,點(diǎn)云因?yàn)槠渚哂邢∈栊院蜔o規(guī)則性使得在二維上非常成熟的CNN結(jié)構(gòu)不能直接的運(yùn)用在點(diǎn)云中。我們先了解一下點(diǎn)云的這兩個(gè)特性,如下圖所示,下圖中的(i)表示二維圖像的排列方式,(ii),(ii),(iv)表示的是點(diǎn)云的數(shù)據(jù),可以看出點(diǎn)云的排列稀疏性,對比(ii)和(iii)可以得知雖然點(diǎn)云數(shù)據(jù)的排列順序假使是一樣的,但是其對應(yīng)的幾何結(jié)構(gòu)不同,而(iii)和(iv)則可以看出盡管幾何結(jié)構(gòu)表示同一個(gè),但是排列順序卻是可以不一樣的。
知道了上述的兩個(gè)點(diǎn)云數(shù)據(jù)的兩種特性,所以設(shè)計(jì)一種合適的點(diǎn)云表達(dá)形式是比尋找到一個(gè)高效的深度學(xué)習(xí)框架更加重要的內(nèi)容,就3D檢測方面而言,到CVPR20,至少有三種比較重要和值得探究的representation方式,分表示pointrepresentation,voxel representation和graph representation。
1.1 point representation
如題,就是采用最原始的點(diǎn)作為深度學(xué)習(xí)網(wǎng)絡(luò)的輸入,不采用任何的預(yù)處理工作,這類工作都是在pointnet++的基礎(chǔ)上進(jìn)行的。
這里首選插入一點(diǎn)采用point-based方法的基礎(chǔ)backbone,如下所示,左圖表示的是pointnet的特征提取結(jié)構(gòu),也就是point-based的基礎(chǔ)模塊,右圖就是point-based方法的基礎(chǔ)架構(gòu),由point-encoder層和point-decoder層組成,encoder層主要逐漸下采樣采點(diǎn)特取語義信息,decoder過程是將encoder過程得到的特征信息傳遞給沒有被采樣到的點(diǎn)。使得全局的點(diǎn)都具有encoder的特征信息。最后再通過每個(gè)點(diǎn)作為anchor提出候選框。
最早的工作是CVPR18上的F-pointnet,該文章的作者也是pointnet/pointnet++的作者,具體做法如下可知,首先通過二維的檢測框架得到二維目標(biāo)檢測結(jié)果,然后將二維檢測結(jié)果通過視錐投影到三維,再采用三維破pointnet++延伸結(jié)構(gòu)檢測為三維目標(biāo)框。算是三階段的基于point輸入的目標(biāo)檢測方法
隨后的CVPR19的比較經(jīng)典的Point_based方法是point-rcnn,該工作不僅僅采用point作為representation,同時(shí)和上訴的F-pointnet比較沒有采用二維信息,僅僅采用點(diǎn)云作為網(wǎng)絡(luò)輸入。如下圖所示,該工作是一個(gè)兩階段的檢測方法,第一階段根據(jù)語義分割信息對每一個(gè)點(diǎn)都提出一個(gè)候選框,隨后再采用多特征融合進(jìn)一步優(yōu)化proposals。
除了CVPR會議,在IROS和ICRA機(jī)器人相關(guān)的會議上也有很多這方面的研究,其中有一篇在F-pointnet上做出更細(xì)致的優(yōu)化的文章F-ConvNet也是很優(yōu)秀的工作,有興趣的同學(xué)可以去了解下;這里直接介紹今年CVPR20上的基于Pointrepresentation的文章 3D-SSD,如下圖所示,平平無奇的一階段encoder過程,也就是把pointnet++的decoder部分給去除掉(這樣做的目的是減少網(wǎng)絡(luò)前饋時(shí)間,在KITTI上達(dá)到35FPS),本文的最主要的貢獻(xiàn)點(diǎn)在于將Pointnet++的采樣方法由歐式空間度量改為特征空間度量和歐式空間度量相結(jié)合的方法,同樣的也采用了anchor-free的設(shè)計(jì)方法,使得顯存占用更少。
point representation方法小總結(jié)
就筆者個(gè)人對這方面的理解,該類方法的優(yōu)點(diǎn)是作為最原始的點(diǎn)云數(shù)據(jù),保留了最細(xì)致的幾何結(jié)構(gòu)信息,網(wǎng)絡(luò)的輸入信息損失幾乎是所有representation方法中最小的。但是缺點(diǎn)也很明顯,第一點(diǎn),MLP的感知能力不如CNN,因此主流的effective的方法都是voxel-based的,第二點(diǎn),pointnet++結(jié)構(gòu)的采樣是很耗時(shí)的,所以在實(shí)時(shí)性上也不及voxel-based的方法。所以今年的CVPR oral文章3D-SSD為了實(shí)時(shí)性,丟掉了FP層,同時(shí)設(shè)計(jì)了新的SA模塊。
1. 2 voxel representation
1.2.1 Voxelization 步驟
在3D目標(biāo)檢測中,對整個(gè)場景的point2voxel的過程可以簡單描述為如下:
1.設(shè)置Voxelization參數(shù)(每個(gè)voxel可以存放點(diǎn)的個(gè)數(shù)(max_points_number),voxel長寬高的大小(whl))
2.對依次每一個(gè)點(diǎn),根據(jù)其對應(yīng)的坐標(biāo)(x,y,z)得到該點(diǎn)在voxel的索引。
3.根據(jù)索引判斷該voxel種是否已經(jīng)存在max_points_number個(gè)點(diǎn),如果存在,則將該點(diǎn)直接丟棄,如果不滿足,則將該點(diǎn)加入到該voxel中。
1.2.2 Voxelization 參數(shù)
上文中的體素化過程涉及到兩個(gè)重要的內(nèi)容,一個(gè)是體素參數(shù),另外一個(gè)是voxel特征根據(jù)該voxel中的特征如何求取。
Voxelization對參數(shù)的要求比較高,就發(fā)展歷史來說,VoxelNet(CVPR18)是第一篇采用voxel-representation作為點(diǎn)云輸入的網(wǎng)絡(luò)結(jié)構(gòu),該文章中max_points_number設(shè)置的為35,voxel大小設(shè)置為0.5;采用的voxel特征提取方式為增加一個(gè)pointnet對每個(gè)voxel中的35個(gè)點(diǎn)特征提取得到相應(yīng)的voxel特征(如下圖中的featurelearning network所示的內(nèi)容),但是該參數(shù)很明顯是會丟失比較多的幾何結(jié)構(gòu)信息,但是以這樣的參數(shù)劃分在當(dāng)時(shí)還受到VoxelNet網(wǎng)絡(luò)后續(xù)的3D卷積的顯存占用的影響(3D卷積很占顯存,因此網(wǎng)絡(luò)預(yù)處理的參數(shù)受到影響)。
18年的SECOND提出的3D稀疏卷積大大減少了3D卷積的內(nèi)存占用,(我們知道,3D卷積本身會對空間中每一個(gè)voxel都進(jìn)行卷積,但是3D稀疏卷積只保留了空間中非空的voxel,采用map映射的方式得到卷積后的voxel空間索引);因此參數(shù)的設(shè)置自由了很多,就目前在KITTI和Nuscence上的sota的內(nèi)容而言,我們一般采用的參數(shù)和特征提取方為:
max?points?number=5,(w,l)=(0.05,0.05),h=0.1
采用的voxel特征直接為mean特征,即對每一個(gè)voxel中的所有點(diǎn)的坐標(biāo)求均值即可。
1.2.3 related paper
這里只介紹一些在voxelrepresentation上做文章的研究內(nèi)容,而不是采用voxel作為網(wǎng)絡(luò)輸入的研究工作,因此voxel-based的研究方法比較多,后續(xù)筆者會出一篇在這方面的研究綜述,所以這里推薦的幾篇文章都是在voxel-representation上的做出研究的工作。
voxel-based的先驅(qū)的兩篇文章voxelnet和second的主要貢獻(xiàn)分別是第一個(gè)提出采用voxel作為網(wǎng)絡(luò)輸入的方法和引入稀疏卷積替代3D卷積。這里補(bǔ)充一點(diǎn)voxel-based方法的backbone,目前幾乎所有的voxel-based方法都采用如下的encoder的backone作為特征提取器。下圖左圖表示的是點(diǎn)的voxel表示,經(jīng)過Voxelization化后,經(jīng)過逐步下采樣的encoder過程降為二維 feature map,最后再根據(jù)二維的feature的每一個(gè)像素點(diǎn)作為anchor point提出候選框。
在voxel-representation上做文章的研究工作,如下圖,這是一篇發(fā)表在sensors2020上的
文章Voxel-FPN:multi-scale voxel feature aggregation in 3D object detection frompoint clouds,該研究工作的主要內(nèi)容是通過不同scale的體素劃分,最后將其整合成到RPN網(wǎng)絡(luò)結(jié)構(gòu)中的FPN網(wǎng)絡(luò)中,需要注意的是,這里的scale的大小要和最初劃分的scale對應(yīng)起來。
同樣采用該思想的還有今年的CVPR20的文章HVNet,如下圖所示,也是對場景中點(diǎn)云采用multi-scale的體素劃分,最后也會形成一個(gè)FPN的結(jié)構(gòu),但是不同的細(xì)節(jié)和實(shí)現(xiàn)之處還是有很多的,HVNet采用了多線程同時(shí)并行處理每一個(gè)scale的體素劃分,同時(shí)對于voxel的特征提取和Voxel-FPN也是不一樣的。
在voxel劃分上做研究的工作還有如下的waymo組的MVF工作,可以看到,之前的研究工作如果對于一個(gè)voxel中點(diǎn)數(shù)沒有占據(jù)max_points_number實(shí)際上也會采用全0占據(jù)空間,而這一篇文章的一點(diǎn)創(chuàng)新則是修改成可自適應(yīng)的儲存點(diǎn),不必強(qiáng)行每個(gè)voxel的空間占用一樣大,可以節(jié)省不少內(nèi)存占用。
1.2.4 voxelrepresentation方法小結(jié)
voxel-representation的方法的優(yōu)點(diǎn)即是性能好又高效,不僅僅在精度上有著point-based的方法目前無法比擬的精度,在速度上也是很可觀的,尤其是在稀疏卷積和3D流型卷積引入到3D目標(biāo)檢測后,發(fā)展更為迅速。但是缺點(diǎn)則是該類方法對參數(shù)比較敏感,預(yù)處理劃分voxel的時(shí)候需要設(shè)置合適的參數(shù),當(dāng)然從信息論的方面理解,體素劃分必然帶來信息的丟失,尤其是局部細(xì)節(jié)信息的丟失,因此今年CVPR20上至少有三篇文章(SA-SSD,pointpainting,HVnet)在細(xì)節(jié)幾何結(jié)構(gòu)上做了一定的研究工作。
1.3 graph represention
這是一個(gè)比較新的representation,在3D檢測中,今年CVPR20第一次出現(xiàn)了以graph作為representation的網(wǎng)絡(luò)結(jié)構(gòu),如下圖所示,graphrepresentation的核心問題也在于構(gòu)建一個(gè)graph網(wǎng)絡(luò),即下圖中的圖左所示的內(nèi)容。這也是很多在語義分割中遇到的問題,在目前的建圖中大多是采用的knn的方法構(gòu)建圖結(jié)構(gòu),后續(xù)再送入到圖卷積進(jìn)行特種提取,最后根據(jù)pointrpn-head提出proposals。
就該類方法而言,目前的研究還不是很多,因?yàn)镚CN非常耗時(shí),可以理解為時(shí)pointnet++特征提取網(wǎng)絡(luò)的升級版,不僅僅提取點(diǎn)之間的信息,同時(shí)根據(jù)‘點(diǎn)-邊’信息提取到更加局部細(xì)節(jié)的信息,但是優(yōu)點(diǎn)也可以理解到,3D shape實(shí)際上在增加邊信息后,會更加容易感知(對比mesh結(jié)構(gòu)可知),但是采用何種方式構(gòu)建合適的graph都還是很需要研究的內(nèi)容。
1.4 point-voxel fusion
既然我們知道point-based的方法具有保持了幾何structure的能力,同時(shí)voxel-based的方法具有高效的感知能力,那么最新的研究就在考慮如何做這方面的fusion工作,PV-RCNN(CVPR20)采用的將voxel特征經(jīng)過multi-scale的形式賦予到point上,最后再refine階段將點(diǎn)的局部信息融合到pointnet中。SA-SSD采用voxel2point添加附加任務(wù)使得voxelbackbone具有structure aware能力。實(shí)際上根據(jù)representation fusion的經(jīng)驗(yàn),應(yīng)該還是大有可做的。
2 Augmentation
實(shí)際上3D目標(biāo)檢測的數(shù)據(jù)增廣方式和二維目標(biāo)檢測的方式大多相同,我們總結(jié)為如下一些比較常見的數(shù)據(jù)增廣方式,根據(jù)動態(tài)圖很容易的看到的出來數(shù)據(jù)增廣的方式,這里筆者著重介紹一下groundtruth augmentor的方法,這應(yīng)該是根據(jù)3D點(diǎn)云的稀疏空間特性所特有的數(shù)據(jù)增廣方式。
ground truth augmentor
就KITTIobject 3D的數(shù)據(jù)而言,每一幀的object數(shù)量從無到二十多個(gè)不等,ground truth augmentor的想法則是先從所有訓(xùn)練集中根據(jù)類別把groundtruth建立成一個(gè)data base,然后在訓(xùn)練的時(shí)候?qū)ata base中的gt按照類別丟一定數(shù)量的gt到當(dāng)前訓(xùn)練的幀中,這里筆者給出一般在KITTI上數(shù)據(jù)增廣的數(shù)量如下。即表示一般會選擇在場景中丟進(jìn)去15個(gè)car,丟進(jìn)10個(gè)Pedestrians和Cyclists。
SAMPLE_GROUPS: ['Car:15','Pedestrian:10', 'Cyclist:10']
因?yàn)樵摂?shù)據(jù)增廣的工作在3D目標(biāo)檢測中比較重要,后續(xù)還延伸到一些涉及到該方面的研究工作,筆者做一點(diǎn)簡單介紹.
這一篇文章(Class-balanced Grouping and Sampling for Point Cloud 3D Object Detection)的后續(xù)研究工作做成了一個(gè)detectionzoo,在github上叫det3D,但是該文章的初始問題是想解決在nuscene數(shù)據(jù)中的數(shù)據(jù)不平衡問題,根據(jù)作者的采樣得到如下圖表,這里也就是目標(biāo)檢測的longtail問題,數(shù)據(jù)不平衡問題
這里作者采用的gt數(shù)據(jù)增廣方式采樣如下個(gè)數(shù)的gt來平衡數(shù)據(jù)集本身存在的long tail問題,并最終在nuscence上取得了榜一的成績。
筆者再介紹一篇今年CVPR20上涉及到gt augmentation的工作(oral)(What You See is What You Get:Exploiting Visibility for 3D Object Detection),,如下圖,在本文gt數(shù)據(jù)增廣后,俯視圖下由(a)變成了(b),但是作者指出這里出現(xiàn)的問題在于有的增廣的物體出現(xiàn)在墻后,這在Lidar掃描過程中是不符合規(guī)律的,因此作者采取的增廣策略是把對應(yīng)的墻體去掉,如(d)圖所示的內(nèi)容。這就比較符合lidar掃描的特性,即遇到object就會反彈。
3 筆者的思考
實(shí)際上數(shù)據(jù)預(yù)處理在深度學(xué)習(xí)中也是比較重要的內(nèi)容,就representation來說,voxel的方法高效但存在信息丟失,point-basde的方法感知能力不及cnn但輸入為最原始的結(jié)構(gòu),Graph構(gòu)建了更容易感知的結(jié)構(gòu),但也要承擔(dān)GCN網(wǎng)絡(luò)過長的前饋時(shí)間;就augmentation來說,gtaugmentation盡管在漲點(diǎn)上成了眾人皆知的trick,但是要能很好的用起來該方法還是有一些值得研究的trick在里面,就比如上述提到的兩篇文章。最后寫一個(gè)flag,后續(xù)盡快寫一個(gè)voxel-based方法研究的發(fā)展概述,主要也是筆者的理解。
推薦文獻(xiàn)
[1]VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection
[2]Frustum PointNets for 3D Object Detection from RGB-D Data
[3]PointRCNN: 3D Object Proposal Generation and Detection from Point Cloud’
[4]3DSSD: Point-based 3D Single Stage Object Detector
[5]Point-GNN: Graph Neural Network for 3D Object Detection in a Point Cloud
下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
在「小白學(xué)視覺」公眾號后臺回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。
下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講
在「小白學(xué)視覺」公眾號后臺回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計(jì)數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個(gè)視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。
下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
在「小白學(xué)視覺」公眾號后臺回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計(jì)算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~