文/胡思旺 李春杰
ROS是2010年由Willow Garage公司發(fā)布開(kāi)源的機(jī)器人操作系統(tǒng),采用分布式,松耦合的架構(gòu)設(shè)計(jì),并提供一種軟件點(diǎn)對(duì)點(diǎn)的通信機(jī)制,使得開(kāi)發(fā)人員可以非常靈活的組織機(jī)器人的軟件實(shí)現(xiàn)。這一切都建立在ROS提供的包括節(jié)點(diǎn),消息,主題等許多新的編程理念之上。
圖1:ROS節(jié)點(diǎn)通信圖
節(jié)點(diǎn)可以認(rèn)為是ROS中獨(dú)立的可執(zhí)行程序,在ROS中創(chuàng)建一個(gè)節(jié)點(diǎn)類似于創(chuàng)建一個(gè)進(jìn)程。消息表示ROS節(jié)點(diǎn)與節(jié)點(diǎn)之間傳送的數(shù)據(jù)內(nèi)容,ROS支持包括諸如浮點(diǎn),字符串,自定義消息等多種消息類型。主題是指ROS中某個(gè)特定消息的名稱,節(jié)點(diǎn)可以發(fā)布針對(duì)某個(gè)主題的消息,也可以訂閱某個(gè)主題的消息。主題發(fā)布者與主題訂閱者互相不知道對(duì)方的存在,從而可以實(shí)現(xiàn)ROS程序的解耦。ROS各個(gè)節(jié)點(diǎn)可以通過(guò)訂閱主題來(lái)進(jìn)行消息通信。節(jié)點(diǎn)可以發(fā)布消息到主題,其他節(jié)點(diǎn)可以通過(guò)訂閱主題來(lái)接收消息,這個(gè)通信過(guò)程如圖1所示。
為了保證各個(gè)功能之間的獨(dú)立性,本文在基于ROS框架下,設(shè)計(jì)了三個(gè)節(jié)點(diǎn)。分別是攝像頭驅(qū)動(dòng)程序節(jié)點(diǎn)、人臉檢測(cè)節(jié)點(diǎn)與人臉識(shí)別節(jié)點(diǎn)。攝像頭驅(qū)動(dòng)程序camera_node節(jié)點(diǎn)發(fā)布image_topic主題;人臉檢測(cè)detection_node節(jié)點(diǎn)發(fā)布face_topic主題,同時(shí)訂閱image_topic主題;人臉識(shí)別recognition_node節(jié)點(diǎn)發(fā)布result_topic主題,同時(shí)訂閱face_topic主題。
本文設(shè)計(jì)的總體方案的ROS節(jié)點(diǎn)通信如圖2所示。
表1:開(kāi)發(fā)環(huán)境
圖2:ROS節(jié)點(diǎn)通信圖
圖3:人臉識(shí)別模型圖
camera_node是攝像頭驅(qū)動(dòng)程序節(jié)點(diǎn)。該節(jié)點(diǎn)將利用opencv從USB攝像頭中讀取BGR彩色圖像并發(fā)布到image_topic主題中。
detection_node為自定義的ROS人臉檢測(cè)節(jié)點(diǎn),它從image_topic主題中訂閱到圖像數(shù)據(jù),并通過(guò)MTCNN卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行人臉檢測(cè)。如果檢測(cè)到人臉,并且檢測(cè)到的人臉區(qū)域與圖像整體占比超過(guò)γ(本文本文設(shè)置γ=0.4),則認(rèn)為人臉檢測(cè)成功,并把人臉圖像發(fā)布到face_topic主題中。
recognition_node為自定義的人臉識(shí)別節(jié)點(diǎn),它訂閱face_topic主題,獲取人臉圖像。然后將人臉圖像輸入到本文自己訓(xùn)練的人臉識(shí)別模型中以完成人臉識(shí)別,并將人臉識(shí)別結(jié)果發(fā)布到result_topic主題中,上層ROS應(yīng)用程序可以在result_topic主題中獲取最終人臉識(shí)別的結(jié)果。
ROS以其自定義的sensor_msgs/Image消息格式發(fā)布圖像數(shù)據(jù),它的格式與本文傳統(tǒng)的opencv圖像處理格式不同。在ROS上本文可以使用如下命令查看sensor_msgs/Image消息格式:
rosmsgshowsensor_msgs/Image
在項(xiàng)目開(kāi)發(fā)中,ROS為本文提供了C++與python兩種語(yǔ)言的選擇,為了方便集成tensorf low與opencv,本文選擇使用python完成整個(gè)人臉識(shí)別系統(tǒng)的開(kāi)發(fā)。ROS以提供封裝成python模塊的形式,為python開(kāi)發(fā)提供了許多的支持。例如rospy模塊,提供節(jié)點(diǎn)創(chuàng)建,主題訂閱等函數(shù)接口;std_msgs.msg模塊,包含ROS封裝的String消息類型;sensor_msgs.msg模塊,包含有ROS封裝的sensor_msgs/Image消息類型。
為方便使用opencv操作圖像數(shù)據(jù),本文需要采用ROS提供的cv_brige軟件包。在python中本文可以采用from cv_bridge import CvBridge, CvBridgeError形式直接導(dǎo)入模塊。cv_bridge提供了一個(gè)opencv圖像格式與ROS sensor_msgs/image消息格式的相互轉(zhuǎn)換接口。
本文通過(guò)使用cv_brige將opencv獲取的圖像數(shù)據(jù)轉(zhuǎn)換為sensor_msgs/Image消息格式并發(fā)布到主題image_topic中。
在設(shè)計(jì)人臉檢測(cè)節(jié)點(diǎn)中,本文使用了MTCNN卷積神經(jīng)網(wǎng)絡(luò)來(lái)進(jìn)行人臉檢測(cè),MTCNN是由張凱鵬等提出的一種基于深度學(xué)習(xí)的人臉檢測(cè)算法。它是一個(gè)由P-Net,R-Net,O-Net三層級(jí)聯(lián)架構(gòu)設(shè)計(jì)的卷積神經(jīng)網(wǎng)絡(luò)。關(guān)于MTCNN具體的實(shí)現(xiàn)原理可以參考引用文獻(xiàn)[2]。MTCNN卷積神經(jīng)網(wǎng)絡(luò)在人臉檢測(cè)中以識(shí)別率高,抗干擾性強(qiáng)著稱。由于本文的移動(dòng)機(jī)器人平臺(tái)經(jīng)常需要工作在不同的復(fù)雜場(chǎng)合,正是MTCNN具備的這些優(yōu)點(diǎn)非常適用于移動(dòng)機(jī)器平臺(tái)上的人臉檢測(cè)。MTCNN卷積神經(jīng)網(wǎng)絡(luò)的模型訓(xùn)練中需要計(jì)算能力非常高的計(jì)算機(jī)支持,而本文的ROS移動(dòng)機(jī)器人平臺(tái)上大多數(shù)采用普通的嵌入式主板,計(jì)算能力非常的有限,無(wú)法在移動(dòng)機(jī)器人上面直接訓(xùn)練MTCNN模型。對(duì)此本文選擇先在其他機(jī)器上使用tensorf low訓(xùn)練好MTCNN卷積神經(jīng)網(wǎng)絡(luò)模型。
本文的人臉檢測(cè)主體包含detection_node節(jié)點(diǎn)與face_topic主題。人臉檢測(cè)節(jié)點(diǎn)從image_topic主題中接收sensor_msgs/Image消息并通過(guò)cv_brige轉(zhuǎn)換為opencv圖像格式,然后采用MTCNN對(duì)圖像進(jìn)行人臉檢測(cè),將檢測(cè)到的人臉圖像再此以sensor_msgs/Image消息格式發(fā)送到face_topic主題中。
本文的人臉識(shí)別主體包含recognition_node節(jié)點(diǎn)與result_topic主題。在人臉檢測(cè)中本文設(shè)計(jì)了一個(gè)detection_node節(jié)點(diǎn)與face_topic主題。detection_node節(jié)點(diǎn)使用MTCNN卷積神經(jīng)網(wǎng)絡(luò)識(shí)別人臉并將識(shí)別的人臉圖像以ROS中sensor_msgs/Image消息格式發(fā)送到face_topic主題中。人臉識(shí)別節(jié)點(diǎn)便需要訂閱face_topic主題,從face_topic主題中接受sensor_msgs/Image消息并通過(guò)cv_brige轉(zhuǎn)換為opencv圖像格式,然后利用本文自己設(shè)計(jì)的模型對(duì)圖像進(jìn)行人臉識(shí)別。
在人臉識(shí)別算法設(shè)計(jì)中,本文設(shè)計(jì)了一個(gè)主成分分析與神經(jīng)網(wǎng)絡(luò)相結(jié)合的模型來(lái)實(shí)現(xiàn)人臉識(shí)別,本文先使用主成分分析方法將檢測(cè)到的人臉圖像進(jìn)行全局特征提取,以此來(lái)降低訓(xùn)練數(shù)據(jù)的維度。
假設(shè)人臉圖像訓(xùn)練集合X={x1, x2, xi,…, xn},對(duì)應(yīng)的人臉標(biāo)簽為Z={z1, z2, zi,…, zn},n代表訓(xùn)練集中樣本數(shù)目,zi以one-hot向量代表所屬的人臉類別。
主成分分析的本質(zhì)是將X映射到Y(jié)={y1, y2, yi,…, yn},樣本yi為l維的行向量,其中l(wèi) 接下來(lái),本文構(gòu)建一個(gè)三層神經(jīng)網(wǎng)絡(luò),分別是輸入層,隱藏層,softmax輸出層對(duì)經(jīng)過(guò)主成分分析提取的人臉全局特征分類。 softmax函數(shù)定義為: 本文采用交叉熵?fù)p失函數(shù)作為神經(jīng)網(wǎng)絡(luò)中的優(yōu)化函數(shù),損失函數(shù)定義為: 其中I{*}為指示函數(shù),*中為真時(shí),函數(shù)輸出1,否則,函數(shù)輸出0。 L(θ)對(duì)θ求偏導(dǎo): 采用批量梯度下降法來(lái)更新參數(shù)θ,目的是求得參數(shù)θ,使得L(θ)最小化。 最終本文構(gòu)建的人臉識(shí)別模型如圖3所示。 ROS本身提供catkin工具幫本文創(chuàng)建與編譯ROS工程,包含有catkin_init_workspace、catkin_make等一系列命令構(gòu)建ROS工程,編譯ROS項(xiàng)目,同時(shí)支持編寫(xiě)啟動(dòng)腳本(.launch)的形式啟動(dòng)多個(gè)節(jié)點(diǎn),非常方便開(kāi)發(fā)人員使用。本文在ROS Kinetic Kame版本上實(shí)現(xiàn)人臉識(shí)別系統(tǒng),本文的開(kāi)發(fā)環(huán)境如表1所示。5 開(kāi)發(fā)環(huán)境