Brief
?昨晚組會(huì)師兄把我分配到了做3D檢測,所以接下來的一段時(shí)間先對(duì)3D檢測的研究做一下梳理。先挖一個(gè)坑,后續(xù)慢慢填。
1 基本處理方法
1.1 激光
?CVPR2018年的一篇文章Voxlnet,直接處理激光點(diǎn)云,將點(diǎn)云在空間上劃分為均勻的voxel,再把不同的voxel點(diǎn)云提取Voxel Feature Encoding對(duì)物體進(jìn)行分類和位置回歸。具體的研讀看這里
1.2單目相機(jī)
?YOLO3D將3D檢測通過2D的YOLOV2模型來擴(kuò)展延伸。
1.3 激光+單目相機(jī)
2 研究問題
2.1 3DBBox
?理論上3DBBox會(huì)含有9個(gè)自由度。分別是:
[Math Processing Error]描述形狀:{L,W,H}描述位置:{X,W,Z}描述旋轉(zhuǎn)角:{Yaw,pitch,roll}
但是我們存在先驗(yàn)知識(shí):地面是水平的,所以一般就可以少去描述位置的Z的變量和旋轉(zhuǎn)角的[Math Processing Error]pitch和roll,因此變成如下的6個(gè)自由度:
[Math Processing Error]描述形狀:{L,W,H}描述位置:{X,W,0}描述旋轉(zhuǎn)角:{Yaw,0,0}所以3D檢測的位置回歸是一個(gè)6D的預(yù)測回歸問題。
2.2 目前存在的數(shù)據(jù)集
- Jura
- Pascal3D+
- LINEMOD
- KITTI
2.3主要難點(diǎn)
- 遮擋問題:目標(biāo)相互遮擋或者目標(biāo)被背景遮擋。
- 截?cái)啵?只有物體的一部分
- 小目標(biāo)
- 旋轉(zhuǎn)角度的學(xué)習(xí):物體的朝向不同,但是對(duì)應(yīng)的特征相同。
2.4 主要方法
2.4.1 SSD-6D
待填坑
2.4.2 3D Bounding Box Estimation Using Deep Learning and Geometry
2.4.3 Implicit 3D Orientation Learning for 6D Object Detection from RGB Images
?上面的幾篇文章都是重點(diǎn)在2D圖像或者單目結(jié)合激光學(xué)習(xí)6D的姿態(tài),數(shù)據(jù)來源和我要做的貌似有點(diǎn)出入,我要做的是基于點(diǎn)云的3D檢測,因此后續(xù)繼續(xù)挖坑。
3 Survey of object classification and detection based on 2D/3D data
Brief
?這是CVPR-wrokshop上的一篇總結(jié)。站在大佬的肩膀上看世界,看看最新的研究進(jìn)展和發(fā)展。文章指出5點(diǎn)3D視覺比2D視覺更加復(fù)雜的原因:
- 3D數(shù)據(jù)的表達(dá)多種形式,例如電云和mesh結(jié)構(gòu),但是2D只有像素格子。
- 計(jì)算和內(nèi)存復(fù)雜度都要求更多,更復(fù)雜
- 室內(nèi),室外的數(shù)據(jù)分布特征使得一個(gè)統(tǒng)一的結(jié)構(gòu)很難運(yùn)作
- 3D數(shù)據(jù),尤其是室外場景,其具有的稀疏性使得檢測任務(wù)很難做。
- 3D有監(jiān)督的數(shù)據(jù)很少,使得學(xué)習(xí)任務(wù)非常困難
3.1 3D data-sets for object detection
- NYU Depth Dataset V2 : has 1449 densely labeled pairs of aligned RGB and depth images from Kinect video sequences for a variety of indoor scenes.
- SUN-RGBD dataset: RGB-D images
- KITTI
3.2 階段性方法對(duì)比
如下圖所示的內(nèi)容,除去19年薪的內(nèi)容,經(jīng)典的文章可以如下:

主要可以分為two-stage和three-stage,果然維度提升一維,難度加大的不是一點(diǎn)點(diǎn)。
3.2.1 3D bounding box 編碼方式

按照輸入的數(shù)據(jù),把目前3D-detection的文章分類如下;一般來講,只使用2維數(shù)據(jù)(單目和立體的數(shù)據(jù))的效果并沒有結(jié)合3維數(shù)據(jù)的好。

下圖表示了目前幾種主流(除去19年)的3D檢測的方法的Bbox和proposals 生成方法的對(duì)比:

4 較新論文閱讀
4.1 [19年8月10號(hào)-19年8月24號(hào)]學(xué)習(xí)填坑總結(jié)
由于明天要做小組匯報(bào),所以今天先總結(jié)一下這兩周在3D檢測方面的進(jìn)展,除去一些幫娜姐和師兄做事的時(shí)間,真正在點(diǎn)云上花的功夫估計(jì)只有8天左右,趁還沒開學(xué),下次加油。那么我把這次的總結(jié)按照如下兩部分進(jìn)行吧。
4.1.1 論文閱讀與總結(jié)
主要有voxelnet,F-pointnet,pointRCNN 和 pointpollars 這四篇文章。下面分別貼一些主要的圖來說明其主要做法和問題。
voxelNet

如圖所示,voxelNet的過程分為3的步驟,分別是:VFE特征提取,3D卷積和RPN預(yù)測。本文第一篇使用自學(xué)特征做檢測,不是采用的手工特征。并且僅僅只用了點(diǎn)云輸出。
(1)文章最大的亮點(diǎn)在VFE層,其實(shí)結(jié)構(gòu)就是Pointnet,但是卻采用了一個(gè)voxel中所有數(shù)據(jù)的整合。最后得到每一個(gè)voxel都具有128維度特征的voxel-wise結(jié)構(gòu)。后續(xù)就是一個(gè)3D卷積和維度融合成二維卷積,再在二維上做RPN操作。
(2)另外一個(gè)亮點(diǎn)是在VFE層中計(jì)算時(shí)先進(jìn)行升維操作(很多在這篇文章上的后續(xù)工作都跟進(jìn)了這一操作,也就是局部信息和全局坐標(biāo)結(jié)合變成7個(gè)維度的特征)。
(3)但是需要提出的問題依舊是兩點(diǎn):第一點(diǎn),3D卷積的操作實(shí)則是一個(gè)很雞肋的東西,在voxel中對(duì)每個(gè)voxel的特征的提取實(shí)則不能做到很好的效果。第二點(diǎn),anchor-based的方法還是比較耗時(shí)間的,而且3D卷積尤其如是。這里的proposals沒有任何先驗(yàn)就提來了,而后續(xù)的兩片文章呢則是在proposal上做了不少文章。
F-pointnet

先說下一大體流程:
(1)采用2D優(yōu)秀的檢測方法對(duì)深度圖的RGB進(jìn)行檢測出物體。
(2)根據(jù)檢測出來的物體可以確定視錐,文章說的是根據(jù)投影關(guān)系確定的,所以也不用去考慮什么viewpoint這個(gè)無聊的問題。
(3)在視錐內(nèi)的點(diǎn)進(jìn)行實(shí)例分割,實(shí)際上也就是語義分割而已。采用的是一個(gè)pointnet的變種結(jié)構(gòu)。這樣就算是得到了對(duì)應(yīng)的點(diǎn)。然后在做一次坐標(biāo)變換,把中心點(diǎn)變換到坐標(biāo)原點(diǎn)上去。
(4)采用一個(gè)T-NET對(duì)姿態(tài)進(jìn)行調(diào)整,也就是旋轉(zhuǎn)到gt類似的姿態(tài);然后進(jìn)行的是對(duì)size和angel的回歸,作者采取了anchor的形式,多個(gè)size,多個(gè)angel。進(jìn)行回歸。值得注意的一點(diǎn)在于文章的corner-loss的使用。沒有細(xì)看這個(gè)損失。
講一下文章的貢獻(xiàn)點(diǎn)吧:
- 采用原數(shù)據(jù)輸入。。。文章的意思是沒有使用voxel的方式吧。是anchor_free的方法。
- 坐標(biāo)轉(zhuǎn)化的使用,很重要,這一點(diǎn)也不算亮點(diǎn),但是是個(gè)trick,后續(xù)的PointRCNN也是如此,多次坐標(biāo)變換得到一個(gè)好的結(jié)果,我覺得后者就是借鑒了本文的坐標(biāo)變換,如下圖的第三個(gè)和第四個(gè)所示:

這里提前給一下pointRCNN的變換,下圖所示,是不是也是移到中心,然后再正交對(duì)其。

- 貢獻(xiàn)點(diǎn),第三個(gè)是采用了一種策略去縮小proposal的范圍,這就是那個(gè)voxel的存在的問題,滿屏的anchor就很蠢。
那么依舊不足如下:
- F-PointNet假設(shè)一個(gè)frustum中只存在一個(gè)instance,這對(duì)一些密集區(qū)域的segmentation是不利的。
- 受到串行結(jié)構(gòu)的影響,F(xiàn)-PointNet中3d box estimation的結(jié)果嚴(yán)重依賴于2d detection,并且RGB信息對(duì)整個(gè)結(jié)構(gòu)是至關(guān)重要的。然而,圖像受到光照以及前后遮擋的影響,會(huì)導(dǎo)致2d detector出現(xiàn)漏檢的情況。
- 有的結(jié)構(gòu)可能只能在3D中才能被看到,一些小的被遮擋住的。
- 階段性過強(qiáng),對(duì)2D的依賴太大。
PointRCNN

依舊先講一下過程,兩階段法,很明確的proposals和RCNN兩個(gè)階段。
階段一的過程:
(1)采用pointnet對(duì)每個(gè)點(diǎn)進(jìn)行編碼得到point-wise特征,隨后同時(shí)進(jìn)行兩步操作,分割和生成候選框。
(2)分割。采用的方式也就是pointnet,不多說,這里會(huì)生成前景mask。
(3)generate proposals。每一個(gè)點(diǎn)首先都會(huì)生成一個(gè)box,但是不會(huì)去使用它,而是判斷這個(gè)點(diǎn)是否在Gt的內(nèi)部,如果是,那么我們就可以使用這個(gè)點(diǎn)的box做proposals;
(4)NMS刪選出一些候選的BOX
階段二:
(1)整合上述的特征,包括有point-wise features,坐標(biāo)和深度補(bǔ)償,mask。
(2)進(jìn)一步對(duì)BOX篩選和回歸。
優(yōu)勢點(diǎn):
- 標(biāo)準(zhǔn)的兩階段,Pointnet+RCNN這個(gè)名字就是致敬。不過是anchor_free的方法。
- proposals也是相當(dāng)于經(jīng)過一定的先驗(yàn)再得到的,會(huì)比voxel滿屏的anchor好很多。
- bin損失的使用,文章說了這樣會(huì)比直接使用smoothL1要準(zhǔn)確。
- 只采用點(diǎn)云作為輸入,完完全全的使用了點(diǎn)云特征,也就是存在Pointnet-wise這個(gè)feature。以及各種的feature的大雜燴,但是沒有使用局部算數(shù)平均值和offest是不是會(huì)更好一些。
- 變換坐標(biāo)這個(gè)key-point吧。
不足:
- 每一個(gè)點(diǎn)都會(huì)開始存在一個(gè)proposals,而不是只對(duì)前景點(diǎn)。作者當(dāng)然有考慮到這個(gè)問題,只是這樣子會(huì)比較好計(jì)算吧,畢竟一個(gè)統(tǒng)一的batch。這倒可以結(jié)合voxel的那個(gè)采樣的思想試一試。
- 大規(guī)模的輸入,固定到16384個(gè)點(diǎn),點(diǎn)多有點(diǎn)慢。沒有采樣之類的操作,當(dāng)然這也是為了得到一個(gè)比較高的召回率。
- 一個(gè)兩階段法都要去思考的問題,時(shí)間比較長。
PointPillars

很清晰的三個(gè)階段:
- 特征提取和轉(zhuǎn)化到二維
- 2D CNN骨架網(wǎng)絡(luò)提取2D特征
- 2D 檢測
只說一下第一步:
如何把3D特征轉(zhuǎn)化為2D圖片呢?
(1)分柱子。把俯視圖分成[Math Processing Error]H×W個(gè)小方格子,再沿著z軸向上拉就成了柱體。
(2)提特征。每個(gè)柱體中的點(diǎn)作為一個(gè)集合,采用和voxel一樣的方式提取特征,最后采用最大池化為[Math Processing Error][T,1,C]
(3)轉(zhuǎn)化為二維。因?yàn)?span data-mathml="" role="presentation" style="position: relative;">[Math Processing Error]T=H×W,所以我們最后可以變化成[Math Processing Error][H,W,C],這是啥,這不就是2D卷積的東西了嗎。
優(yōu)勢:
- 又快又好,結(jié)構(gòu)簡單優(yōu)雅。
- 利用了2D成熟的CNN
- anchor-free的方法,借鑒了前人voxelnet的方法,改進(jìn)了他的3D卷積部分和后續(xù)。
- 巧妙的轉(zhuǎn)換到2維度。
不足:
4.1.2 思考與探索
2D CNN的使用方法:
- 類似mv那種,使用對(duì)3D的投影得到其2維的圖像,再使用2D CNN,這樣做無疑是會(huì)出現(xiàn)信息損失的,另外呢,先把3D點(diǎn)云分割成若干個(gè)體素小塊,再把點(diǎn)個(gè)數(shù)當(dāng)做二維像素值,再使用2D CNN結(jié)構(gòu),這又只使用了密度信息,沒有局部幾何信息。都是不太好的。
- 第二種呢就是先對(duì)點(diǎn)的局部提取點(diǎn)特征(這都要?dú)w功于pointnet),然后在利用卷積進(jìn)行處理;這里呢需要說的是voxelnet是第一篇提取局部特征后去做檢測的,但是使用了3D voxel檢測,后續(xù)再把深度信息和通道結(jié)合成一個(gè)維度,采用二維的RPN。這里最大的雞肋就是這個(gè)3D CNN,后續(xù)有一篇sensors上的文章只改了這個(gè)3D CNN變成了 稀疏3D卷積的形式;這一篇PointPillars則是在這兩篇文章的基礎(chǔ)上做的,直接把3DCNN取消了,采用二維CNN接手后面的操作,雖然創(chuàng)新點(diǎn)不算特別亮眼,不過也著實(shí)巧妙。
就點(diǎn)云輸入的研究熱點(diǎn)
- anchor_free的方法,也就是研究如何經(jīng)過一定的處理再提出proposals,就像是F-pointnet首先經(jīng)過視錐縮小范圍,PointRCNN首先進(jìn)行一下前景分割,不過實(shí)際上每個(gè)點(diǎn)也是anchor;
- 把二維成熟的方法向著3維上靠。F-pointnet和voxelnet和pointpillars。PointRCNN的名字就來自二維。
一些重要的trick
- 旋轉(zhuǎn)對(duì)其和坐標(biāo)變換。在pointRCNN和F-pointnet都使用了的。
- 首先進(jìn)行pointent編碼,我覺得這個(gè)才是正確的點(diǎn)云使用方式,F(xiàn)-pointnet的后續(xù)開展肯定不多,而pointliarrs和voxelNet肯定會(huì)有更好的發(fā)展。
- 局部結(jié)構(gòu)特征的使用,這里講的是中心坐標(biāo)和中心偏移量的使用。
可能有發(fā)展的Idea
4.2匯報(bào)總結(jié)【19年9月9日——19年9月21日】
4.2.1 論文總結(jié)
4.2.1.1 GSPN

(1)預(yù)測一個(gè)對(duì)目標(biāo)ins的中心
(2)對(duì)每一個(gè)預(yù)測的中心采取一個(gè)多尺度特征提取的方式進(jìn)行特征提取。
(33)對(duì)提取到的特征和近似的分布進(jìn)行采樣聯(lián)合生成一個(gè)bbox。
- 運(yùn)用在檢測中會(huì)有什么樣的問題:
(1) 在訓(xùn)練時(shí),展現(xiàn)的內(nèi)容是KL-loss不收斂。
(2)研究了生成預(yù)測中心的loss,在實(shí)例分割中,隨機(jī)采樣的128個(gè)點(diǎn)都是有所屬實(shí)例,因此存在著對(duì)應(yīng)的GT,但是在Kitti數(shù)據(jù)集中,并不是所有點(diǎn)都有實(shí)例。因此網(wǎng)絡(luò)需要密集采樣,但是目前采樣點(diǎn)數(shù)過多就會(huì)導(dǎo)致無法訓(xùn)練。
(1)想要解決的問題:
- 根據(jù)提取到的特征結(jié)合分布信息(已經(jīng)被嵌入了gt的分布信息)生成這樣大小的size,就不用了根據(jù)不同大小設(shè)置不同size的anchor了。
- 可以同時(shí)做到多分類檢測
(2)網(wǎng)絡(luò)整體結(jié)構(gòu)圖可以如下所示:

(3)對(duì)代碼中5中LOSS的理解,看個(gè)人理解的博客。
4.2.1.2 Attention pointnet
上面一篇GSPN的文章重點(diǎn)是在于對(duì)實(shí)例點(diǎn)的生成ins,但是運(yùn)用到det的任務(wù)時(shí)就不能夠采樣到很多的gt的點(diǎn),導(dǎo)致需要密集采樣才可完成,這一篇文章是采用了GRU的attention,能夠從[Math Processing Error]12×12的區(qū)間中劃分感興趣的區(qū)域,這就可以解決上訴的采樣的問題,作者把這個(gè)叫做attention的機(jī)制,是屬于大場景下的找到目標(biāo)的方式,結(jié)合 博客理解。

(1)上面的idea正是由于密集采樣而導(dǎo)致了生成的問題,但是如果可以先粗略的attention這個(gè)所檢測的物體上,那么我們就可以在這個(gè)小區(qū)域上進(jìn)行采樣生成
(2)難點(diǎn):該文章的代碼結(jié)合了ROS的rospy,需要進(jìn)行一定的修改(小事情),不知道實(shí)際的效果如何。需要測試。
4.2.1.3 MEGV
這一篇 博客

(1)文章主要在nusense上做多目標(biāo)檢測,先分size再細(xì)每一個(gè)類別,目前還沒有開源。
(2)算是第一篇做anchor-free的文章。
(1)多分類的參考
(2)文章是屬于標(biāo)準(zhǔn)的pointpillars那一套做法,劃分網(wǎng)格,然后通過voxel提取特征,再轉(zhuǎn)到二維進(jìn)行RPN和多目標(biāo)檢測。
4.2.1.4 Fast Point R-CNN
也是很新的文章,同樣是賈佳亞組的工作(上一篇的PointRCNN),寫在博客這里

(1)在轉(zhuǎn)到二維的時(shí)候采用的多尺度聯(lián)合的方式。
(2)粗回歸后又進(jìn)行了原始點(diǎn)云的細(xì)回歸。因?yàn)関oxel會(huì)出現(xiàn)roi pooling的精度定位到網(wǎng)格上,因此網(wǎng)格個(gè)大小直接導(dǎo)致了回歸的精度,作者就此采用了原始點(diǎn)云的輸入進(jìn)行refine。
4.2.2 思路整理
- 3D檢測就是要就解決兩個(gè)問題:定位和分類。
(1)第一個(gè)問題,分類,目前做了多目標(biāo)檢測的文章只有19年8月才放上arxiv上的class_blanced的MEGV,采用nuscence檢測數(shù)據(jù)集,具體實(shí)現(xiàn)是采用了一個(gè)voxelnet的anchor方式,但是最后通過了對(duì)二維上的每一個(gè)voxel粗分類大致確定其size,然后再細(xì)分類得到對(duì)應(yīng)的類別;此外其他我見過只采用lidar數(shù)據(jù)輸入的文章只有單次訓(xùn)練一個(gè)類別,能不能通過voxelnet特征提取后,在最后的每一個(gè)二維的anchor上根據(jù)對(duì)應(yīng)的特征生成一個(gè)box而不是回歸,做到分類和回歸同時(shí)做。
(2)第二個(gè)問題,回歸,怎么定位一個(gè)目標(biāo)在平面的區(qū)域呢?目前的3D的方法有一個(gè)系列(voxelnet)是通過滿屏的anchor來把三維的降到二維,再對(duì)沒也給二維中每一個(gè)voxel回歸一個(gè)7維的定位信息(實(shí)際上就不是定位問題,而是一個(gè)回問題,這里并沒有失去一個(gè)遍歷的方式,全場景的anchor只有背景和不是背景,是前景的就在每一個(gè)anchor的位置回歸7個(gè)維度的定位信息),這個(gè)系列的文章包括了(voxelnet,Second,pointpillars,包括pointrcnn和fastpointRCNN)后面兩種方法實(shí)際上是采用了voxel特征提取的方式,但是自己的anchor是基于每一個(gè)中心點(diǎn)來提的,而faster_rcnn則更加回到voxelnet的方式,采用的結(jié)構(gòu)更加類似,文章還采用所謂的attention(非常簡單);但是19年CVPR上有一篇文章:attention-pointnet,這一篇文章,采用GRU的方式直接對(duì)輸入的點(diǎn)云塊采取注意力的形式得到去想要得到的塊,再通過坐標(biāo)變換得到相應(yīng)的旋轉(zhuǎn)回歸矩陣。還有一些不入流的方法,比如我覺得F-pointnet就算是一個(gè),采用一種先減少候選區(qū)域的方法去生成proposals的方法,PointRCNN也有一點(diǎn)這樣的想法,先通過場景語義分割得到對(duì)應(yīng)的一些粗略的點(diǎn)。目前按照論文的數(shù)量來說,voxelnet系列是絕對(duì)占有的一種,其首先提取每一個(gè)anchor的三維特征,再通過網(wǎng)絡(luò)降為成二維的anchor去預(yù)測訓(xùn)練的前景的概率和對(duì)應(yīng)的回歸的7個(gè)量,但是不得不說的一點(diǎn)是這樣會(huì)存在信息的丟失,如何使得信息較少的丟失是一個(gè)問題?這里在fast_point_rcnn的多尺度結(jié)合應(yīng)該會(huì)存在這個(gè)效果;但是依舊很大的問題,定位太依賴anchor,而不是區(qū)域中比較突出的特征去直接attention上,分類由于anchor在三維空間上的變化太大,這個(gè)系列都是通過固定size的形式,而不是采用生成的方式。
4.2.3 其他工作
- pointpillars 的kittiviewer:
在web上的界面已經(jīng)聯(lián)通了,具體操作:
(1)在服務(wù)器端運(yùn)行g(shù)ui界面的代碼:cd ./kittiviewer/frontend && python -m http.server
(2)在服務(wù)器運(yùn)行后端加載處理程序:python main.py main (目前還有問題)
(3)在本地上連接并監(jiān)聽對(duì)應(yīng)的端口:ssh -L 16666:127.0.0.1:8000 jty@192.168.190.212 ,然后在本地對(duì)應(yīng)的瀏覽器上輸入網(wǎng)址:http://127.0.0.1:16666/

|