作者 | 中國農業銀行 陸春暉
責編 | 晉兆雨
出品 | AI科技大本營
頭圖 | 付費下載於視覺中國
*文末有贈書福利
背景
圖像分類,是計算機視覺領域的一個核心問題,顧名思義就是輸入一張圖像,根據內容將其劃分到某一個特定的類別。與其他分類問題相比,主要的區別在於輸入是圖像,這就導致其特徵工程方法相對單一,通過圖像的像素值進行特徵提取。圖像分類問題可以用圖1來形象的描述。
圖1 圖像分類之「貓狗大戰」
圖像分類同時是其他很多高層視覺問題的基礎,例如目標檢測、圖像分割、目標追蹤、行為分析等等。它本身也在很多領域中有廣泛的應用,例如社會生活領域中的垃圾分類、安防領域的人臉識別、醫學領域的病灶識別、航空遙感領域的環境汙染檢測等等,本文中研究的具體問題屬於自動駕駛領域中的交通路況識別。
圖像分類的算法研究經歷了一個比較漫長的過程。早期的最近鄰分類(KNN)算法,將圖像的像素值用二維矩陣存儲,再將二維矩陣拉伸成一維向量,通過度量向量間距的方式進行分類。該類算法操作簡單易於實施,但是計算量大,並且容易受到樣本不平衡問題的影響;然後是多層感知器(MLP)算法,類似於KNN的特徵處理,讓一維向量特徵通過包含多個線性非線性函數組合的神經網絡結構,通過計算各類別可能性概率的方式進行分類。這一類算法在普通圖片上識別效果不錯,但是由於節點間的全連接方式會導致維度災難,因此不能擴展到更高解析度的圖像上;近些年伴隨深度學習的興起,基於卷積神經網絡(CNN算法)的算法越來越受歡迎。該類算法是通過卷積網絡分層提取圖像特徵,替代單純的向量特徵,再依次通過卷積層、池化層、激活層等神經網絡結構的運算,直接進行端到端的分類。這一類算法的網絡結構不再使用全連接模式,並且計算量更小,也不需要額外的特徵工程,因此使用範圍更廣。本文中進行交通路況識別所使用的模型就是基於卷積神經網絡的殘差網絡(ResNet)。
數據準備
本文以阿里巴巴高德地圖AMAP-TECH算法大賽 - 基於車載視頻圖像的動態路況分析為例,探索圖像分類問題的建模方案。該比賽需要通過由行車記錄儀拍攝的圖像序列,判斷對應道路當前時刻真實的路況狀態。本文中用於建立模型使用的數據集包含4200個圖像序列,每一個圖像序列包含(3-5)幀圖像,總共有16000多張圖片。一個圖像序列中包含的圖像如圖2所示。
圖2 一個圖像序列裡包含的多幀圖像
每個圖像序列中有一幅為參考幀(參考幀多為路況狀態容易清晰判斷的序列中間或最後一幀圖像),算法需要根據整個圖像序列來推斷路況的狀態,分為暢通、緩行、擁堵和封閉四種情況。每個狀態的參考幀示例如圖3所示。
圖3 不同路況狀態的圖像
數據集整體對應的路況狀態情況大致為暢通30%,緩行10%,擁堵20%,封閉40%。其分布如圖4所示。
圖4 不同路況狀態的分布
建模流程
問題分析
在初步分析數據集後,我們對整個問題有了一個大致的了解。從表面上看來,這是一個典型的圖像分類問題,需要輸入一張圖片,根據圖片內容判斷圖中路況屬於哪一個類型。再進一步觀察數據和結合交通的基本常識可以知道,大部分場景下,前方車輛的數量和密度決定了路況狀態,前方道路障礙物存在與否,決定了道路是否封閉。似乎需要先對圖片進行目標檢測,檢測出車輛和道路障礙物,再根據檢測結果進行分類。但是經過簡單的實驗,發現先目標檢測再進行分類的效果並不理想。研究背景知識得知,實際路況上可能存在諸如行駛道路有大量路邊停車,但不影響車輛行駛,狀態為暢通;或者行駛在雙向道路,對向車道擁堵,但行駛車道路況狀態為緩行或暢通;又或者圍擋、路障等障礙物是造成道路封閉的直接原因,但非道路區域存在大量噪聲(如路邊的圍擋、錐桶等)。加之目標檢測算法本身可能存在的誤差,都會影響分類的效果。
基於以上各種因素,還是決定放棄先目標檢測再進行分類的策略,直接進行圖像分類。進一步分析數據集,發現每個圖像序列都是多幀圖像,並且標明了參考幀,參考幀是整個圖像序列中最清晰或者最後一幀圖像,所有分類的判斷都基於參考幀。所以決定以參考幀為輸入圖像進行分類。
圖像分類問題的基本建模流程如圖5所示。
圖5 圖像分類問題建模流程
圖像預處理
圖像分類中,圖像質量的好壞會直接影響模型的效果,因此需要對圖像進行預處理。預處理的主要目的一方面是消除圖像中的無關信息,例如歸一化,另一方面是增強有用信息的可檢測性,例如圈定ROI區域。
歸一化
圖像歸一化是指對圖像進行一系列標準的處理變換,使之變換為一固定標準形式的過程,與其他特徵歸一化的目的相同,都是為了更快地訓練算法並達到更高的性能。本文中主要對圖像進行形狀歸一化和灰度歸一化,即將所有圖像統一調整成512*512的大小,並將每個像素值除以255,使得所有值都在0和1之間。圖像歸一化效果如圖6所示。
圖6 圖像歸一化效果
圈定ROI區域
圖像的ROI區域,就是 「感興趣的區域」(region of interest),從圖像中選擇重點關注的區域。使用ROI區域,可以減少處理時間和增加精度。本文中使用了兩種方式進行ROI區域的圈定,一種是固定區域,通過手動梯形框圈定;一種是動態跟蹤,利用幀差法圈定,並將這兩種方式和完全不圈定ROI區域方式的建模時間和精度進行了對比。
手動圈定ROI區域,主要是利用背景知識人工指定關注區域,即主要關注關鍵幀圖像中攝像頭所拍攝的車輛正前方的道路區域,忽視天空和兩旁的區域,再結合近大遠小的攝像頭成像特點,直接使用梯形框進行ROI區域的圈定,其圈定效果如圖7所示。由於歸一化後所有圖像尺寸統一,所以使用大小唯一固定的梯形框即可。
圖7 手動圈定ROI區域效果
利用幀差法圈定ROI區域,顧名思義,就是通過對不同幀的圖像做差來圈定感興趣的區域。幀差法是最為常用的運動目標檢測和分割方法之一,其基本原理是在圖像序列的相鄰兩幀或三幀間採用基於像素的時間差分,再通過閉值化來提取出圖像中的運動區域。結合本文中的場景,就是利用關鍵幀前一幀的圖像,和關鍵幀圖像做差,利用兩幀圖像間的差值圖像,圈定汽車行駛過程中隨著時間推移有明顯變動的區域,也就是ROI區域。
這個過程涉及到幾個關鍵步驟,首先是做差後的閾值化,其次是二值圖像輪廓的提取,最後是目標檢測框的合併,接下來分別進行闡述。
做差後的閾值化,需要提前設定一個閾值。當兩幀圖像做差之後,先通過形態學上的腐蝕和膨脹操作,減少空洞,然後將得到的差值圖像每一個位置的像素值都和閾值比較,比閾值大的地方像素值設為255,比閾值小的地方像素值設為0,這樣就得到一個二值化的運動區域圖像。cv2圖像庫中提供了cv2.threshold方法可以直接進行調用。
二值化的圖像需要提取輪廓,也可以藉助cv2圖像庫中的cv2.findContours和cv2.boundingRect方法來提取,可以得到運動區域的矩形邊框。需要注意一點,由於是車載圖像,攝像頭本身也在運動,導致兩幀圖像間變動的地方可能很多,但不是所有有變動的地方都是感興趣區域,對於提取出來區域面積過小的輪廓框可以忽略。
過濾掉面積過小的輪廓框後,需要進行目標檢測框的合併。其原理是將相交面積大於一定閾值的目標檢測框合併,根據各目標檢測框的坐標值來計算是否相交和相交面積大小。需要注意的是由於只是想圈定ROI區域,所以本文中只是計算出所有相交目標檢測框位置的中心點,再結合各目標檢測框大小,合併所有的相交目標檢測框作為唯一的ROI區域。幀差法圈定ROI區域的整體流程和效果如圖8所示。
圖8 幀差法圈定ROI區域流程和效果
如果使用幀差法圈定ROI區域,需要在圖像歸一化之前進行,避免因歸一化影響幀差效果,手動圈定ROI區域則沒有相關限制。
圖像加載和批處理
將圖像讀入內存時,會遇到的最大挑戰是圖像太大,會導致內存溢出。所以需要對圖像進行批量處理,一次只加載一個批次的圖像。本文使用PyTorch裡的Dataset類和DataLoader類來實現。
Dataset類主要是實現每張圖片的加載,自定義數據集需要重寫_init_,_len_,_getitem_三個函數。_init_函數初始化數據集路徑、標誌文件、等信息,_len_函數返回數據集大小,_getitem函數返回單張圖片及其標誌信息,包括圖片的預處理也在該函數裡進行。
DataLoader類主要實現批量圖像的加載,自定義加載類需要指定加載的數據集、每批次加載的圖片數量、是否打亂排序、以及提取數據的進程數等參數信息。每批次加載圖片的數量,也會影響模型訓練的收斂速度和準確性。
模型選擇和遷移學習
圖像分類可以用的深度學習模型很多,例如VGG、AlexNet、ResNet等等。綜合流行趨勢和分類效果,本文選擇了ResNet網絡結構進行分類。ResNet又名殘差神經網絡,指的是在傳統卷積神經網絡中加入殘差學習(residual learning)的思想,解決了深層網絡中梯度彌散和精度下降(訓練集)的問題,使網絡能夠越來越深,既保證了精度,又控制了速度。簡要的說,深度學習的網絡,隨著層次的加深,會出現退化,即在訓練集上的準確率飽和或者下降。而殘差網絡通過殘差學習和恆等映射,可以很好的避免這個問題,從而可以通過不斷加深網絡層數,提升模型的準確率。殘差網絡的具體原理,可以參考相應的論文和介紹,本文不做詳細討論。考慮到訓練的效率,本文選擇ResNet50展開訓練。
在實際訓練深度學習的模型時,可以通過遷移學習的方式進行。通俗來講,就是運用已有的知識來學習新的知識,即可以使用其他數據集上已經訓練好的分類模型,擬合我們自己的數據集,這樣可以加快擬合。Pytorch中可以直接使用已經預訓練好的ResNet50模型,同時為了適應自己的數據集,需要將最後一層Linear層進行替換,使其輸出為4通道,對應四種路況。
結論和展望
將數據集按8:2劃分成訓練集和驗證集,使用不圈定ROI區域、手動圈定ROI區域以及通過幀差法圈定ROI區域三種不同圖像預處理方式進行模型訓練的結果如表1所示。其中評測模型使用的錯誤率評價函數是交叉熵(Cross Entropy Loss),交叉熵描述了兩個概率分布之間的距離,當交叉熵越小說明二者之間越接近。準確率評價函數使用ACC(Accuracy),指在分類中,使用測試集對模型進行分類,分類正確的記錄個數佔總記錄個數的比例。
表1不同圖像預處理方式的模型訓練結果
可以通過表1發現,幀差法圈定ROI區域明顯在準確率上低於不圈定ROI區域和手動圈定ROI區域,這可能是因為幀差法在處理車載視頻圖像時,因為攝像頭本身也在移動,背景和前景區分度不大,導致圈定的ROI區域有比較大的誤差,損失了比較多有用的信息。不圈定ROI區域和手動圈定ROI區域準確率差別不大,但是訓練時間上不圈定ROI區域明顯比圈定ROI區域要快,這也符合客觀認知。
訓練過程中各模型隨著迭代次數的增加,在訓練集和驗證集上的誤差曲線和準確率曲線如圖9所示。
圖9誤差曲線和準確率曲線示意圖
可以發現幀差法圈定ROI的方法,在驗證集上的震蕩比較明顯,可能是因為幀差法容易受到外在因素的影響,比如光線、清晰度、以及拍攝角度等,健壯性不強。而手工圈定ROI和不圈定ROI在訓練後期都出現了比較明顯的過擬合現象,但是手工圈定ROI的健壯性要比不圈定ROI的強,這大概是因為手工圈定ROI指定了只關注道路所在區域,不易受到其他區域的噪音影響。
即使分類效果最好的模型,驗證集上的分類準確率也不過89.96%,在路況識別的實際應用中尚不是很理想,需要進一步優化。圖像分類模型的優化可以使用光線均衡、圖像增強等方式,也可以考慮使用更深的網絡,或者適當結合目標檢測、目標追蹤等技術。圖像分類技術在實際情境中的應用尚有很多困難和挑戰,希望本文能對同行業者有所啟發。
#歡迎留言在評論區和我們討論#
看完本文,對於機器學習的圖像分類你有什麼想說的?
歡迎在評論區留言
我們將在11 月 24 日精選出 3 條優質留言
贈送《人工智慧數學基礎》紙質書籍一本哦!