李 蔣
(蘇州建設(shè)交通高等職業(yè)技術(shù)學(xué)校, 江蘇 蘇州 215100)
2021年9月22日, 華為發(fā)布 《智能世界2030》 報告, 多維探索了未來10年的智能化發(fā)展趨勢。 報告中明確預(yù)測,到2030年全球電動汽車占所銷售汽車總量的比例將會達到50%, 中國自動駕駛新車滲透率將會達到20%, 整車算力超過5000TOPS, 智能汽車網(wǎng)聯(lián)化 (C-V2X) 滲透率預(yù)計會達到60%。 中國國家發(fā)展改革委員會等11個部委于2020年2月聯(lián)合印發(fā)了 《智能汽車創(chuàng)新發(fā)展戰(zhàn)略》, 提出到2025年實現(xiàn)有條件自動駕駛的智能汽車達到規(guī)?;a(chǎn), 實現(xiàn)高度自動駕駛的智能汽車在特定環(huán)境下市場化應(yīng)用, 到2050年全面建成中國標(biāo)準(zhǔn)智能汽車體系。
在這樣的時代背景下, 中國自動駕駛汽車技術(shù)領(lǐng)域的研究開始快車模式。 在整個自動駕駛技術(shù)研究領(lǐng)域中, 復(fù)雜環(huán)境中目標(biāo)物體的識別和判別一直以來都屬于一項高難度的挑戰(zhàn), 也是亟需要解決的重點任務(wù)之一。 本文基于YOLO算法對實景圖像進行目標(biāo)識別和檢測, 以期可以進一步在視頻流中進行交通標(biāo)志、 行人、 汽車等物體的識別和檢測, 不僅是解決一個識別和檢測的問題, 更是提出一種解決問題的思路和方法。
目前, 在自動駕駛技術(shù)研究領(lǐng)域比較流行的目標(biāo)檢測算法, 主要是CNN (卷積神經(jīng)網(wǎng)絡(luò))、 R-CNN、 faster RCNN、 SSD和YOLO等。 因為設(shè)計這些算法的初衷都是為了格物致知, 所以每種算法都有自己十分突出的優(yōu)點, 但同時也都存在一些不可回避的缺點, 筆者簡單介紹幾種典型算法的優(yōu)缺點。
CNN是從視覺皮層的生物學(xué)上獲得啟發(fā), 首先將圖像作為輸入傳遞到網(wǎng)絡(luò), 然后通過各種卷積層和池化層的處理, 最后以對象類別的形式獲得輸出。 對于每個輸入對象,會得到一個相應(yīng)類別作為輸出, 因此可以使用這種技術(shù)來檢測圖像中的各種對象。 CNN網(wǎng)絡(luò)結(jié)構(gòu)如圖1所示。
圖1 CNN網(wǎng)絡(luò)結(jié)構(gòu)
使用這種方法會面臨的問題在于圖像中的對象可以具有不同的寬高比和空間位置。 例如, 在某些情況下, 對象可能覆蓋了大部分圖像, 而在其他情況下, 對象可能只覆蓋圖像的一小部分, 并且對象的形狀也可能不同。 為了精準(zhǔn)判斷, 需要劃分大量的區(qū)域進行采集、 識別和判定, 這會生成大量的數(shù)據(jù), 而且要達到準(zhǔn)確判定目標(biāo)需要花費大量的計算時間。
R-CNN算法不是在大量區(qū)域上工作, 而是在圖像中提出了一堆方框, 并檢查這些方框中是否包含任何對象。 RCNN使用選擇性搜索從圖像中提取這些框。 R-CNN網(wǎng)絡(luò)結(jié)構(gòu)如圖2所示。
圖2 R-CNN網(wǎng)絡(luò)結(jié)構(gòu)
R-CNN模型存在的主要問題是不能快速定位物體, 原因是模型算法對于單元格產(chǎn)生候選框過多, 且易重復(fù), 而每一次選擇都需要代入卷積神經(jīng)網(wǎng)絡(luò)模型加以識別, 得出物體的預(yù)測置信度和具體坐標(biāo)位置, 這一步驟在單一圖片的處理上會消耗極多的時間。 這使得R-CNN在面對大量數(shù)據(jù)集時幾乎不可能被應(yīng)用。
Faster R-CNN使用 “區(qū)域提議網(wǎng)絡(luò)”, 即RPN。 RPN將圖像特征映射作為輸入, 并生成一組提議對象, 每個對象提議都以對象分數(shù)作為輸出。Faster R-CNN網(wǎng)絡(luò)結(jié)構(gòu)如圖3所示。
圖3 Faster R-CNN網(wǎng)絡(luò)結(jié)構(gòu)
但是所有對象檢測算法都使用區(qū)域來識別對象, 且網(wǎng)絡(luò)不會一次查看完整圖像, 而是按順序關(guān)注圖像的某些部分, 這樣會帶來兩個復(fù)雜性的問題: ①該算法需要多次通過單個圖像來提取到所有對象; ②由于不是端到端的算法, 不同的系統(tǒng)一個接一個地工作, 整體系統(tǒng)的識別性能對于先前系統(tǒng)的表現(xiàn)效果有較大依賴, 對最終識別結(jié)果也有較大影響。
PyTorch 是一個開源的深度學(xué)習(xí)框架, 該框架由Facebook人工智能研究院的Torch7團隊開發(fā), 它的底層基于Torch, 但實現(xiàn)與運用全部是由python來完成。 該框架主要用于人工智能領(lǐng)域的科學(xué)研究與應(yīng)用開發(fā)。
PyTroch最主要的功能有兩個: 一是擁有GPU張量, 該張量可以通過GPU加速, 達到在短時間內(nèi)處理大數(shù)據(jù)的要求; 二是支持動態(tài)神經(jīng)網(wǎng)絡(luò), 可逐層對神經(jīng)網(wǎng)絡(luò)進行修改,并且神經(jīng)網(wǎng)絡(luò)具備自動求導(dǎo)的功能。 深度學(xué)習(xí)框架PyTroch如圖4所示。
圖4 深度學(xué)習(xí)框架PyTroch
YOLO (全稱為You Only Look Once, 譯為: 你只看一次), 是一個經(jīng)典的one-stage的算法, 該算法與two-stage的算法相比, 減少或簡化了預(yù)選的步驟, 直接把檢測問題轉(zhuǎn)換為回歸問題, 只需要一個CNN網(wǎng)絡(luò)就可以了。 YOLO最為核心的優(yōu)勢就是速度非常快, 非常適合做實時的檢測識別任務(wù), 應(yīng)用在自動駕駛技師領(lǐng)域, 尤其是現(xiàn)在基于攝像頭的視頻處理就需要很快的速度。 當(dāng)然它同樣存在缺點, 因為少了預(yù)選的步驟, 在檢測識別的品質(zhì)上通常不會有預(yù)期的那么好。 YOLOv3與其他目標(biāo)檢測算法對比如圖5所示。
圖5 YOLOv3與其他目標(biāo)檢測算法對比
YOLOv3在當(dāng)年和其他算法相比, 無論是速度還是mAP(mean Average Precision, 綜合衡量檢測效果) 值都遠遠優(yōu)于其他算法。 YOLO目前已經(jīng)有5個版本, v3版本是其中最經(jīng)典的一個版本, 應(yīng)用率也較為廣泛。 因此, 本文主要應(yīng)用YOLOv3版本進行目標(biāo)檢測。
YOLOv3和之前的版本相比, 整體的網(wǎng)絡(luò)架構(gòu)沒有改變, 但YOLOv3相較之前版本有很大的提升, 其中最大的改進有以下4點。
1) 改進網(wǎng)絡(luò)結(jié)構(gòu), YOLOv3僅使用卷積層, 使其成為一個全卷積網(wǎng)絡(luò)。 作者提出一個新的特征提取網(wǎng)絡(luò)——Darknet-53, 它包含53個卷積層, 每個后面都跟隨著batch normalization層和leaky ReLU層, 沒有池化層, 使用步幅為2的卷積層替代池化層進行特征圖的降采樣過程, 這樣可以有效阻止由于池化層導(dǎo)致的低層級特征的損失。 Darknet-53基本網(wǎng)絡(luò)結(jié)構(gòu)如圖6所示。
圖6 Darknet-53基本網(wǎng)絡(luò)結(jié)構(gòu)
2) 特征做得更加的細致, 融入多尺度特征圖信息來預(yù)測不同規(guī)格的物體, 在多個尺度的融合特征圖上分別獨立做檢測。 由于YOLO是針對于目標(biāo)識別速度的算法, 使其更加適合小目標(biāo)檢測。
3) Anchor (先驗框) 更加豐富, 為了能夠全面檢測到不同大小的物體, 設(shè)計了3種scale, 每種3個規(guī)格, 一共9種, 其初始值依舊由K-means聚類算法產(chǎn)生。 YOLOv3先驗框種類如圖7所示。
圖7 YOLOv3先驗框種類
4) YOLOv3一方面采用全卷積 (YOLOv2中采用池化層做特征圖的下采樣, v3中采用卷積層來實現(xiàn)), 另一方面引入殘差 (Residual) 結(jié)構(gòu), Res結(jié)構(gòu)可以很好地控制梯度的傳播, 避免出現(xiàn)梯度消失或者爆炸等不利于訓(xùn)練的情形。這使得訓(xùn)練深層網(wǎng)絡(luò)難度大大減小, 因此才可以將網(wǎng)絡(luò)做到53層, 精度提升比較明顯。 此外, softmax (歸一化指數(shù)函數(shù)) 的改進, 可以預(yù)測多標(biāo)簽任務(wù)。
YOLOv3實現(xiàn)原理: 通過輸入416×416像素的圖片, 將圖片劃分成13×13、 26×26、 52×52大小的網(wǎng)格圖, 通過網(wǎng)絡(luò)去判斷我們需要識別的類別的中心點分別在哪一個網(wǎng)格的置信度比較大, 結(jié)合3種特征圖輸出的置信度, 只保留置信度最大的框, 最終通過自己認為設(shè)置的先驗框和真實類別的中心點反算出真實框的位置。
首先安裝labelme工具, 對于自己的數(shù)據(jù)集進行打標(biāo)簽工作。 如下:
安裝完成, 運行軟件, 把自己需要訓(xùn)練的數(shù)據(jù)集打上標(biāo)簽。 訓(xùn)練的數(shù)據(jù)越多, 最終目標(biāo)檢測的效果可能越好。雖然我們使用了遷移學(xué)習(xí), 但一般也需要上千張圖片才可以達到一個比較理想的結(jié)果, 根據(jù)自己的需要調(diào)整標(biāo)注訓(xùn)練集。 數(shù)據(jù)集打標(biāo)簽如圖8所示。
圖8 數(shù)據(jù)集打標(biāo)簽
標(biāo)注完成, 生成.json文件, 但是該文件還不可以直接使用, 需要轉(zhuǎn)換格式。
利用Git工具編寫create_custom_model.sh 文檔。 因為本文研究的只是一個三分類任務(wù), 所以參數(shù)定為3, 運行后會自動生成一個YOLOv3-custom.cfg配置文件。 修改.sh配置文檔如圖9所示。
圖9 修改.sh配置文檔
因為labelme中生成標(biāo)簽的格式是X1、 X2、 Y1、 Y2實際坐標(biāo)值, 而YOLOv3中需要的格式是中心點的X1、 Y1,以及W和H值, 并且數(shù)值為圖片中的相對位置 (取值范圍0-1)。 因此, 需要對標(biāo)簽中的坐標(biāo)值進行轉(zhuǎn)換。 利用相關(guān)代碼對坐標(biāo)格式進行轉(zhuǎn)換, 轉(zhuǎn)換后形成YOLOv3所需的TXT文件。
首先, 我們還需要完善訓(xùn)練過程中數(shù)據(jù)與標(biāo)簽的路徑。轉(zhuǎn)換后的標(biāo)簽文件文件名要和圖像的文件名完全一致, 文件分別放在不同的相應(yīng)文件夾中。
接下來, 把.names文件中的類別改成自己需要做的類別名稱, 例如person、 car、 traffic light等。 然后, 修改train.txt和valid.txt中的文件對應(yīng)的路徑。 最后, 修改custom.data文件中的配置。
訓(xùn)練代碼train.py需要設(shè)置運行參數(shù)如下:--model_def config/YOLOv3-custom.cfg--data_config config/custom.data--pretrained_weights weights/darknet53.conv.74 #如果需要在別人預(yù)訓(xùn)練權(quán)重基礎(chǔ)上進行遷移學(xué)習(xí), 則需要配置該項運行參數(shù) (不進行遷移學(xué)習(xí)則需要上萬張圖片的數(shù)據(jù)量)。
本文在實驗中利用自己標(biāo)注的1000張數(shù)據(jù)集進行訓(xùn)練,由于數(shù)據(jù)集只做了三分類, 標(biāo)注工作量尚可。 訓(xùn)練過程中采用了darknet53預(yù)訓(xùn)練模型進行遷移學(xué)習(xí), 減少由于數(shù)據(jù)量較少造成的訓(xùn)練結(jié)果不理想。 利用訓(xùn)練好的模型進行目標(biāo)檢測, 通過對100張圖片進行測試, 發(fā)現(xiàn)無論mAP值還是檢測速度都比較滿意, 實際目標(biāo)檢測結(jié)果如圖10所示。
圖10 實際目標(biāo)檢測結(jié)果
本文利用YOLOv3進行目標(biāo)檢測與識別訓(xùn)練, 主要針對交通信號燈進行試驗。 該算法也可運用在視頻流中的目標(biāo)檢測, 并且取得了較高的檢測準(zhǔn)確率和檢測速度, 基本滿足了圖片檢測和視頻檢測的預(yù)期需求。 同時, 該方法不局限于交通監(jiān)控視頻中的車輛檢測, 也可以被應(yīng)用于其他領(lǐng)域的目標(biāo)檢測與識別, 具有很好的應(yīng)用場景兼容性。
但是在研究過程中, 我們嘗試將該算法移植到ubantu系統(tǒng)上, 試圖利用嵌入式系統(tǒng)進行實時攝像頭的目標(biāo)檢測時, 遇到了一些軟件配置上的問題未能突破。 此外, 該檢測識別方法在光照強度不足時, 例如雨天、 夜間無照明路段等惡劣條件下可能存在誤判的情況, 還需要進一步對算法進行優(yōu)化。 同行研究試驗時可以選擇YOLO在2020年推出的v4和v5版本進行嘗試, 期盼更多研究成果大家共享。