文/胡思旺 李春杰
ROS是2010年由Willow Garage公司發布開源的機器人操作系統,采用分布式,松耦合的架構設計,并提供一種軟件點對點的通信機制,使得開發人員可以非常靈活的組織機器人的軟件實現。這一切都建立在ROS提供的包括節點,消息,主題等許多新的編程理念之上。

圖1:ROS節點通信圖
節點可以認為是ROS中獨立的可執行程序,在ROS中創建一個節點類似于創建一個進程。消息表示ROS節點與節點之間傳送的數據內容,ROS支持包括諸如浮點,字符串,自定義消息等多種消息類型。主題是指ROS中某個特定消息的名稱,節點可以發布針對某個主題的消息,也可以訂閱某個主題的消息。主題發布者與主題訂閱者互相不知道對方的存在,從而可以實現ROS程序的解耦。ROS各個節點可以通過訂閱主題來進行消息通信。節點可以發布消息到主題,其他節點可以通過訂閱主題來接收消息,這個通信過程如圖1所示。
為了保證各個功能之間的獨立性,本文在基于ROS框架下,設計了三個節點。分別是攝像頭驅動程序節點、人臉檢測節點與人臉識別節點。攝像頭驅動程序camera_node節點發布image_topic主題;人臉檢測detection_node節點發布face_topic主題,同時訂閱image_topic主題;人臉識別recognition_node節點發布result_topic主題,同時訂閱face_topic主題。
本文設計的總體方案的ROS節點通信如圖2所示。

表1:開發環境

圖2:ROS節點通信圖

圖3:人臉識別模型圖
camera_node是攝像頭驅動程序節點。該節點將利用opencv從USB攝像頭中讀取BGR彩色圖像并發布到image_topic主題中。
detection_node為自定義的ROS人臉檢測節點,它從image_topic主題中訂閱到圖像數據,并通過MTCNN卷積神經網絡進行人臉檢測。如果檢測到人臉,并且檢測到的人臉區域與圖像整體占比超過γ(本文本文設置γ=0.4),則認為人臉檢測成功,并把人臉圖像發布到face_topic主題中。
recognition_node為自定義的人臉識別節點,它訂閱face_topic主題,獲取人臉圖像。然后將人臉圖像輸入到本文自己訓練的人臉識別模型中以完成人臉識別,并將人臉識別結果發布到result_topic主題中,上層ROS應用程序可以在result_topic主題中獲取最終人臉識別的結果。
ROS以其自定義的sensor_msgs/Image消息格式發布圖像數據,它的格式與本文傳統的opencv圖像處理格式不同。在ROS上本文可以使用如下命令查看sensor_msgs/Image消息格式:
rosmsgshowsensor_msgs/Image
在項目開發中,ROS為本文提供了C++與python兩種語言的選擇,為了方便集成tensorf low與opencv,本文選擇使用python完成整個人臉識別系統的開發。ROS以提供封裝成python模塊的形式,為python開發提供了許多的支持。例如rospy模塊,提供節點創建,主題訂閱等函數接口;std_msgs.msg模塊,包含ROS封裝的String消息類型;sensor_msgs.msg模塊,包含有ROS封裝的sensor_msgs/Image消息類型。
為方便使用opencv操作圖像數據,本文需要采用ROS提供的cv_brige軟件包。在python中本文可以采用from cv_bridge import CvBridge, CvBridgeError形式直接導入模塊。cv_bridge提供了一個opencv圖像格式與ROS sensor_msgs/image消息格式的相互轉換接口。
本文通過使用cv_brige將opencv獲取的圖像數據轉換為sensor_msgs/Image消息格式并發布到主題image_topic中。
在設計人臉檢測節點中,本文使用了MTCNN卷積神經網絡來進行人臉檢測,MTCNN是由張凱鵬等提出的一種基于深度學習的人臉檢測算法。它是一個由P-Net,R-Net,O-Net三層級聯架構設計的卷積神經網絡。關于MTCNN具體的實現原理可以參考引用文獻[2]。MTCNN卷積神經網絡在人臉檢測中以識別率高,抗干擾性強著稱。由于本文的移動機器人平臺經常需要工作在不同的復雜場合,正是MTCNN具備的這些優點非常適用于移動機器平臺上的人臉檢測。MTCNN卷積神經網絡的模型訓練中需要計算能力非常高的計算機支持,而本文的ROS移動機器人平臺上大多數采用普通的嵌入式主板,計算能力非常的有限,無法在移動機器人上面直接訓練MTCNN模型。對此本文選擇先在其他機器上使用tensorf low訓練好MTCNN卷積神經網絡模型。
本文的人臉檢測主體包含detection_node節點與face_topic主題。人臉檢測節點從image_topic主題中接收sensor_msgs/Image消息并通過cv_brige轉換為opencv圖像格式,然后采用MTCNN對圖像進行人臉檢測,將檢測到的人臉圖像再此以sensor_msgs/Image消息格式發送到face_topic主題中。
本文的人臉識別主體包含recognition_node節點與result_topic主題。在人臉檢測中本文設計了一個detection_node節點與face_topic主題。detection_node節點使用MTCNN卷積神經網絡識別人臉并將識別的人臉圖像以ROS中sensor_msgs/Image消息格式發送到face_topic主題中。人臉識別節點便需要訂閱face_topic主題,從face_topic主題中接受sensor_msgs/Image消息并通過cv_brige轉換為opencv圖像格式,然后利用本文自己設計的模型對圖像進行人臉識別。
在人臉識別算法設計中,本文設計了一個主成分分析與神經網絡相結合的模型來實現人臉識別,本文先使用主成分分析方法將檢測到的人臉圖像進行全局特征提取,以此來降低訓練數據的維度。
假設人臉圖像訓練集合X={x1, x2, xi,…, xn},對應的人臉標簽為Z={z1, z2, zi,…, zn},n代表訓練集中樣本數目,zi以one-hot向量代表所屬的人臉類別。
主成分分析的本質是將X映射到Y={y1, y2, yi,…, yn},樣本yi為l維的行向量,其中l 接下來,本文構建一個三層神經網絡,分別是輸入層,隱藏層,softmax輸出層對經過主成分分析提取的人臉全局特征分類。 softmax函數定義為: 本文采用交叉熵損失函數作為神經網絡中的優化函數,損失函數定義為: 其中I{*}為指示函數,*中為真時,函數輸出1,否則,函數輸出0。 L(θ)對θ求偏導: 采用批量梯度下降法來更新參數θ,目的是求得參數θ,使得L(θ)最小化。 最終本文構建的人臉識別模型如圖3所示。 ROS本身提供catkin工具幫本文創建與編譯ROS工程,包含有catkin_init_workspace、catkin_make等一系列命令構建ROS工程,編譯ROS項目,同時支持編寫啟動腳本(.launch)的形式啟動多個節點,非常方便開發人員使用。本文在ROS Kinetic Kame版本上實現人臉識別系統,本文的開發環境如表1所示。


5 開發環境