APP下载

基于ROS的人脸识别系统设计与实现

2019-06-11胡思旺李春杰

电子技术与软件工程 2019年7期
关键词:人脸识别人脸消息

文/胡思旺 李春杰

ROS是2010年由Willow Garage公司发布开源的机器人操作系统,采用分布式,松耦合的架构设计,并提供一种软件点对点的通信机制,使得开发人员可以非常灵活的组织机器人的软件实现。这一切都建立在ROS提供的包括节点,消息,主题等许多新的编程理念之上。

图1:ROS节点通信图

节点可以认为是ROS中独立的可执行程序,在ROS中创建一个节点类似于创建一个进程。消息表示ROS节点与节点之间传送的数据内容,ROS支持包括诸如浮点,字符串,自定义消息等多种消息类型。主题是指ROS中某个特定消息的名称,节点可以发布针对某个主题的消息,也可以订阅某个主题的消息。主题发布者与主题订阅者互相不知道对方的存在,从而可以实现ROS程序的解耦。ROS各个节点可以通过订阅主题来进行消息通信。节点可以发布消息到主题,其他节点可以通过订阅主题来接收消息,这个通信过程如图1所示。

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主题中获取最终人脸识别的结果。

2 驱动程序节点设计

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中。

3 人脸检测节点设计

在设计人脸检测节点中,本文使用了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主题中。

4 人脸识别节点设计

4.1 人脸识别节点流程

本文的人脸识别主体包含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图像格式,然后利用本文自己设计的模型对图像进行人脸识别。

4.2 人脸识别算法设计

在人脸识别算法设计中,本文设计了一个主成分分析与神经网络相结合的模型来实现人脸识别,本文先使用主成分分析方法将检测到的人脸图像进行全局特征提取,以此来降低训练数据的维度。

假设人脸图像训练集合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所示。

5 开发环境

ROS本身提供catkin工具帮本文创建与编译ROS工程,包含有catkin_init_workspace、catkin_make等一系列命令构建ROS工程,编译ROS项目,同时支持编写启动脚本(.launch)的形式启动多个节点,非常方便开发人员使用。本文在ROS Kinetic Kame版本上实现人脸识别系统,本文的开发环境如表1所示。

猜你喜欢

人脸识别人脸消息
人脸识别 等
有特点的人脸
揭开人脸识别的神秘面纱
三国漫——人脸解锁
基于类独立核稀疏表示的鲁棒人脸识别
马面部与人脸相似度惊人
消息
消息
消息
基于K-L变换和平均近邻法的人脸识别