王迪迪,候嘉豪,王富全,朱志恒,童旭茂,秦偉
(陜西理工大學(xué) 物理與電信工程學(xué)院,陜西漢中,723000)
目標(biāo)識別和測距是人工智能領(lǐng)域的一個重要研究方向,近年來,隨著機器視覺的迅速發(fā)展,基于雙目攝像頭的視覺障礙檢測和定位被廣泛應(yīng)用于工業(yè)機器人領(lǐng)域。過去幾年,采用深度學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò)目標(biāo)識別與定位技術(shù)飛速發(fā)展,一方面,以RCNN、Faster RCNN為代表的神經(jīng)網(wǎng)絡(luò)識別精度越來越高;而另一方面,SSD、YOLO等識別速度越來越快[1]。在機器人障礙物定位測距方式中,視覺測距以其豐富的圖像信息,能實現(xiàn)采集多目標(biāo)距離信息受到廣泛研究。本文提出采用雙目攝像頭基于yolov3目標(biāo)檢測識別、分類,通過對攝像頭標(biāo)定,圖像校正、匹配后利用三角形成像原理完成障礙物的準(zhǔn)確識別和測距。
雙目攝像頭的測距原理類似于人眼,人們通過眼睛能夠感知物體的遠近不同是因為兩只眼睛對同一個物體呈現(xiàn)的圖像存在差異,這種差異稱為“視差”,物體距離越遠視差越小,反之視差越大,即視差的大小對應(yīng)著物體與眼睛之間的距離遠近[2]。雙目攝像頭利用這個原理,將視差量化,可以測量出物體與攝像頭之間的距離。
如圖1所示,P是待測物體上的某一點,雙目攝像頭的兩個光心分別是OR與OT,待測物體上的一點P在雙目攝像頭的兩個相機感光器上的成像點分別是P'和P",f為雙目相機左右攝像頭的焦距,B為兩相機光心之間的距離,Z為需要的深度信息,設(shè)點P'到點P"的距離為dis,則有:
圖1 雙目測距原理圖
公式中焦距f和攝像頭光心距B可通過標(biāo)定過程得到,因此,只要獲得了XR-XT(即視差d)的值即可求得待測物上點P的深度信息Z。
雙目相機目標(biāo)檢測及測距的流程如圖2所示,將相機采集到的圖像經(jīng)過預(yù)處理后輸出,通過目標(biāo)檢測算法處理檢測出目標(biāo)物,然后將RGB圖與深度圖進行匹配,對滿足閾值條件的目標(biāo)進行測距與坐標(biāo)計算。
圖2 算法流程
2.2.1 傳統(tǒng)算法
目前目標(biāo)檢測的傳統(tǒng)算法較多,大致上分為兩類:目標(biāo)實例檢測與傳統(tǒng)目標(biāo)類別檢測。
(1)目標(biāo)實例檢測方法是通過找出圖像中較為穩(wěn)定的特征點然后與特征模板進行對應(yīng)來找出目標(biāo)實例的。該方法在檢測目標(biāo)過程中,只需要找出具體目標(biāo)本身,圖像中的其他物體都為無關(guān)變量。
(2)傳統(tǒng)目標(biāo)類別檢測是通過某些算法框架、HOG特征和支持向量機等方法,依據(jù)特征和分類器進行檢測[3]。
2.2.2 基于深度學(xué)習(xí)的目標(biāo)檢測算法
基于深度學(xué)習(xí)的目標(biāo)檢測算法主要分為兩類:基于分類的檢測算法、基于回歸的目標(biāo)檢測算法。從R-CNN開始,廣大學(xué)者將目光集中到目標(biāo)檢測的分類上,雖然各種基于分類的檢測算法都有所提升,但是效果不盡人意,于是便有了將目標(biāo)檢測轉(zhuǎn)化到回歸的新思路,基于此思路有yolo、SSD、yolov2、yolov3等。
2.2.3 Yolo3目標(biāo)檢測
Yolov3是一種使用卷積神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)的特征來檢測物體的目標(biāo)檢測器[4,5]。其主干網(wǎng)絡(luò)為Darknet-53,目標(biāo)檢測尺度數(shù)為3個。網(wǎng)絡(luò)結(jié)構(gòu)包含主干網(wǎng)絡(luò)、特征金字塔(feature pyramid networks,FPN)以及輸出層。
Yolov3的 輸 入 圖 像 經(jīng) 過Darknet-53后,再 經(jīng) 過yoloblock生成的特征圖有兩個用處,第一個用處是生成特征圖一,分別經(jīng)過了3×3卷積層和1×1卷積層;第二個用處是生成特征圖二,分別經(jīng)過了1×1卷積層、上采樣層與Darknet-53中間層[6-8]。在經(jīng)過同樣的循環(huán)之后會生成特征圖三。在這個過程中的上采樣層所作的工作是通過插值等方法將小尺寸特征圖生成大尺寸圖像,并且經(jīng)過上采樣層不改變特征圖的通道數(shù)[9,10]。
(1) Yolov3的訓(xùn)練
訓(xùn)練策略:yolo3是根據(jù)預(yù)測值去尋找IOU最大的預(yù)測框作為正例。
輸出編碼:Yolov3擯棄了之前的softmax,直接使用邏輯回歸對每個類別進行獨立二分類判定,用交叉熵計算損失,這可以適配具有重疊標(biāo)簽的數(shù)據(jù)集。
(2) 先驗框(anchor)和檢測框
先驗框:yolov3雖然較之前版本改進了許多,但是先驗框的使用技巧與yolov2相同,并且使用k-means對數(shù)據(jù)集中的標(biāo)簽進行聚類,得到類別中心點的9個框,作為先驗框。
另外,還需要進行先驗框的選取,這是因為yolov3需要用先驗框?qū)敵鎏卣鲌D的每個網(wǎng)格進行邊界框預(yù)測。選取一個合適的先驗框值是十分重要的,這可以使目標(biāo)識別更加的準(zhǔn)確。而先驗框值是通過訓(xùn)練數(shù)據(jù)集聚類得到的,在yolov3的網(wǎng)絡(luò)模型中,其輸出3組特征圖,并且分別配有通過K-means算法得到的3組不同尺度的先驗框,以實現(xiàn)坐標(biāo)回歸[11]。
檢測框解碼:檢測框在獲得先驗框與輸出特征圖的基礎(chǔ)上進行解碼[12]。
式中σ(tx),σ(ty)是基于矩形框中心點左上角格點坐標(biāo)的偏移量,σ是激活函數(shù),pw,ph是先驗框的寬、高,通過上述公式可計算出實際預(yù)測框的寬高(bw,bh)。
檢測置信度解碼:置信度由sigmoid函數(shù)解碼,并且數(shù)值在[0,1]區(qū)間內(nèi)。
(3)Yolov3用法
Yolov3只能檢測屬于訓(xùn)練集的物體類的目標(biāo),因此使用yolov3進行目標(biāo)檢測之前需要訓(xùn)練數(shù)據(jù)集,數(shù)據(jù)集的訓(xùn)練直接影響之后的識別范圍與識別效果。
在使用yolov3進行目標(biāo)檢測時,首先會將輸入圖片的大小進行縮放,改為416×416之后進入主干網(wǎng)絡(luò)處理。如果所使用的數(shù)據(jù)集中有N個不同的目標(biāo)類別,那么經(jīng)過網(wǎng)絡(luò)之后得到的3個特征圖屬性為(13×13,3×(4+1+N)),(26×26,3×(4+1+N)),與(52×52,3×(4+1+N))。意思就是分別劃分了13×13、26×26、52×52的網(wǎng)格,每個網(wǎng)格預(yù)測3個邊界框,邊界框的中心點坐標(biāo)、高度、寬度是4,目標(biāo)檢測的可信度是1。則一個單獨的網(wǎng)格擁有3個先驗框,當(dāng)檢測到其內(nèi)部存在目標(biāo)時,就會對其進行類別檢測與邊框預(yù)測。把所有的網(wǎng)格都預(yù)測過之后獲取所有預(yù)測框的類別信息以及位置信息,最終通過非極大值處理后得到目標(biāo)邊界框,實現(xiàn)對目標(biāo)的檢測。
相較于其他系列目標(biāo)檢測方法,Yolov3算法識別目標(biāo)具有快速、背景誤檢率低、通用性強等優(yōu)點,但是其識別目標(biāo)位置精確性較差、召回率低。
雙目相機測距操作總共分為四個部分:相機標(biāo)定-雙目校正-雙目匹配-計算深度信息[8]。
2.3.1 相機標(biāo)定
相機成像一般都會產(chǎn)生畸變,這是因為相機生產(chǎn)過程中裝配、原料等多方面因素導(dǎo)致的。產(chǎn)生的畸變有兩種:
(1)徑向畸變
這種畸變主要是由相機所使用的透鏡產(chǎn)生的,徑向畸變的主要參數(shù)為k1,k2,k3。
(2)切向畸變
這種畸變主要是由于相機裝配的位置誤差產(chǎn)生的,切向畸變的主要參數(shù)為p1,p2。
另外相機參數(shù)還分為兩部分:
(1)內(nèi)參
這是相機本身所固有的參數(shù),不受外界因素的影響,主要有相機焦距f、成像原點(cx,cy)以及五個畸變參數(shù)(k1、k2、k3、p1、p2)。
(2)外參
外參即相機與目標(biāo)所在空間的世界坐標(biāo)。因為雙目相機會產(chǎn)生這些畸變,所以需要對雙目相機進行標(biāo)定。標(biāo)定即是通過獲得以上所介紹的各種參數(shù)再加上兩個相機的相對位置,然后經(jīng)過計算對雙目相機進行修正以獲得更加準(zhǔn)確的圖像以及深度信息。
2.3.2 雙目校正
雙目校正是我們分別根據(jù)左右相機定標(biāo)后獲得的內(nèi)參數(shù)據(jù)和雙目位置關(guān)系,對左右視圖消除畸變影響以及行對準(zhǔn)的操作。這樣做的效果就是兩幅圖像上相對應(yīng)點的行號相同。所以想找到另一幅圖像中所對應(yīng)的點,只要在該行內(nèi)進行一維搜索就可以找到。
2.3.3 雙目匹配
雙目匹配目的就是得到深度信息,這首先需要找出兩幅圖像上相對應(yīng)的像素點,然后利用測距原理以及參數(shù)通過大量運算便可得到整幅圖像上所有像素點的深度信息。
本實驗使用Jetson nano作為運算平臺,在Ubuntu系統(tǒng)下進行開發(fā),搭建ROS開發(fā)環(huán)境。編程語言采用Python以及C++。
Jetson nano是一款功能強大的小型計算機,硬件配置為四核 ARM? Cortex?-A57 MPCore處理器,顯存為4GB 64位 LPDDR4。它可以在圖像分類、目標(biāo)檢測、分割和語音處理等應(yīng)用并行運行多個神經(jīng)網(wǎng)絡(luò),同時處理多個高分辨率的傳感器。
目標(biāo)檢測系統(tǒng)需要系統(tǒng)及時、準(zhǔn)確的檢測出目標(biāo),以供應(yīng)智能駕駛或者機器人的需要。本文使用yolov3算法進行目標(biāo)檢測,相比其他算法處理速度更快、穩(wěn)定性更高。
yolov3識別目標(biāo)類型的范圍更加廣泛,這是因為該算法的目標(biāo)匹配機制,可以通過更改權(quán)重來使用自己的數(shù)據(jù)集。
數(shù)據(jù)集的制作步驟概括為采集圖片、圖片標(biāo)定、訓(xùn)練。
采集圖片:采用在網(wǎng)上下載的方式,獲取大量數(shù)據(jù)圖片,然后經(jīng)過刪選、隨機抽取100張圖片作為訓(xùn)練素材。
圖片標(biāo)定、訓(xùn)練:在yolo訓(xùn)練功能包中修改yaml文件,修改文件中類的個數(shù)以及類的名稱。隨機抽取采集圖片集中90%的圖片進行訓(xùn)練,其余圖片集圖片用于驗證。訓(xùn)練文件生成權(quán)重文件,權(quán)重文件包含best.pt以及l(fā)ast.pt文件。
圖3為訓(xùn)練結(jié)果的PR曲線,其中precision代表精確率,recall代表召回率。該曲線波動不大,證明訓(xùn)練結(jié)果較好。檢測結(jié)果如圖4所示,測試結(jié)果表明經(jīng)訓(xùn)練后的yolov3方法能準(zhǔn)確分類目標(biāo)。
圖3 PR曲線
圖4 目標(biāo)檢測識別效果圖
測距之前首先需要對相機進行標(biāo)定,標(biāo)定的本質(zhì)是借助一個已知確定的空間關(guān)系(標(biāo)定板),通過分析拍照的圖片像素,逆向推出相機固有且真實的參數(shù)(內(nèi)參)。
標(biāo)定首先需要啟動相機,打開標(biāo)定節(jié)點,設(shè)置標(biāo)定板的參數(shù)(size以及square),然后通過移動標(biāo)定板來獲取更多圖像信息,獲取完成后通過處理可獲得相機參數(shù)。
測距通過處理雙目相機獲取的左右圖像之間的視差信息,可以得到深度信息如圖5所示。將深度圖與yolo識別出的目標(biāo)圖進行匹配可以得到相機與目標(biāo)物之間的距離以及目標(biāo)物的坐標(biāo),結(jié)果如圖6,圖7所示。
圖5 深度圖
圖6 目標(biāo)識別圖
圖7 目標(biāo)坐標(biāo)以及距離輸出
測量結(jié)果如表1所示,測量障礙物選擇為人體,表中x,y為障礙物空間坐標(biāo),dis為目標(biāo)檢測的距離。測距實驗結(jié)果表明目標(biāo)與相機距離在0.80~5m內(nèi)測量距離最大誤差為0.15m,距離測量誤差在5%內(nèi)。
表1 障礙物位置
本文利用雙目相機獲取圖像,經(jīng)過訓(xùn)練數(shù)據(jù)集,對雙目相機進行標(biāo)定后通過yolov3算法快速準(zhǔn)確識別出目標(biāo),并生成目標(biāo)圖像副本,再通過三角測距精確計算得到目標(biāo)與相機的距離。實驗結(jié)果表明,該方法能夠較快且準(zhǔn)確的識別目標(biāo),對目標(biāo)進行分類,測量攝像頭與目標(biāo)之間的距離。