點擊上方「3D視覺工坊」,選擇「星標」算法
乾貨第一時間送達npm
做者:MoonSmile | 來源:知乎微信
https://zhuanlan.zhihu.com/p/79628068網絡
本文僅作學術分享,若有侵權,請聯繫刪除。架構
三維重建意義
三維重建做爲環境感知的關鍵技術之一,可用於自動駕駛、虛擬現實、運動目標監測、行爲分析、安防監控和重點人羣監護等。如今每一個人都在研究識別,但識別只是計算機視覺的一部分。真正意義上的計算機視覺要超越識別,感知三維環境。咱們活在三維空間裏,要作到交互和感知,就必須將世界恢復到三維。因此,在識別的基礎上,計算機視覺下一步必須走向三維重建。本文筆者將帶你們初步瞭解三維重建的相關內容以及算法。框架
港科大權龍教授函數
三維重建定義
在計算機視覺中, 三維重建是指根據單視圖或者多視圖的圖像重建三維信息的過程. 因爲單視頻的信息不徹底,所以三維重建須要利用經驗知識. 而多視圖的三維重建(相似人的雙目定位)相對比較容易, 其方法是先對攝像機進行標定, 即計算出攝像機的圖象座標系與世界座標系的關係.而後利用多個二維圖象中的信息重建出三維信息。學習
常見的三維重建表達方式
常規的3D shape representation有如下四種:深度圖(depth)、點雲(point cloud)、體素(voxel)、網格(mesh)。測試
深度圖優化
深度圖其每一個像素值表明的是物體到相機xy平面的距離,單位爲 mm。
體素
體素是三維空間中的一個有大小的點,一個小方塊,至關因而三維空間種的像素。
點雲
點雲是某個座標系下的點的數據集。點包含了豐富的信息,包括三維座標X,Y,Z、顏色、分類值、強度值、時間等等。在我看來點雲能夠將現實世界原子化,經過高精度的點雲數據能夠還原現實世界。萬物皆點雲,獲取方式可經過三維激光掃描等。
用三角網格重建
三角網格就是所有由三角形組成的多邊形網格。多邊形和三角網格在圖形學和建模中普遍使用,用來模擬複雜物體的表面,如建築、車輛、人體,固然還有茶壺等。任意多邊形網格都能轉換成三角網格。
三角網格須要存儲三類信息:
頂點:每一個三角形都有三個頂點,各頂點都有可能和其餘三角形共享。.
邊:鏈接兩個頂點的邊,每一個三角形有三條邊。
面:每一個三角形對應一個面,咱們能夠用頂點或邊列表表示面。
三角網格
三維重建的分類
根據採集設備是否主動發射測量信號,分爲兩類:基於主動視覺理論和基於被動視覺的三維重建方法。
主動視覺三維重建方法:主要包括結構光法和激光掃描法。
被動視覺三維重建方法:被動視覺只使用攝像機採集三維場景獲得其投影的二維圖像,根據圖像的紋理分佈等信息恢復深度信息,進而實現三維重建。
其中,雙目視覺和多目視覺理論上可精確恢復深度信息,但實際中,受拍攝條件的影響,精度沒法獲得保證。單目視覺只使用單一攝像機做爲採集設備,具備低成本、易部署等優勢,但其存在固有的問題:單張圖像可能對應無數真實物理世界場景(病態),故使用單目視覺方法從圖像中估計深度進而實現三維重建的難度較大。
近幾年表明性論文回顧
1、從單張圖像恢復深度圖
Depth, NIPS 2014, Cited by 1011
這篇論文思路很簡單,算是用深度學習作深度圖估計的開山之做,網絡分爲全局粗估計和局部精估計,對深度由粗到精的估計,而且提出了一個尺度不變的損失函數。
主體網絡
Scale-invariant Mean Squared Error
本文總結
(1)提出了一個包含分爲全局粗估計和局部精估計,能夠由粗到精估計的網絡。
(2)提出了一個尺度不變的損失函數。
2、用體素來作單視圖或多視圖的三維重建
Voxel, ECCV 2016, Cited by 342
這篇文章挺有意思,結合了LSTM來作,若是輸入只有一張圖像,則輸入一張,輸出也一個結果。若是是多視圖的,則將多視圖看做一個序列,輸入到LSTM當中,輸出多個結果。
Framework
Framework
如主框架所示,這篇文章採用深度學習從2D圖像到其對應的3D voxel模型的映射: 首先利用一個標準的CNN結構對原始input image 進行編碼;再利用一個標準 Deconvolution network 對其解碼。中間用LSTM進行過渡鏈接, LSTM 單元排列成3D網格結構, 每一個單元接收一個feature vector from Encoder and Hidden states of neighbors by convolution,並將他們輸送到Decoder中. 這樣每一個LSTM單元重構output voxel的一部分。總之,經過這樣的Encoder-3DLSTM-Decoder 的網絡結構就創建了2D images -to -3D voxel model 的映射。
3D LSTM 和 3D GRU
損失函數採用的是二分類的交叉熵損失,相似於在三維空間作分割,類別是兩類,分別是佔有或者不佔有。
損失函數
除了交叉熵loss能夠用做評價指標,還能夠把預測結果跟標籤的IoU做爲評價指標,以下圖所示:
IoU可做爲評價指標
Single Real-World Image Reconstruction
Reconstructing From Different Views.
本文總結
(1)採用深度學習從2D圖像到其對應的3D voxel模型的映射,模型設計爲Encoder+3D LSTM + Decoder。
(2)既適用單視圖,也適用多視圖。
(3)以體素的表現形式作的三維重建。
(4)缺點是須要權衡體素分辨率大小(計算耗時)和精度大小。
3、用點雲來作單張RGB圖像的三維重建
Point Cloud, CVPR 2017, Cited by 274
大多數現存的工做都在使用深度網絡進行3D 數據採用體積網格或圖像集合(幾何體的2D視圖)。然而,這種表示致使採樣分辨率和淨效率之間的折衷。在這篇論文中,做者利用深度網絡經過單張圖像直接生成點雲,解決了基於單個圖片對象生成3D幾何的問題。
點雲是一種簡單,統一的結構,更容易學習,點雲能夠在幾何變換和變形時更容易操做,由於鏈接性不須要更新。該網絡能夠由輸入圖像肯定的視角推斷的3D物體中實際包含點的位置。
模型最終的目標是:給定一張單個的圖片(RGB或RGB-D),重構出完整的3D形狀,並將這個輸出經過一種無序的表示——點雲(Point cloud)來實現。點雲中點的個數,文中設置爲1024,做者認爲這個個數已經足夠表現大部分的幾何形狀。
主框架
鑑於這種非正統的網絡輸出,做者面臨的挑戰之一是如何在訓練期間構造損失函數。由於相同的幾何形狀可能在相同的近似程度上能夠用不一樣的點雲來表示,所以與一般的L2型損失不一樣。
本文使用的 loss
倒角距離
搬土距離
對於解決2D圖片重構後可能的形狀有不少種這個問題,做者構造了一個 Min-of-N loss (MoN) 損失函數。
Min-of-N loss 的意思是,網絡G經過n個不一樣的r擾動項進行n次預測,做者認爲從直覺上來看,咱們會相信n次中會至少有一次預測會很是接近真正的答案,所以能夠認爲這n次預測與真正的答案的距離的最小值應該要最小。
實驗可視化結果
實驗可視化結果
實驗數值結果
本文總結
該文章的貢獻可概括以下:
(1)開創了點雲生成的先例(單圖像3D重建)。
(2)系統地探討了體系結構中的問題點生成網絡的損失函數設計。
(3)提出了一種基於單圖像任務的三維重建的原理及公式和解決方案。
整體來講,該篇文章開創了單個2D視角用點雲重構3D物體的先河,是一篇值得一看的文章。
先中場休息一下,簡單先分析一下:
根據各類不一樣的表示方法咱們能夠知道volume受到分辨率和表達能力的限制,會缺少不少細節;point cloud 的點之間沒有鏈接關係,會缺少物體的表面信息。相比較而言mesh的表示方法具備輕量、形狀細節豐富的特色。
不一樣表現形式的對比
Mesh: 我不是針對誰,我是想說在座的各位都是垃圾(depth、volume、point cloud)
因爲後邊的內容使用了圖卷積神經網絡(GCN),這裏簡要介紹一下:
f(p,l), f(p,l+1)分別表示頂點p在卷積操做先後的特徵向量;
N(p)指頂點p的鄰居節點;
W1,W2表示待學習的參數;
4、用三角網格來作單張RGB圖像的三維重建
Mesh, ECCV 2018, cited by 58
這篇文章提出的方法不須要藉助點雲、深度或者其餘更加信息豐富的數據,而是直接從單張彩色圖片直接獲得 3D mesh。
主框架
一、給定一張輸入圖像:Input image
二、爲任意的輸入圖像都初始化一個橢球體做爲其初始三維形狀:Ellipsoid Mesh
整個網絡能夠大概分紅上下兩個部分:
一、上面部分負責用全卷積神經網絡提取輸入圖像的特徵;
二、下面部分負責用圖卷積神經網絡來表示三維mesh,並對三維mesh不斷進行形變,目標是獲得最終的輸出(最後邊的飛機)。
主框架中的部份內容詳細的解釋
一、C表示三維頂點座標,P表示圖像特徵,F表示三維頂點特徵;
二、perceptual feature pooling層負責根據三維頂點座標C(i-1)去圖像特徵P中提取對應的信息;
三、以上提取到的各個頂點特徵再與上一時刻的頂點特徵F(i-1)作融合,做爲G-ResNet的輸入;
四、G-ResNet(graph-based ResNet)產生的輸出又作爲mesh deformable block的輸出,獲得新的三維座標C(i)和三維頂點特徵F(i)。
除了剛剛提到的mesh deformation,下面這部分還有一個很關鍵的組成是graph uppooling。文章提出這個圖上採樣層是爲了讓圖節點依次增長,從圖中能夠直接看到節點數是由156-->628-->2466變換的,這其實就是coarse-to-fine的體現,以下圖:
graph uppooling
這篇文章定義了四種loss來約束網格更好的形變:
loss
loss
本文的實驗結果
本文總結
該文章的貢獻可概括以下:
(1)文章實現用端到端的神經網絡實現了從單張彩色圖直接生成用mesh表示的物體三維信息;
(2)文章採用圖卷積神經網絡來表示3D mesh信息,利用從輸入圖像提到的特徵逐漸對橢圓盡心變形從而產生正確的幾何形狀;
(3)爲了讓整個形變的過程更加穩定,文章還採用coarse-to-fine從粗粒度到細粒度的方式;
(4)文章爲生成的mesh設計了幾種不一樣的損失函數來讓整個模型生成的效果更加好;
文章的核心思路就是給用一個橢球做爲任意物體的初始形狀,而後逐漸將這個形狀變成目標物體。
接下來介紹2019年的相關研究
因爲相關內容涉及到mask-rcnn,先回顧一下:
mask-rcnn是對 faster rcnn 的擴展或者說是改進,其增長了一個用於分割的分支,而且將RoIpooling 改爲了 RoIAlign。
mask rcnn
Mask RCNN能夠看作是一個通用實例分割架構;。
Mask RCNN以Faster RCNN原型,增長了一個分支用於分割任務。
Mask RCNN比Faster RCNN速度慢一些,達到了5fps。
可用於人的姿態估計等其餘任務;
首先介紹一篇2019年作三維重建的文章——Mesh R-CNN
這篇文章使用的正是mask rcnn 的框架,本篇文章提出了一種基於現實圖片的物體檢測系統,同時爲每一個檢測物體生成三角網格給出完整三維形狀。文中的系統mesh-rcnn是基於mask-rcnn的加強網絡,添加了一個網格預測分支,經過先預測轉化爲物體的粗體素分佈並轉化爲三角形網格表示,而後經過一系列的圖卷積神經網絡改進網格的邊角輸出具備不一樣拓撲結構的網格。
基本的pipeline
模型目標:輸入一個圖像,檢測圖像中的全部對象,並輸出全部對象的類別標籤,邊界框、分割掩碼以及三維三角形網格。
模型主框架基於mask-rcnn,使用一個額外的網格預測器來得到三維形狀,其中包括體素預測分支和網格細化分支。先由體素預測分支經過預選框對應的RoIAlign預測物體的粗體素分佈,並將粗體素轉化爲初始的三角形網格,而後網格細化分支使用做用在網格頂點上的圖卷積層調整這個初始網格的定點位置。總框架圖以下所示:
總框架圖
分支細節
一、Box/Mask 分支: 和mask-rcnn中的兩個分支同樣
二、體素預測分支:相似於mask-rcnn中的mask分支,輸入是RoIAlign,將預選框假設位於一個分割成 G*G*G個粗體素的空間,而後預測分割出來的粗體素佔用率。使用一個小的全卷積網絡來保持輸入特徵和體素佔用預測機率之間的對應關係。最後輸出用G個通道生成G*G的特徵圖,爲每一個位置提供一列體素佔用率分數。
三、體素佔用轉化爲網格表示:將體素佔用機率轉化爲二值化體素佔用以後,將每一個被佔用的體素被替換爲具備8個頂點、18個邊和12個面的立方體三角形網格(如上圖Cubify所示),而後合併相鄰佔用體元之間的共享頂點和邊,消除共享內面就能夠造成了一個拓撲結構依賴於體素預測的密集網格了。
網格細化分支
網格細化分支將初始的網格結構通過一系列精化階段(在文中做者使用了三個階段)來細化裏面的頂點位置。每一個精化階段都是輸入一個三角形網格),而後通過三個步驟得到更精細的網格結構:頂點對齊(得到頂點位置對應的圖像特徵);圖卷積(沿着網格邊緣傳播信息);頂點細化(更新頂點位置)。網絡的每一層都爲網格的每一個頂點維護一個三維座標以及特徵向量。
網格細化分支
一、頂點對齊:利用攝像機的內在矩陣將每一個頂點的三維座標投影到圖像平面上。根據獲取的RoIAlign,在每一個投影的頂點位置上計算一個雙線性插值圖像特徵來做爲對應頂點的圖像特徵。
二、圖卷積:圖卷積用於沿着網格邊緣傳播頂點信息,公式定義以下:
其中N(i)表示頂點i的鄰點集合,使用多個圖卷積層在局部網格區域上聚合信息。
三、頂點精化:使用2中更新後的頂點特徵使用下面公式來更新頂點位置:
只更改頂點位置,不更改三角形平面。
模型損失函數
模型損失函數
網格細化損失(從三個方面定義了三個損失函數)
網格細化損失
論文實驗
論文在兩個數據集上驗證模型:在ShapeNet數據集上對網格預測器進行了基準測試與最早進的方法進行比較而且對模型中的各個模塊進行單獨分析;在Pix3D數據集上測試完整Mesh R-Cnn模型在複雜背景下的物體三維網格預測結果。
在ShapeNet數據集:Mesh R-Cnn與其餘的模型比較結果如圖下:
其中Ours(Best)表示去掉形狀正則化損失後的結果,在後面的實驗中能夠發現,去掉形狀正則化損失後儘管在標準度量上有好的表現,可是在視覺層面上生成的網格並不如加上後的結果(Ours(Pretty))。
表格中比較了模型的完整版本以及不一樣去除模塊版本的表現,其中Full Test Set表示在完整測試集上的表現,Holes Test Set表示在打孔對象測試集中的表現;Voxel-Only表示不適用網格細化分支;Best和Perry分別表示不使用形狀正則化損失和使用形狀正則化損失;Ours(light)表示在網格細化分支中使用較輕量的非殘差架構。
儘管不使用邊長正則化器的訓練結果在標準度量中有更好的表現,可是會產生退化的預測網格,會致使輸出的網格出現許多重疊的面。
對比Pixel2Mesh模型,Pixel2Mesh模型的輸出結果是從一個標準橢圓變形獲得的,不能正確地建模有孔的物體。相反,Mesh R-Cnn能夠對任意拓撲結構的物體進行建模。
Pix3D數據集
Pix3D數據集
可視化結果
本文總結
該文章的貢獻可概括以下:
(1)借鑑mask rcnn 框架;
(2)由粗到細調整的思想;
(3)使用圖卷積神經網絡;
(4)使用多種損失來約束訓練;
最後介紹一篇論文,也是CVPR 2019的文章
CVPR 2019, cited by 0
這篇文章一樣是既能夠對單視圖,也能夠對多視圖進行重建,只不過這篇文章的重點不在這,而在於它能夠對不可見部分(不肯定性)進行建模。
基本思想就是,每一個輸入圖像均可以預測出多個重建結果,而後取交集就是最終結果。
下圖是主框架,左邊是訓練階段,右邊是測試階段。
主框架
左邊訓練階段的意思是,輸入一張圖像 I,對其加入多個噪聲(r),生成多個重建結果(S)(相似於條件生成模型)。對改模型的訓練要加約束,這裏提出了front constraint和diversity constraint。
右邊是測試階段,提出了一個一致性損失(consistency loss)來進行在線優化。
Distance Metric:
度量距離(這篇文章是基於點雲作的,因此須要用度量距離衡量兩個點雲集的距離)
Diversity Constraint: 目的是讓條件生成器生成的重建結果更具備多樣性。
Diversity Constraint:
Front Constraint: 對圖像前邊部分(部分點)有監督訓練,因此這裏有一個採樣過程,具體內容以下圖所示:
Front Constraint
對Front Constraint採樣部分的解釋
對於條件生成器生成的結果,用一個判別器去判斷這個形狀是否合理,公式以下:
Latent Space Discriminator(判別器是直接從WGAN-GP中拿來的)
判別器
訓練總的損失:
Inference (consistency constraint):
公式中Si 和 Sj 表明兩個點雲集合。
consistency constraint
條件生成器的結構:
條件生成器的結構(簡約版本)
條件生成器的結構(詳細版本)
實驗結果
本文總結
該文章的貢獻可概括以下:
(1)提出對不可見部分的不肯定性進行建模;
(2)使用了條件生成模型;
(3)提出了三種約束;
本文僅作學術分享,若有侵權,請聯繫刪文。
下載1
在「3D視覺工坊」公衆號後臺回覆:3D視覺,便可下載 3D視覺相關資料乾貨,涉及相機標定、三維重建、立體視覺、SLAM、深度學習、點雲後處理、多視圖幾何等方向。
下載2
在「3D視覺工坊」公衆號後臺回覆:3D視覺優質源碼,便可下載包括結構光、標定源碼、缺陷檢測源碼、深度估計與深度補全源碼、點雲處理相關源碼、立體匹配源碼、單目、雙目3D檢測、基於點雲的3D檢測、6D姿態估計源碼彙總等。
下載3
在「3D視覺工坊」公衆號後臺回覆:相機標定,便可下載獨家相機標定學習課件與視頻網址;後臺回覆:立體匹配,便可下載獨家立體匹配學習課件與視頻網址。