陳逸揚
揚州市職業(yè)大學(xué),江蘇揚州,225009
隨著大功率計算機(jī)以及高精度攝像機(jī)的迅速普及,有關(guān)機(jī)器視覺的研究也越來越深入。在以前的研究中,常用Camshift算法來檢測人體,當(dāng)環(huán)境光照充足時,跟蹤效果良好,但在光照條件較差時,跟蹤性能下降。因此,本文再目標(biāo)檢測部分了深度學(xué)習(xí),該方法可以在不使用冗余幀的情況下更加精確。它類似于人類通過尋找特殊屬性或特征來持續(xù)提取圖像數(shù)據(jù),從而理解信息。在追蹤的部分中,本文采用了一種結(jié)構(gòu)簡單、易于實現(xiàn)、計算量小的單目相似三角測距方法,可以快速獲得機(jī)器人與檢測目標(biāo)間的距離。
攝像頭的鏡頭數(shù)據(jù)是進(jìn)行單目測距過程中最重要的參數(shù),為了獲得這些參數(shù),就必須要對攝像頭進(jìn)行標(biāo)定。在標(biāo)定之前,一共準(zhǔn)備了三塊校準(zhǔn)板,每一塊板都是由高精度的黑白矩形組成的,并輸入圖像上所有內(nèi)角的圖像坐標(biāo)和校準(zhǔn)板圖像上所有內(nèi)角的空間三維坐標(biāo)。
首先需要在不同位置、角度下拍攝校準(zhǔn)板的照片。如圖1所示,共獲取了9張不同角度的校準(zhǔn)板,使用OepenCV中的函數(shù)cvFindChessboardCorners來提取角點坐標(biāo),可以獲得一個粗略的坐標(biāo),然后再調(diào)用函數(shù)cvFindCornerSubPix()獲取精確的角點坐標(biāo)。展示時,可以用CVDrawChessboarCorner將其繪制在圖片上。然后初始化校準(zhǔn)點的三維坐標(biāo)。最后一步是調(diào)用cvCalibrateCamera來計算攝像頭的內(nèi)外部參數(shù)矩陣。

圖1 不同角度標(biāo)定板拍攝
在深度學(xué)習(xí)的領(lǐng)域中,卷積神經(jīng)網(wǎng)絡(luò)是非常重要的一部分,它在目標(biāo)的檢測和識別、圖像的分割和處理等方面出現(xiàn)的使用頻率非常高。它是一種多層神經(jīng)網(wǎng)絡(luò),與普通神經(jīng)網(wǎng)絡(luò)不同,卷積神經(jīng)網(wǎng)絡(luò)的每個神經(jīng)元與前一層的所有神經(jīng)元和后一層的所有神經(jīng)元都是相連的。
目標(biāo)識別和定位可分為兩個任務(wù)。第一個任務(wù)是在場景中找到對象,并給出該對象的邊界框檢測信息。另一項任務(wù)是根據(jù)識別的對象進(jìn)行類別的建立。識別檢測過程集成到卷積神經(jīng)網(wǎng)絡(luò)中。網(wǎng)絡(luò)的第一部分使用標(biāo)準(zhǔn)網(wǎng)絡(luò)進(jìn)行圖像分類,例如VGG、lexNet等。然后再添加額外的卷積層,以此逐層減小卷積層特征映射的比例。利用不同卷積層的特征映射可以預(yù)測目標(biāo)的分類和檢測框體的移動,從而實現(xiàn)多目標(biāo)的尺度特征映射檢測。如圖2所示,每個特征層在用來進(jìn)行預(yù)測時,可以使用卷積濾波器來生成許多大小固定的預(yù)測。再對特征層進(jìn)行卷積運算,便可以得到相應(yīng)大小的特征圖,可以用來預(yù)測類別分?jǐn)?shù)和相對于默認(rèn)框產(chǎn)生的坐標(biāo)偏移。由于不同層級的默認(rèn)框擁有不同的特征圖尺度,所以也就具有不同的尺寸以及長寬比,來適應(yīng)待檢測目標(biāo)的尺度變換。

圖2 不同層級的默認(rèn)框尺寸
在圖2中可以看出,對于貓和狗采用了不同的層級的特征圖來進(jìn)行預(yù)測,并且通過不同大小的默認(rèn)框來進(jìn)行匹配。每一層的默認(rèn)框的大小可以由公式計算得出:





既然每個特征圖有6個預(yù)測框,那么就可以預(yù)測對象的不同大小和形狀。而且默認(rèn)框的數(shù)量遠(yuǎn)大于實際框的數(shù)量,因此在訓(xùn)練時需要將默認(rèn)框與實際框進(jìn)行匹配。
在檢測之前,只需將代碼中原先的真循環(huán)改為CLASSES[idx]==”person,從圖3中可以看出,這樣在檢測過程中,程序只會將人體未檢測目標(biāo),而且對于人體檢測的默認(rèn)框非常準(zhǔn)確,不會多余的空白框體。

圖3 人體檢測效果圖
在單目視覺測距部分,本文基于相似三角形的相似化過程計算出機(jī)器人與檢測物之間的距離。用相機(jī)拍攝一個寬度為W,且與相機(jī)相距距離為D的物體,獲得其像素寬度為P,從而可以得到攝像頭焦距的公式。在上文中,我們也根據(jù)標(biāo)定過程得到了攝像頭的焦距值。

在計算過程中,將一張長8.5英寸寬11英寸的A4紙放在距離攝像頭D=24英寸的地方,再用攝像頭拍攝紙張獲得它的像素寬度為249像素。所以根據(jù)公式4-1便可以計算出焦距大小為:

當(dāng)繼續(xù)將攝像頭靠近或遠(yuǎn)離對象或目標(biāo)時,依據(jù)相似三角形的相似化過程便可以得到目標(biāo)與相機(jī)之間的距離的公式:

再將攝像頭移到離目標(biāo)36英寸的地方,拍下放置好的A4紙。通過圖像處理,可以得到A4紙在圖片中170像素的像素值。將其代入公式,得到:

從以上的計算可以看出,如果需要計算距離,必要的兩個參數(shù)就是攝像頭的焦距和目標(biāo)物體的大小。這兩個參數(shù)代入公式,就可以獲得從目標(biāo)到相機(jī)的距離D。
在具體應(yīng)用中,首先通過深度學(xué)習(xí)來檢測人,然后根據(jù)預(yù)估的人體高度和相機(jī)焦距來計算人與相機(jī)之間的距離。這里選擇高度的原因是人們的高度在不同方向上略有變化,同時相機(jī)高度也是固定的。
根據(jù)4.1中的結(jié)論,同時考慮攝像頭的擺放高度和角度對結(jié)果的影響,本文最終將攝像頭高度設(shè)置在2m,角度在15度,測量結(jié)果如表1所示。

表1 測量距離與實際距離誤差
從表中信息可以看出,測量的誤差基本控制在百分之三以內(nèi),因此這種單目視覺測距算法的具有一定的精度,可以使用。
本文在移動機(jī)器人控制系統(tǒng)部分選擇的是Ubuntu 16.04的ROS indigo。攝像頭選用的是Logicool C270網(wǎng)絡(luò)攝像頭。如圖4所示,該機(jī)器人有4個USB接口與攝像頭和顯示器連接。它還有一個用于激光雷達(dá)的微型USB接口。

圖4 機(jī)器人硬件部分
機(jī)器人機(jī)身部分的具體參數(shù)見表2。

表2 機(jī)器人具體參數(shù)
本文是基于ROS indigo作為機(jī)器人的移動控制系統(tǒng),ROS可以提供了一個非常強(qiáng)大的圖形仿真環(huán)境rviz以及move_base導(dǎo)航包,可以幫助使用者創(chuàng)建環(huán)境地圖。首先,啟用激光雷達(dá)節(jié)點和機(jī)器人鍵盤。通過移動按鍵幫助我們控制機(jī)器人移動到每個角落,以掃描周圍環(huán)境,并使雷達(dá)覆蓋每個地方。當(dāng)機(jī)器人建立好所處環(huán)境的地圖后,利用ROS提供的move_base導(dǎo)航包讓機(jī)器人在已建立好的地圖中指定目標(biāo)位置和方向后,結(jié)合機(jī)器人碼盤推算出的odometry信息,作出路徑規(guī)劃,輸出前進(jìn)速度和轉(zhuǎn)向速度。在導(dǎo)航過程中,首先需要輸入goal指令讓機(jī)器人獲取我們所期望它在地圖中到達(dá)的目標(biāo)位置。再利用轉(zhuǎn)換指令將機(jī)器人的地圖坐標(biāo)轉(zhuǎn)換為Odom坐標(biāo),根據(jù)Odom指令所計算出的機(jī)器人左右輪速度推算出的航向信息,包括在Odom坐標(biāo)系中機(jī)器人的坐標(biāo)以及航向角。當(dāng)獲得坐標(biāo)以及航向角后,通過cmd_vel在cmd_vel這個主題上發(fā)布Twist消息,將速度以及航向角發(fā)送給機(jī)器人基座,當(dāng)move_base導(dǎo)航包接收到目標(biāo)地點后,再通過客戶端向服務(wù)器發(fā)送,move_base會根據(jù)轉(zhuǎn)換坐標(biāo)來不斷控制機(jī)器人的狀態(tài)和路徑規(guī)劃。move_base在工作工程中會向geometry_msgs/Twist消息類型發(fā)出運動命令?;究刂破鞴?jié)點使用控制命令。/cmd_級別的全稱為“命令速度”?;究刂破鞴?jié)點訂閱/cmd_level主題,并通過PID控制算法將運動命令轉(zhuǎn)換為電機(jī)信號。移動機(jī)器人在二維平臺(如地板)上操作.只需要x軸和z軸的信息,是因為這種機(jī)器人只能在x軸上前后移動,并且只能繞z軸旋轉(zhuǎn)。換句話說,Y軸和Z軸的線速度始終為零,機(jī)器人不會在其他軸上旋轉(zhuǎn)。為了讓機(jī)器人以0.1m/s的速度直線移動,消息部分將以以下形式編寫:“{linear:{x:0.1,y:0,z:0},angular:{x:0,y:0,z:0}”。然后這個Twist信息將發(fā)送給機(jī)器人,并被其他ROS節(jié)點使用。
基于通過深度學(xué)習(xí)和相似三角形算法獲得的距離,本文設(shè)定了兩個臨界值,一個是290,另一個是220。從圖5的對比可以發(fā)現(xiàn),如果距離超過290cm,程序?qū)⑾驒C(jī)器人發(fā)送Twist信息,使其向前移動;當(dāng)距離處于220cm至290cm之間,機(jī)器人保持距離不運動;如果距離小于220cm,機(jī)器將獲得負(fù)速度保持距離在220cm。

圖5 機(jī)器人追蹤界面效果圖
由表3中的數(shù)據(jù)數(shù)據(jù)可以看出,當(dāng)可以根據(jù)測得的距離的改變而發(fā)出相應(yīng)的運動狀態(tài)指令,并且靈敏度較高。當(dāng)機(jī)器人距離目標(biāo)439cm時,超過了最大臨界值,因此會接收到一個給左右輪正速度的指令,機(jī)器人會向著檢測目標(biāo)的方向前進(jìn);當(dāng)距離在290cm,正好達(dá)到臨界點時,機(jī)器人會收到正負(fù)輪速度均為零的指令,因此機(jī)器人會停止不動;當(dāng)小于220cm時,機(jī)器人距離目標(biāo)過遠(yuǎn),便會通過指令靠近目標(biāo)。

表3 運動狀態(tài)隨距離的變化
本文提出了一種基于深度學(xué)習(xí)和單目攝像機(jī)測距的機(jī)器人跟蹤方法。實驗過程基于普通的網(wǎng)絡(luò)攝像頭,而不是深度攝像頭,可以在節(jié)省成本的同時加快操作速度。深度學(xué)習(xí)可以有效地檢測人體,并使檢測框體非常穩(wěn)定。一個穩(wěn)定的檢測框體可以幫助我們精確地測量距離。再通過相似三角形的相似化過程,利用攝像頭的焦距、高度以及人體的身高,可以計算出攝像頭與人體之間的距離,通過ROS indigo來控制機(jī)器人的移動,使得機(jī)器人與人體之間不會過遠(yuǎn)也不會過近,保持一定的跟蹤距離。本文中也存在一定缺點,在跟蹤前需要錄入人體的身高,對于應(yīng)急的處理能力可能不足。未來的工作是通過改進(jìn)測距算法來解決這個問題。