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