道路检测 | SNE-RoadSeg论文阅读
道路檢測 | SNE-RoadSeg: Incorporating Surface Normal Information into Semantic Segmentation for Accurate Freespace Detection論文閱讀
論文地址:https://arxiv.org/abs/2008.11351
開源代碼:https://github.com/hlwang1124/SNE-RoadSeg
論文作者及研究團(tuán)隊(duì)概述:
Rui (Ranger) Fan:Postdoc Fellow at UC San Diego
Hengli Wang:Ph.D. candidate at HKUST
Peide Cai:Ph.D. candidate at HKUST
Ming Liu:Associate Professor at HKUST
文章目錄
- 道路檢測 | SNE-RoadSeg: Incorporating Surface Normal Information into Semantic Segmentation for Accurate Freespace Detection論文閱讀
- 1.整體框架概述
- 2.SNE模塊
- 3.實(shí)驗(yàn)
- 3.1評估SNE
- 3.2評估SNE-RoadSeg
- 4.消融實(shí)驗(yàn)
- 5.總結(jié)
1.整體框架概述
?在這篇論文中,首先介紹了一個(gè)名為表面法線估計(jì)器( surface normal estimator ,SNE)的新型模塊,該模塊可以從密集的深度/視差圖像中高精度和高效率地推斷出表面法線信息。這個(gè)思想基于將所檢測的空間假設(shè)為一個(gè)地面平面,在這個(gè)平面上,各點(diǎn)具有相似的表面法線。 此外,提出了一種稱為RoadSeg的數(shù)據(jù)融合CNN架構(gòu),該架構(gòu)可以從RGB圖像和推斷出的表面法線信息中提取并融合特征,以進(jìn)行準(zhǔn)確的自由空間檢測。同時(shí),出于研究目的,作者發(fā)布了在不同光照和天氣條件下收集的大規(guī)模合成自由空間檢測數(shù)據(jù)集,名為Ready-to-Drive(R2D)道路數(shù)據(jù)集。
?本文提出的SNE-RoadSeg整體框架如下圖所示,它由SNE模塊,一個(gè)RGB編碼器,一個(gè)表面法線編碼器和一個(gè)具有緊密連接的跳躍連接的解碼器組成。 首先采用RGB編碼器和表面法線編碼器分別從RGB圖像和推斷的表面法線信息中提取特征圖,提取的RGB和表面法線特征圖通過逐元素求和進(jìn)行分層融合。然后通過密集連接的跳躍連接在融合器中再次融合特征圖,以恢復(fù)特征圖的分辨率。在RoadSeg的末尾,使用一個(gè)Sigmoid層來生成用于語義駕駛場景分割的概率圖。
本文使用ResNet作為RGB和表面法線編碼器的主干網(wǎng)絡(luò),它們的結(jié)構(gòu)彼此相同。具體來說,初始塊由卷積層,批處理歸一化層和ReLU激活函數(shù)層組成。然后,依次采用最大池化層和四個(gè)殘差層,以逐漸降低分辨率并增加特征圖通道的數(shù)量。ResNet具有五種體系結(jié)構(gòu):ResNet-18,ResNet-34,ResNet-50,ResNet-101和ResNet-152。RoadSeg對于ResNet-18和ResNet-34,c0-c4的通道數(shù)分別為64、64、128、256和512,對于ResNet-50,ResNet-101和ResNet-152,c0-c4的通道數(shù)分別為64、256、512、1024和2048。
?解碼器由兩類不同的模塊組成:特征提取器和上采樣層,這兩類模塊密集連接,實(shí)現(xiàn)靈活的特征融合。采用特征提取器從融合后的特征圖中提取特征,并保證特征圖分辨率不變。
2.SNE模塊
這部分是這篇論文的核心部分,提出了一種利用深度圖估計(jì)表面法線信息的方法。整體思路是對于有一幅深度圖,可以聯(lián)系CCS坐標(biāo)獲得每個(gè)pixel的三維信息,在此基礎(chǔ)上利用Sobel算子或者其他梯度算子計(jì)算水平和垂直梯度以此獲得法線信息的x,y方向分量。既然是是深度圖,那就可以用一個(gè)鄰域來估計(jì)z方向的法向量分量,這里采用K-D tree選出8個(gè)近鄰點(diǎn)來求鄰域中像素的深度差得到法向量。
下面具體分析這一部分:
?對于一幅深度圖像來說,其包含的信息就是空間中每個(gè)點(diǎn)的深度信息,在CCS坐標(biāo)中可以用照相機(jī)內(nèi)矩陣將二維的點(diǎn)的坐標(biāo)與三維點(diǎn)的坐標(biāo)相關(guān)聯(lián)。即:
其中K為照相機(jī)內(nèi)矩陣,x0、y0為圖像中心點(diǎn),fx和fy為水平焦距和垂直焦距。
?求解法向量最簡單的方法是通過三維點(diǎn)的坐標(biāo)去擬合一個(gè)空間平面方程,即:
這樣X,Y,Z的系數(shù)就是法向量的三個(gè)分量。結(jié)合上邊的兩個(gè)式子可以求出1/Z即逆深度圖:
用上述的逆深度圖式子分別對x,y求微分,即通過卷積求逆深度圖的水平和垂直分量,這樣就可以得到想要的點(diǎn)的法線信息的x,y分量。
?用選出的所求點(diǎn)的k個(gè)近鄰點(diǎn)的坐標(biāo)值的偏移量代入到逆深度圖的式子中可以得到k個(gè)z方向的法線分量,那么此時(shí)對于某一個(gè)點(diǎn)來說,估計(jì)出的法線信息就有如下k個(gè),即:
?此時(shí)對上述的法線信息做一個(gè)歸一化,得到k個(gè)單位向量,這些單位向量的起點(diǎn)是一致的,那么就可以認(rèn)為這些向量的終點(diǎn)落在一個(gè)以起點(diǎn)為圓心半徑為1的球體上,而我們要求解的最優(yōu)法向量一定是坐在這些k個(gè)向量分布最密集的地方,如下圖所示:
?基于這個(gè)理論,將歐式坐標(biāo)下的法線信息轉(zhuǎn)化為球坐標(biāo),即:
?式子中的θ表示傾角,φ表示方位,求解最優(yōu)的法向量通過最小化動量的方式得到最終的法線信息結(jié)果。
?整個(gè)SNE模塊的代碼如下所示:
import torch import torch.nn as nn import torch.nn.functional as Fclass SNE(nn.Module):"""Our SNE takes depth and camera intrinsic parameters as input,and outputs normal estimations."""def __init__(self):super(SNE, self).__init__()def forward(self, depth, camParam):h,w = depth.size()v_map, u_map = torch.meshgrid(torch.arange(h), torch.arange(w))v_map = v_map.type(torch.float32)u_map = u_map.type(torch.float32)Z = depth # h, wY = Z.mul((v_map - camParam[1,2])) / camParam[0,0] # h, wX = Z.mul((u_map - camParam[0,2])) / camParam[0,0] # h, wZ[Y <= 0] = 0Y[Y <= 0] = 0Z[torch.isnan(Z)] = 0D = torch.div(torch.ones(h, w), Z) # h, wGx = torch.tensor([[0,0,0],[-1,0,1],[0,0,0]], dtype=torch.float32)Gy = torch.tensor([[0,-1,0],[0,0,0],[0,1,0]], dtype=torch.float32)Gu = F.conv2d(D.view(1,1,h,w), Gx.view(1,1,3,3), padding=1)Gv = F.conv2d(D.view(1,1,h,w), Gy.view(1,1,3,3), padding=1)nx_t = Gu * camParam[0,0] # 1, 1, h, wny_t = Gv * camParam[1,1] # 1, 1, h, wphi = torch.atan(torch.div(ny_t, nx_t)) + torch.ones([1,1,h,w])*3.141592657a = torch.cos(phi)b = torch.sin(phi)diffKernelArray = torch.tensor([[-1, 0, 0, 0, 1, 0, 0, 0, 0],[ 0,-1, 0, 0, 1, 0, 0, 0, 0],[ 0, 0,-1, 0, 1, 0, 0, 0, 0],[ 0, 0, 0,-1, 1, 0, 0, 0, 0],[ 0, 0, 0, 0, 1,-1, 0, 0, 0],[ 0, 0, 0, 0, 1, 0,-1, 0, 0],[ 0, 0, 0, 0, 1, 0, 0,-1, 0],[ 0, 0, 0, 0, 1, 0, 0, 0,-1]], dtype=torch.float32)sum_nx = torch.zeros((1,1,h,w), dtype=torch.float32)sum_ny = torch.zeros((1,1,h,w), dtype=torch.float32)sum_nz = torch.zeros((1,1,h,w), dtype=torch.float32)for i in range(8):diffKernel = diffKernelArray[i].view(1,1,3,3)X_d = F.conv2d(X.view(1,1,h,w), diffKernel, padding=1)Y_d = F.conv2d(Y.view(1,1,h,w), diffKernel, padding=1)Z_d = F.conv2d(Z.view(1,1,h,w), diffKernel, padding=1)nz_i = torch.div((torch.mul(nx_t, X_d) + torch.mul(ny_t, Y_d)), Z_d)norm = torch.sqrt(torch.mul(nx_t, nx_t) + torch.mul(ny_t, ny_t) + torch.mul(nz_i, nz_i))nx_t_i = torch.div(nx_t, norm)ny_t_i = torch.div(ny_t, norm)nz_t_i = torch.div(nz_i, norm)nx_t_i[torch.isnan(nx_t_i)] = 0ny_t_i[torch.isnan(ny_t_i)] = 0nz_t_i[torch.isnan(nz_t_i)] = 0sum_nx = sum_nx + nx_t_isum_ny = sum_ny + ny_t_isum_nz = sum_nz + nz_t_itheta = -torch.atan(torch.div((torch.mul(sum_nx, a) + torch.mul(sum_ny, b)), sum_nz))nx = torch.mul(torch.sin(theta), torch.cos(phi))ny = torch.mul(torch.sin(theta), torch.sin(phi))nz = torch.cos(theta)nx[torch.isnan(nz)] = 0ny[torch.isnan(nz)] = 0nz[torch.isnan(nz)] = -1sign = torch.ones((1,1,h,w), dtype=torch.float32)sign[ny > 0] = -1nx = torch.mul(nx, sign).squeeze(dim=0)ny = torch.mul(ny, sign).squeeze(dim=0)nz = torch.mul(nz, sign).squeeze(dim=0)return torch.cat([nx, ny, nz], dim=0)3.實(shí)驗(yàn)
3.1評估SNE
?用平均角度誤差(average angular error)來量化SNE模塊的準(zhǔn)確性,通過與已有的法線信息估計(jì)方法SRI和LINE-MOD對比發(fā)現(xiàn)SNE的準(zhǔn)確性在室內(nèi)和室外場景下均優(yōu)于這兩種已有方法。定性和定量的分析如下圖所示:
3.2評估SNE-RoadSeg
?上面的兩幅圖像是對比了SYNTHIA道路數(shù)據(jù)集和R2D數(shù)據(jù)集后得到的結(jié)果示例。其中(i)RGB,(ii)Depth,(iii)SNE-Depth,(iv)RGBD,(v)SNE-RGBD;(1)Deep Labv3+,(2)U-Net,(3)SegNet,(4)GSCNN,(5)DUpsampling,(6)DenseASPP,(7)FuseNet,(8)RTFNet,(9)Depth-aware CNN,(10)MFNet和(11)RoadSeg。通過實(shí)驗(yàn)發(fā)現(xiàn),CNN架構(gòu)以RGB圖像作為輸入很大程度上受到光照條件的制約,并且對于嵌入SNE模塊和不嵌入SNE模塊最終的效果也有明顯的差別。
?從上邊幾幅圖可以看出,嵌入SNE的方法對于單模態(tài)CNN在IoU上提升2-12%,F-score提升1-7%;對于數(shù)據(jù)融合的CNN架構(gòu)在IoU上提升1-7%,在F-score提升1-4%。確確實(shí)實(shí)證明了SNE模塊使得道路區(qū)域高度可分。而且也可以看到,SNE-RoadSeg架構(gòu)也優(yōu)于上述其他CNN架構(gòu),在IoU上提升1.4-14.7%,F-score提升0.7-8.8%,證明了使用密集連接的跳躍連接可以幫助實(shí)現(xiàn)靈活的特征融合并且平滑梯度流可以產(chǎn)生道路檢測的精確結(jié)果。
?由上圖和表格可以看出,SNE-RoadSeg在MaxF,AP,PRE上都達(dá)到了最高的精度,總體在KITTI上排名第二。
4.消融實(shí)驗(yàn)
5.總結(jié)
?這篇論文的主要貢獻(xiàn)包括:1、提出了SNE一種表面法線估計(jì)方法,可以從深度/視差圖中高精度、高效率的推斷表面法線信息;2、提出了一個(gè)名為SNE-RoadSeg的數(shù)據(jù)融合CNN架構(gòu),通過融合從RGB以及法線圖像提取的特征中高精度的實(shí)現(xiàn)道路檢測;3、發(fā)布了一個(gè)用于自動駕駛道路檢測的合成數(shù)據(jù)集R2D。為了證明SNE模塊的靈活性與有效性將其嵌入到十個(gè)最先進(jìn)的CNN架構(gòu)中評估了它們在道路檢測中的性能,證明了其可以提高這些CNN的性能同時(shí)也證明了SNE-RoadSeg在道路檢測上的性能更優(yōu)。
總結(jié)
以上是生活随笔為你收集整理的道路检测 | SNE-RoadSeg论文阅读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法分析与设计——蛮力法0/1背包
- 下一篇: 算法分析与设计——分治法最近点对