Measuring the quality of NYC Bike Lanes through street imagery
在另一篇文章中,我介紹了如何使用Open Street Cam(OSC)應(yīng)用收集街道圖像,在這片文章中,我將簡(jiǎn)單介紹我們對(duì)街道圖像使用到的圖像處理和計(jì)算機(jī)視覺技術(shù)。
我們也嘗試過使用 微軟定制視覺 產(chǎn)品,根據(jù)簡(jiǎn)單標(biāo)記的自行車道圖像,快速生成分類結(jié)果。Greg Dobler教授是NYU CUSP的圖像處理專家,我們咨詢了他來幫助我們構(gòu)建這些算法。
-
我們嘗試結(jié)合四種方式來評(píng)估自行車道質(zhì)量,并借鑒NACTO的“城市街道設(shè)計(jì)指南”:
- 騎行質(zhì)量,使用前面提到的app記錄的加速度數(shù)據(jù)測(cè)量。
- 自行車道的顏色,綠色車道相比沒有涂色的車道質(zhì)量更高,因?yàn)樗鼈兊目梢娦愿谩?/li>
- 符號(hào)和路面標(biāo)記,良好標(biāo)記的車道質(zhì)量更好。
- 可見道路缺陷,如裂縫和坑洼,越少越好。
以下重點(diǎn)是測(cè)量路面標(biāo)記和可見缺陷。這是一個(gè)幼稚的評(píng)分系統(tǒng),也是程序的第一次迭代(類似于許多計(jì)算機(jī)視覺應(yīng)用)。
檢測(cè)車道標(biāo)記
- 使用SciPy讀取原始圖像并顯示
import scipy.ndimage as nd
photoName = 'path'
img = nd.imread(photoName)
import matplotlib.pylab as plt
def plti(im, **kwargs):
"""
畫圖的輔助函數(shù)
"""
plt.imshow(im, interpolation="none", **kwargs)
plt.axis('off') # 去掉坐標(biāo)軸
plt.show() # 彈窗顯示圖像
plti(img)

- 裁去圖片的上半截(去除非自行車道的特征)和底部10%(去除我的自行車輪胎)(上圖沒有顯示出來這個(gè)特點(diǎn))
#圖片的行數(shù)和列數(shù)
nrow, ncol = img.shape[:2]
#從行數(shù)的一半開始 直到 0.9行數(shù)
img = img[nrow//2:(nrow-nrow//10),:,:]
plti(img)

- 使用顏色閾值過濾裁剪后的圖像,生成二值圖(黑白圖)
#分離出三層色彩
red, grn, blu = img.transpose(2, 0, 1)
#應(yīng)用閾值處理
thrs = 200
wind = (red > thrs) & (grn > thrs) & (blu > thrs)
plti(wind)

- 接著使用高斯模糊,帶寬值為40像素
# 使用高斯濾波模糊白色區(qū)塊
gf = nd.filters.gaussian_filter
blurPhoto = gf(1.0 * wind, 40)
plti(blurPhoto)

- 再次設(shè)定閾值,0、1二值圖像
# 閾值位于黑白之間的灰色區(qū)域
# 像素值大于閾值為1,小于為0
threshold = 0.16
wreg = blurPhoto > threshold
plti(wreg)

于是得到該車道標(biāo)記的最終得分:在最后一張圖中白色區(qū)域(即車道標(biāo)記)的占比(wreg.mean())。這里是13.2%。
檢測(cè)可見道路缺陷
- 讀取圖片
import scipy.ndimage as nd
photoName = r'path'
img = nd.imread(photoName)
plti(img)

- 同上面一樣的裁剪
#圖片的行數(shù)和列數(shù)
nrow, ncol = img.shape[:2]
#從行數(shù)的一半開始 直到 0.9行數(shù)
img = img[nrow//2:(nrow-nrow//10),:,:]
plti(img)

- 過濾, 這里使用中值濾波來保留邊緣
md = nd.filters.median_filter
# 模糊圖像
md_blurPhoto = md(img, 5)
plti(md_blurPhoto)
import cv2
lower = np.array([0, 10, 50])
upper = np.array([360, 100, 100])
hls = cv2.cvtColor(md_blurPhoto, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hls, lower, upper)
res = cv2.bitwise_and(hls, hls, mask = mask)

- 邊緣檢測(cè),使用canny邊緣檢測(cè)。
我們還在圖像上應(yīng)用了3x3高斯濾波器,然后對(duì)剩余的白色像素進(jìn)行侵蝕/擴(kuò)展操作以消除噪聲。
edges_cv = cv2.Canny(res, 200, 400)
#模糊邊緣
blurred_edges = cv2.GaussianBlur(edges_cv,(3,3),0)
# 只想保留這樣的裂縫:鄰近其他裂縫或大于某個(gè)最小閾值
bdilation = nd.morphology.binary_dilation
berosion = nd.morphology.binary_erosion
edges_2 = bdilation(berosion(blurred_edges, iterations=2), iterations=2)
defect_score = edges_2.mean()

最終缺陷得分6.95%,是上述處理后圖像中白色像素的百分比。
再次說明,這些技術(shù)只是第一次迭代,并受到光或攝像機(jī)角度變化的限制。不過,它們足夠測(cè)量我們?cè)诩~約市目前所見過的一些自行車道的質(zhì)量。

到現(xiàn)在,團(tuán)隊(duì)騎行超過50英里,收集了4500個(gè)街景
- 更進(jìn)一步,可以構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)(CNN),并用我們每個(gè)(標(biāo)記的)圖像訓(xùn)練它。