基於合成數據的實時三維車輛姿態估計

項目概況

我們的客戶對能自動夠捕獲更高質量車輛照片的AR應用程序很感興趣。本文重點介紹一種用於汽車姿態估計的技術。在該應用中,引導用戶站在距汽車一定角度和距離的位置,以標準化方式拍攝最佳照片。當用戶處於正確位置時,將自動捕獲高分辨率照片。

我們需要一種方法來大致確定用戶與所拍攝車輛的空間相對位置。但這只是一個初版程序,我們只有幾個星期的時間給出解決方案。為了縮短開發時間,該程序暫時只適用於特定車型。

目標與侷限
• 在較短的時間內建立可行的解決方案
• 幾乎實時的車輛姿態估計(<150 ms)
• 適用範圍為具有不同顏色或配置的特定車型
• 應用程序能捕獲高質量照片

在開始之前我們做了哪些嘗試

我們測試了下面幾種現有的三維物體姿態快速估計方案。

蘋果的ARKit三維物體識別

基於合成數據的實時三維車輛姿態估計

ARKit有掃描和識別剛性三維物體的程序接口,這似乎很有用。把程序並內置到ARKit中,就不用花時間開發掃描識別功能了。於是,我們主要關注車輛顏色的識別。我們購買了不同顏色的車模以測試ARKit的顏色識別效果。

基於合成數據的實時三維車輛姿態估計

我們先掃描一種顏色,然後再測試類似的顏色(即掃描白色,然後測試淺藍色)。在某些情況下,識別起了作用。效果雖然並不完美,但也許如果我們能掃描一整套基礎色,就可以穩定識別出我們可能看到的任何顏色的汽車。接下來在真車上試驗。試驗表明,在真車上識別效果會有些不同。即使在同一輛車上進行掃描和測試,結果也不可靠。有時,識別出的汽車可能會以多種形式稍微旋轉或平移。我們推測,車身油漆反光導致掃描識別車輛特徵變得困難(Apple說明書中特別提到反光物體不適合3D識別)。

第三方SDK

我們也測試了一些其他SDK,結果和ARKit類似。一些庫需要特定的“初始化模板”或匹配用戶位置來追蹤三維物體。這並不理想,因為我們想引導用戶到某些位置,因此識別需要從各種各樣的角度或位置進行。

照片質量

我們嘗試過的ARKit和SDK的另一個缺點是照片的質量和分辨率。使用ARKit可捕獲的最高分辨率為1920x1440。同時ARKit對焦點和曝光的控制也非常侷限。由於我們的目標就是需要捕捉高質量的車輛照片,因此,除了高分辨率外,我們還希望對聚焦和曝光進行精確控制。

建立基於神經網絡的姿態估計程序

基於合成數據的實時三維車輛姿態估計

由於使用第三方解決方案沒有成功,加上照片質量不佳,我們決定自己做一套方案,該方案可以配合蘋果的AVFoundation相機使用。我們選擇了神經網絡算法,因為這是姿態估計的最前沿技術,並且有很多開源項目和研究可以利用。

姿勢估計方法

對於給定圖像,我們如何預測圖像中對象的三維姿態?一種常見的方法是基於對象的標準模型來預測一組已知點的圖像位置。例如,給定一張汽車照片,它的左大燈在哪裡?這種特徵點足夠多,我們就可以估計汽車相對於相機的三維姿態。

網絡架構

如今,神經網絡算法在處理各種任務上顯示出驚人的準確性,加上網絡架構和硬件性能的不斷提升,神經網絡算法也能夠在移動設備上實時運行。

最近,我們遇到了一些基於CPM和堆疊式沙漏架構(stacked hourglass architectures)的動態人體姿態估計項目。

https://github.com/edvardHua/PoseEstimationForMobile

https://github.com/tucan9389/PoseEstimation-CoreML

這些項目包含許多有用的信息,可用於在移動設備上訓練和運行你的姿態估計程序。

他們使用的CPM網絡基於MobileNetV2,可以輸出14個身體部位(左肘,右膝等)的二維熱圖。

基於合成數據的實時三維車輛姿態估計

利用它,我們基本上可以獲取每個關鍵點層的最大激活位置,然後使用OpenCV的SolvePnP方法估算車輛姿態。下圖是我們使用最終的神經網絡程序對車輛照片進行可視化分析,以及姿態估計。由於輸出的熱圖分辨率有限,因此匹配並不完美。我們的模型輸出的熱圖分辨率為192x192,因此限制了單次估計精確度。

基於合成數據的實時三維車輛姿態估計

其他方法和資源

我們剛剛用了CPM法來實現快速啟動和運行,但還有其他方法可以解決此問題。有一種基於關鍵點的方法,是直接輸出關鍵點的二維座標。這使得它只能用於一輛車的評估,但對於我們來說也夠用。受Hart Woolery手勢估計算法的啟發,我們在MobileNet上又加了幾層點,即可最終輸出1x28組關鍵點座標。我們驚喜地發現,效果很好。如果有更多時間,我們可能會進一步研究這個方法,因為它比我們選擇的CPM模型要快一些。

如果你在尋找人體姿勢估計方法,請查看Jameson Toole最近關於fritz.ai人體姿勢估計的文章:https://heartbeat.fritz.ai/pose-estimation-on-ios-with-fritz-60c8e5f7d195

還有一種方法是直接輸出汽車的姿態參數,而不用經過中間的2d關鍵點(請參見BoxCars , MultiBin)。由於時間緊迫,我們沒有嚴格評估過前面說的這些方法,但是這些方法似乎確實好用。

查找汽車數據庫

選定了網絡架構,下一步就是找數據訓練它。人體姿勢估計的數據有很多(COCO, DensePose, MPII , Overview of body pose datasets),但是帶標註的車輛數據卻很少見。也有一些數據庫(Apollo,PASCAL 3d +),但它們似乎都有侷限。大多數數據庫都是針對自動駕駛汽車的,因此和大街上行駛的汽車有很大的差異,這可不是我們要研究的對象。 PASCAL 3D有3D汽車模型註釋,但基本是從網絡照片中收集的老車型。由於我們有所針對的目標車型,因此無需用其它車型照片訓練(要是有更多時間,我們希望算法能適用更多車型)。還有一些數據庫只允許用於非商業性項目。因此,我們嘗試使用合成數據,把車輛直接整合到我們所希望的測試環境中。

建立合成車輛數據庫

基於合成數據的實時三維車輛姿態估計

當無法獲得機器學習所需的大量訓練數據時,合成數據會派上用場。由於視頻遊戲行業的發展,我們可以利用Unity或Unreal等圖形引擎進行渲染,以及最初為遊戲而開發的3d資源。 儘管我們無法獲得像光線追蹤那樣的渲染質量,但數據產生的速度、數量以及低廉的成本使其非常有吸引力。我們選擇用Unity,因為比較有經驗,時間也比較緊張。

基於合成數據的實時三維車輛姿態估計

Unity甚至給合成數據的常見需求提供了便於上手的demo程序。我們最近也簡要介紹過如何使用SceneKit訓練AR足球遊戲中的腳部分割算法。

收集車輛3D模型

幸運的是有很多高質量的3D汽車模型。 對於非常高質量的模型,你可能要花幾百美元購買,但是有很多便宜或免費的模型可以直接從Unity asset store購買:

基於合成數據的實時三維車輛姿態估計

https://assetstore.unity.com/3d/vehicles/land

我們收集了大約10個形狀與目標車型相似的汽車模型,還有兩種我們正在測試的車型。

標註

準備好模型後,下一步便是標註姿態識別所需的關鍵點。由於人體姿勢算法需要14個關鍵點,我們也按這個來,以減少對這個pipeline的修改。此步驟需要建立14個空的參數對象,併為每種汽車模型定位它們:

基於合成數據的實時三維車輛姿態估計

通過命名每個關鍵點GameObject(例如left_back_wheel),在渲染過程中,我們就可以在保存標註數據時在GameObject中搜索關鍵點。我們也用深度測試來存儲關鍵點是否被遮擋,但是最終並沒有在訓練中使用。

在數據庫中創建變體

用合成數據訓練時,一個大問題是模型是否可以推廣到真實世界的圖像。這是一個活躍且不斷髮展的研究領域,有許多有趣的方法。蘋果公司的機器學習團隊發表了一篇有趣的文章,使用GAN技術提高合成眼圖像的真實感。我們選擇的方法是域隨機化。通過在訓練數據集中創建大量變化,模型可在無需微調的情況下推廣到目標數據集(現實世界)。

為了實現這一點,我們嘗試在渲染圖像之前儘可能使場景各元素隨機化。這裡一個主要問題是該程序會在意3D汽車模型上的一些次要細節,而這些細節不需要拓展到真實汽車的照片上。有一個經常被提及的軼事(可能不是真事):研究人員只用坦克被拍照的時間來訓練坦克探測器。無論這個例子是真是假,訓練數據和測試數據來自不同數據集時,都需要注意:確保轉移到新數據。

車型變種

對於每一個車型,我們都在車身次要細節上設置了一些變化。諸如油漆反射率,車牌位置和牌號,玻璃顏色,輪轂款式和位置以及其他一些東西。我們還對車身進行了輕微縮放。

基於合成數據的實時三維車輛姿態估計

基於合成數據的實時三維車輛姿態估計

環境和背景

一開始,我們搭建和購買了一些場景,包含建築物和真實的三維結構。獲取高質量的真實照片十分困難,而且可能會很貴、很耗時。幸運的是,我們找到了一個很棒的網站https://hdrihaven.com / ,它提供了高分辨率的免費環境地圖。這是我們必需的360 HDR全景圖,可以在你的目標物體後面進行渲染,可以為場景中的對象提供光照和反射。我們還使用渲染腳本來改變反射和曝光強度。

基於合成數據的實時三維車輛姿態估計

利用skybox,我們創造了一個簡單的平面作為汽車下面的地面。將不同的材質應用到地面上,偶爾將其全部隱藏在一起,產生了各種場景:

基於合成數據的實時三維車輛姿態估計

後處理效果

Unity有一個 “後處理堆棧(Post Processing Stack)”的功能,基本上是針對3D場景的照片牆過濾器。這些效果可能包括模糊、顏色分級等。你可以通過Package Manager或asset store將其添加到場景中,具體取決於你的Unity版本。除了內置的後期處理堆棧之外,我們還從asset store下載了另一組過濾器,名為SC post Effects Pack,價格為25美元。以下用後處理過濾器處理後的效果圖:

基於合成數據的實時三維車輛姿態估計

後處理的效果很微米,可能難以發現。能看出來的是景深,噪點,雲影,環境光遮擋,邊緣高光,色相偏移和黑線條。我們可以隨機調整這些參數以實現更多變化。

整合到一起

把變量都放到一起,我們最終得到如下圖像:

基於合成數據的實時三維車輛姿態估計

即使這些看起來還不像真實的街道場景,但背景和照明的多種變化也會迫使程序提取所有照片中一直不變的車輛特徵。如果僅使用街道場景,程序可能會將街道場景的元素納入到車輛特徵裡;期望汽車本身始終具有一定的陰影和照明特徵。

創建一個小型校驗數據庫

基於合成數據的實時三維車輛姿態估計

我們對數據庫偏差的關注迫使我們手動標註了一些實車照片的關鍵點。手動逐個標註14個關鍵點相當耗時,尤其是對於被遮擋的關鍵點。為了加快速度,我們構建了一個非常基本的wxPython應用程序,它只需要為每個圖像標記幾個關鍵點。為此,我們使用OpenCV的SolvePnP來擬合給定了幾個初始關鍵點的3D汽車模型,然後將其他關鍵點投影到圖像中。標註好後,我們使用imgaug庫實現隨機圖像強化。值得慶幸的是,imgaug支持隨圖像一起轉換關鍵點,因此不必手動變換點位置。強化後,我們得到大約1500張圖像來驗證我們的程序。

好用嗎?

對於我們測試的一組已知車型,第一輪測試的結果非常好。我們本以為應該需要在訓練中加入更多真實的圖像,或者更多地依賴於遷移學習,但最終證明不需要這樣做。即使在大量汽車上進行測試,也能得到合理的結果(見視頻)。這個模型還不能完美地應用於其他類型的車輛,因為這是把剛性的三維模型匹配到其它具有不同尺寸的汽車上。確實有給柔性車輛模型標記關鍵點的相關文獻,因此我們可能會進一步研究,探索更通用的車輛識別程序。

代碼

我們的計劃是,如果我們有時間整理和訓練更多的車型,我們將發佈部分pipeline。目前,我們已經上傳了一個iOS應用程序的demo代碼,該應用程序使用ARKit顯示估計的汽車姿態(記住,該模型是在固定視點範圍和汽車模型上訓練的):https://github.com/laanlabs/CarPoseDemo

作者:AIRX
原文鏈接:【AR三維物體識別跟蹤】基於合成數據的實時三維車輛姿態估計
來源:AIRX社區微信公眾號


分享到:


相關文章: