残缺棋盘的伪代码_伪激光雷达:无人驾驶的立体视觉
激光雷達(dá)成本高,用廉價(jià)的立體視覺(jué)替代它可行嗎?
作者:Jeremy Cohen編譯:McGL
公眾號(hào):PyVision(歡迎關(guān)注,專注CV,偶爾CS)
Pseudo-LiDAR — Stereo Vision for Self-Driving Cars
https://medium.com/think-autonomous/pseudo-lidar-stereo-vision-for-self-driving-cars-41fa1ac42fc9
深度學(xué)習(xí)和計(jì)算機(jī)視覺(jué)在自主系統(tǒng)中已經(jīng)瘋狂地流行起來(lái),現(xiàn)在到處都在使用。計(jì)算機(jī)視覺(jué),尤其是目標(biāo)檢測(cè),在過(guò)去的十年中發(fā)展迅速。
像 YOLO 或 RetinaNet 這樣的障礙物檢測(cè)算法提供了2D的邊界框,邊界框給出了障礙物在圖像中的位置。今天,大多數(shù)的目標(biāo)檢測(cè)算法都是基于單目 RGB 攝像頭,不能返回每個(gè)障礙物的距離。
為了返回每個(gè)障礙物的距離,工程師們將攝像頭與激光雷達(dá)(LiDAR)傳感器融合,激光雷達(dá)可以返回深度信息。利用傳感器融合技術(shù)將計(jì)算機(jī)視覺(jué)和激光雷達(dá)的輸出信息進(jìn)行融合。
這種方法的問(wèn)題是激光雷達(dá)很貴。工程師們使用的一個(gè)有用的技巧是對(duì)齊兩個(gè)攝像頭,并使用幾何學(xué)來(lái)確定每個(gè)障礙物的距離: 我們稱之為偽激光雷達(dá)(Pseudo-LiDAR)。
偽激光雷達(dá)利用幾何構(gòu)建了一個(gè)深度圖,并將其與目標(biāo)檢測(cè)圖結(jié)合起來(lái)得到3D距離。
如何利用立體視覺(jué)實(shí)現(xiàn)距離估計(jì)?
為了得到距離,下面是5步偽代碼:
我們開始吧!
1. 內(nèi)部和外部校準(zhǔn)
每個(gè)攝像頭都需要校準(zhǔn)。校準(zhǔn)意味著將一個(gè)具有[X,Y,Z] 坐標(biāo)的(現(xiàn)實(shí)世界)3D點(diǎn)轉(zhuǎn)換為具有[ X, Y]坐標(biāo)的2D像素。
攝像頭模型
今天的攝像頭使用的是小孔成像模型。
這個(gè)想法是使用一個(gè)針孔,讓少量的光線通過(guò)攝像頭,從而得到一個(gè)清晰的圖像。
如果圖像中間沒(méi)有這個(gè)屏障,每一道光線都會(huì)通過(guò),圖像就會(huì)變得模糊。它還允許我們確定焦距 f 用于縮放和更好的清晰度。
為了校準(zhǔn)攝像頭,我們需要將世界坐標(biāo)通過(guò)攝像頭坐標(biāo)轉(zhuǎn)換為像素坐標(biāo)。
攝像頭校準(zhǔn)過(guò)程- 從世界坐標(biāo)到攝像頭坐標(biāo)的轉(zhuǎn)換稱為外部校準(zhǔn)。外部參數(shù)稱為 R(旋轉(zhuǎn)矩陣)和 T(平移矩陣)。
- 從攝像頭坐標(biāo)到像素坐標(biāo)的轉(zhuǎn)換稱為內(nèi)部校準(zhǔn)。它要求攝像頭的內(nèi)部值,如焦距,光學(xué)中心,...... 內(nèi)參數(shù)是一個(gè)矩陣,我們稱為 K。
校準(zhǔn)
通過(guò)攝像頭校準(zhǔn)得到矩陣 K。
通常,我們使用跳棋盤和自動(dòng)算法來(lái)執(zhí)行它。當(dāng)我們這樣做時(shí),我們告訴算法棋盤中的一個(gè)點(diǎn)(如: 0,0,0)對(duì)應(yīng)于圖像中的一個(gè)像素(如: 545,343)。
校準(zhǔn)示例
為此,我們必須用攝像頭拍攝棋盤的圖像,比較一些圖像和一些點(diǎn)之后,校準(zhǔn)算法將通過(guò)最小化最小平方損失來(lái)確定攝像頭的校準(zhǔn)矩陣。
一般來(lái)說(shuō),校準(zhǔn)是必要的,以消除畸變。針孔攝像頭模型包括一個(gè)失真:“ GoPro 效應(yīng)”。為了得到一個(gè)矯正圖像,校準(zhǔn)是必要的。畸變可以是徑向的,也可以是切向的。校準(zhǔn)有助于消除圖像失真。
- f 是焦距ー(u0,v0)是光學(xué)中心: 這些是內(nèi)參數(shù)。
每個(gè)計(jì)算機(jī)視覺(jué)工程師必須了解和掌握攝像頭的校準(zhǔn)。這是最基本、最重要的要求。我們已經(jīng)習(xí)慣了在線處理圖像,從來(lái)不碰硬件,這是一個(gè)錯(cuò)誤。
齊次坐標(biāo)(Homogeneous Coordinates)
在攝像頭校準(zhǔn)過(guò)程中,我們有兩個(gè)公式來(lái)得到從世界到像素空間的一個(gè)點(diǎn) O:
- 世界到攝像頭的轉(zhuǎn)換
- 攝像頭到圖像的轉(zhuǎn)換
通過(guò)計(jì)算,你得到了這個(gè)等式:
- 從世界到圖像的轉(zhuǎn)換
如果你看一下矩陣的大小,它們并不匹配。
2. 對(duì)極幾何學(xué)(Epipolar Geometry)——立體視覺(jué)
立體視覺(jué)是基于兩幅圖像尋找深度。
我們的眼睛類似于兩個(gè)攝像頭。由于他們從不同的角度看一幅圖像,他們可以計(jì)算出兩個(gè)視點(diǎn)之間的差異,并建立一個(gè)距離估計(jì)。這里有一個(gè)雙目立體攝像頭設(shè)置的例子。你可以在大多數(shù)無(wú)人駕駛汽車中找到類似的東西。
立體相機(jī)如何估計(jì)深度?
假設(shè)你有兩個(gè)攝像頭,一個(gè)左,一個(gè)右。這兩臺(tái)攝像頭在同一個(gè) Y 軸和 Z 軸上對(duì)齊。基本上,唯一的區(qū)別就是它們的 X 值。現(xiàn)在,看看下面的計(jì)劃。
我們的目標(biāo)是估計(jì) O 點(diǎn)(表示圖像中的任意像素)的 Z 值,即距離。
- X 是對(duì)齊軸
- Y 是高度
- Z 代表深度
- 兩個(gè)藍(lán)色的平面對(duì)應(yīng)著每個(gè)相機(jī)拍攝的圖像
現(xiàn)在從鳥瞰的角度來(lái)考慮這個(gè)問(wèn)題。
立體設(shè)置的鳥瞰圖- xL 對(duì)應(yīng)左攝像頭圖像中的點(diǎn),類似的xR 對(duì)應(yīng)右攝像頭。
- b 是基線,是兩個(gè)攝像頭之間的距離。
- 對(duì)于左邊的攝像頭:
我們得到 Z = X*f / xL
- 對(duì)于右邊的攝像頭:
我們得到 Z = (X - b)*f/xR.
綜合起來(lái),我們可以找到正確的視差 d = xL - xR 和一個(gè)物體的正確 XYZ 位置。
3. 視差和深度圖
什么是視差?
視差是同一個(gè)三維點(diǎn)從兩個(gè)不同的攝像頭角度拍攝的圖像位置的差異。
立體視覺(jué)方程式由于立體視覺(jué),我們可以估計(jì)任何物體的深度(假設(shè)我們已經(jīng)做了正確的矩陣校準(zhǔn))。
它甚至可以計(jì)算一個(gè)深度圖或視差圖
為什么是“對(duì)極幾何” ?
為了計(jì)算視差,我們必須找到左側(cè)圖像中的每個(gè)像素,并將其與右側(cè)圖像中的每個(gè)像素匹配。這就是所謂的立體對(duì)應(yīng)問(wèn)題(Stereo Correspondance Problem)。
為了解決這個(gè)問(wèn)題——
- 取左圖中的一個(gè)像素
- 現(xiàn)在,要在右邊的圖像中找到這個(gè)像素,只需在極線上搜索它。沒(méi)有必要進(jìn)行二維搜索,點(diǎn)應(yīng)該位于這條線上,搜索范圍縮小到一維
這是因?yàn)閿z像頭是沿著同一軸線排列的。
以下是極線搜索的工作原理:
應(yīng)用: 構(gòu)建偽激光雷達(dá)(Pseudo-LiDAR)
現(xiàn)在,是時(shí)候把這些應(yīng)用到現(xiàn)實(shí)世界的場(chǎng)景中,看看我們?nèi)绾问褂昧Ⅲw視覺(jué)來(lái)估計(jì)物體的深度。如下兩張圖片——
這些圖像中的每一個(gè)都有外部參數(shù) R 和 t,事先由校準(zhǔn)確定(步驟1)。
視差
對(duì)于每個(gè)圖像,我們可以計(jì)算出相對(duì)于其他圖像的視差圖。我們將:
我們將得到左側(cè)和右側(cè)圖像的視差圖。
為了幫助你更好地理解視差的含義,我找到了這個(gè) Stack Overflow 解釋:
從視差到深度圖
我們有兩個(gè)視差圖,它告訴我們兩張圖像之間像素的位移。
對(duì)于每個(gè)攝像頭,我們有一個(gè)投影矩陣—— P_left 和 P_right。
為了估計(jì)深度,我們需要估計(jì) K,R 和 t。
- 每個(gè)攝像頭用OpenCV 函數(shù) cv2.decomposeProjectionMatrix () 可以從 P 中得到 K、 R 和 t
深度圖
現(xiàn)在是生成深度圖的時(shí)候了。
利用另一張圖像和視差圖,深度圖可以告訴我們圖像中每個(gè)像素的距離。整個(gè)過(guò)程如下:
- 從 K 矩陣得到焦距 f
- 使用平移向量 t 中的對(duì)應(yīng)值計(jì)算基線 b
- 使用之前的公式和計(jì)算出的視差圖 d 計(jì)算圖像的深度圖:
我們對(duì)每個(gè)像素進(jìn)行計(jì)算。
估計(jì)障礙物的深度
每個(gè)攝像頭我們都有了一個(gè)深度圖!現(xiàn)在,假設(shè)我們把這個(gè)和一個(gè)障礙物檢測(cè)算法結(jié)合起來(lái),比如 YOLO。對(duì)于每個(gè)障礙物,這樣的算法將返回一個(gè)包含4個(gè)數(shù)字的邊界框: [x1; y1; x2; y2]。這些數(shù)字表示框的左上角和右下角的坐標(biāo)。
例如,我們可以在左邊的圖像上運(yùn)行這個(gè)算法,然后使用左邊的深度圖。
現(xiàn)在,在那個(gè)邊界框里,我們可以得到最近的點(diǎn)。我們知道它,因?yàn)槲覀冎缊D像中每一個(gè)點(diǎn)的距離,這要?dú)w功于深度圖。邊界框的第一點(diǎn)將是我們到障礙的距離。
Wow! 我們剛剛建立了一個(gè)偽激光雷達(dá)!
由于立體視覺(jué),我們不僅知道圖像中的障礙物,還知道它們與我們的距離!這個(gè)障礙物離我們有28.927米遠(yuǎn)!
立體視覺(jué)是使用簡(jiǎn)單的幾何學(xué)和一個(gè)額外的攝像頭將二維障礙物檢測(cè)轉(zhuǎn)化為三維障礙物檢測(cè)的方法。今天,大多數(shù)新興的“邊緣”平臺(tái)支持立體視覺(jué),如新的OpenCV AI Kit或樹莓派和英偉達(dá)Jetson。
在成本方面,與使用激光雷達(dá)相比,它相對(duì)便宜,并且仍然提供了很好的性能。我們稱之為“偽激光雷達(dá)” ,因?yàn)樗梢匀〈す饫走_(dá)的功能: 檢測(cè)障礙物,對(duì)障礙物進(jìn)行分類,并對(duì)障礙物進(jìn)行三維定位。
References:
- Course Visual Perception for Self-Driving Cars by University of Toronto
總結(jié)
以上是生活随笔為你收集整理的残缺棋盘的伪代码_伪激光雷达:无人驾驶的立体视觉的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安装mysql提示找不到msv_安装my
- 下一篇: vectornator安卓_Vector