不許你歧視車道線,那也是路面的一部分 | 自動駕駛感知訓練
來自專欄量子位
水栗子 編譯自 Medium
量子位 報道 | 公眾號 QbitAI
感知,大概就是感受到周遭正在發生什麼,的一種能力。這項技能對自動駕駛來說太重要了。
自動駕駛汽車依靠攝像頭、激光雷達以及雷達等等感測器來感知周圍的變化。
一位名叫凱爾 (Kyle Stewart-Frantz) 的大叔,準備了一份指南,鼓勵大家在家訓練自動駕駛系統的感知能力。
當然,這個手冊並不是他出於愛好寫出來的,是隨著Lyft和Udacity聯合發起的感知挑戰賽 (Lyft Perception Challenge) ,而生的。
比賽考驗的就是系統能不能準確地感受到,可以行駛的路面在哪裡,周圍的汽車在哪裡。
挑戰賽中,能夠倚仗的所有數據,都來自車載的前向攝像頭。
攝像頭不存在?
這裡的「攝像頭數據」並非真實攝像頭記錄的影像,而是一個名為CARLA的模擬器生成的圖景。
畢竟,自動駕駛汽車的軟體開發大多是在模擬器中進行的,那裡快速的原型設計和迭代,比在現實世界裡使用真實硬體要高效得多。
那麼,來看一下CARLA給的數據長什麼樣——
左邊是模擬攝像頭捕捉的畫面,右邊則是與之對應的、標記好的圖像。
用這樣的數據來訓練演算法,讓AI能夠在從未見過的新鮮圖像里,判斷出哪些像素對應的是道路,哪些部分對應的是其他車輛。
這就是挑戰賽的目標。
車前蓋太搶鏡?
要完成比賽任務,自然會想到語義分割。用這種方式來訓練神經網路,成熟後的AI便可以判斷每個像素里包含的物體了。
第一步,是對標記好的圖像做預處理。比如,因為設定是「車載前向攝像頭」拍下的畫面,每一幅圖像都會出現車前蓋,可是如果這樣就把所有圖像判定為「車」,就不太好了。
所以要把顯示車前蓋的那些像素的值設為零,或者貼上其他的「非車」標籤。
第二步,車道標識和道路的值是不一樣的,但我們希望這些標識,可以被識別為路面的一部分。
所以,要把車道標識和路面,貼上一樣的標籤。
用Python寫出來,預處理功能就長這樣——
1 def preprocess_labels(label_image): 2 labels_new = np.zeros_like(label_image) 3 # Identify lane marking pixels (label is 6) 4 lane_marking_pixels = (label_image[:,:,0] == 6).nonzero() 5 # Set lane marking pixels to road (label is 7) 6 labels_new[lane_marking_pixels] = 7 7 8 # Identify all vehicle pixels 9 vehicle_pixels = (label_image[:,:,0] == 10).nonzero()10 # Isolate vehicle pixels associated with the hood (y-position > 496)11 hood_indices = (vehicle_pixels[0] >= 496).nonzero()[0]12 hood_pixels = (vehicle_pixels[0][hood_indices], 13 vehicle_pixels[1][hood_indices])14 # Set hood pixel labels to 015 labels_new[hood_pixels] = 016 # Return the preprocessed label image 17 return labels_new
預處理過後的結果,就是標記和之前的不太一樣了。
準備活動做好了,神經網路的正式訓練也就可以開始了。
誰是分類小公主?
那麼,大叔選的是怎樣的神經網路?
定製一個FCN-Alexnet或許是個不錯的選項,它擅長把每個像素分到不同的類別里。
循著以下鏈接,可以找到這個模型的詳細信息——
代碼:
https://github.com/shelhamer/fcn.berkeleyvision.org/tree/master/voc-fcn-alexnet論文:https://arxiv.org/pdf/1605.06211.pdf大叔用一個隨機梯度下降solver,把全部訓練數據跑了10次 (10 epochs) ,基礎學習率設的是0.0001。
評估訓練成果
拿訓練好的神經網路去跑驗證數據,凱爾得到了0.6685的F2值,以及0.9574的F0.5值 (前者更重視召回率,後者更重視準確率) 。系統每秒處理6.06幅圖像。
當然,視頻會比這些數字更加生動——
https://www.zhihu.com/video/986328668230168576然後還想怎樣?
大叔說,要讓神經網路表現更好,將來會搜集更多數據,涉及更加豐富的路況。
另外,要進行一系列的數據增強,讓數據和數據之間的差異更加明顯。
關於神經網路的結構,也還有其他選擇,比如為細粒度預測而生的FCN-8,值得嘗試。
還有,可以引入時態數據 (光流) ,來減少推斷需要的幀數,同時保持比較高的準確度。
模擬器不夠真?
當然,只有模擬器也是不夠的,自動駕駛系統終究要接受現實的考驗。
https://www.zhihu.com/video/986328763470258176 面對真實攝像頭傳出的畫面,系統的辨識結果並沒有非常理想。不過在許多幀裡面,神經網路都能夠在一定程度上,辨認出道路和車輛。真實世界和模擬器里的駕駛場景,還是不一樣的。
如果模擬器生成的圖像和現實更加接近的話,可能結果就會好一些了。
https://www.zhihu.com/video/986328893925666816不難看到,在和模擬器設定更為接近的路況下,系統的表現還是很不錯的。
如此看來,這隻AI還是很有前途。只要把模擬器造得更貼近真實,神經網路應該就能得到更有效的訓練。
這裡提供一段代碼,可以用來查看,演算法跑出的結果到底怎麼樣——
1 from moviepy.editor import VideoFileClip, ImageSequenceClip 2 import numpy as np 3 import scipy, argparse, sys, cv2, os 4 5 file = sys.argv[-1] 6 7 if file == demo.py: 8 print ("Error loading video") 9 quit1011 def your_pipeline(rgb_frame):1213 ## Your algorithm here to take rgb_frame and produce binary array outputs!1415 out = your_function(rgb_frame)1617 # Grab cars18 car_binary_result = np.where(out==10,1,0).astype(uint8)19 car_binary_result[496:,:] = 020 car_binary_result = car_binary_result * 2552122 # Grab road23 road_lines = np.where((out==6),1,0).astype(uint8)24 roads = np.where((out==7),1,0).astype(uint8)25 road_binary_result = (road_lines | roads) * 2552627 overlay = np.zeros_like(rgb_frame)28 overlay[:,:,0] = car_binary_result29 overlay[:,:,1] = road_binary_result3031 final_frame = cv2.addWeighted(rgb_frame, 1, overlay, 0.3, 0, rgb_frame)3233 return final_frame3435 # Define pathname to save the output video36 output = segmentation_output_test.mp437 clip1 = VideoFileClip(file)38 clip = clip1.fl_image(your_pipeline)39 clip.write_videofile(output, audio=False)
用到的可視化數據在這裡:
https://s3-us-west-1.amazonaws.com/udacity-selfdrivingcar/Lyft_Challenge/videos/Videos.tar.gz你也一起來吧?
當然,作為Lyft感知挑戰賽的研發負責人,凱爾大叔這番苦口婆心的目的,還是吸引更多的小夥伴摻和進來。
道路安全,人人有責。大概就是這個意思,吧。
入門選手的各位,感受一下Udacity的免費課程:
https://www.udacity.com/course/self-driving-car-engineer-nanodegree—nd013註:有善良的中文字幕
以及語義分割的詳細步驟:
https://medium.com/nanonets/how-to-do-image-segmentation-using-deep-learning-c673cc5862ef
— 完 —
歡迎大家關注我們的專欄:量子位 - 知乎專欄
誠摯招聘
量子位正在招募編輯/記者,工作地點在北京中關村。期待有才氣、有熱情的同學加入我們!相關細節,請在量子位公眾號(QbitAI)對話界面,回復「招聘」兩個字。
量子位 QbitAI · 頭條號簽約作者
?? ? 追蹤AI技術和產品新動態
推薦閱讀:
※Uber無人車事故究竟誰的錯?
※闖紅燈還鬧出了人命,自動駕駛離我們還有多遠?
※感測器網路的時間同步 | Paper Reading第一季第四期
※加州發布自動駕駛路測新規:沒有安全駕駛員也能上路
※轉載 | 麥肯錫未來出行研究中心:中國或將成為全球最大的自動駕駛市場