1.人脸跟踪项目概述

网友投稿 2019-01-23 14:19

0x00 人脸跟踪系统简介

本项目是为了让大家熟悉如何使用arduino控制舵机的转动、如何使用普通usb摄像头进行人脸检测并定位其中心位置,然后以人脸位置信息为输入来向arduino发送指令,从而使舵机跟随人脸进行转动。这样我们就可以实现一个简单的人脸跟踪系统,该系统也可以作为一个完整机器人项目的人脸跟踪模块来直接使用。

本项目是使用ROS(Robot Operating System       机器人操作系统)来作为各子模块的通信框架,其中各子模块就是ROS中的节点(Node)。子模块之间的通信就是各节点间的通信,这里的通信使用了自定义消息格式的话题通信,自定义服务格式的服务通信。

当然也还涉及到了使用dynamic_reconfigure来实现节点参数的动态配置,launch文件的编写等其他知识点。需要注意的是本项目中的节点代码实现都是使用python代码来实现的,后续可以根据需要再使用C++来重新实现一遍。

总之本项目是一个很不错的学习ROS的练习项目,不仅可以提高大家的硬件代码调试能力,同时也能将前面学习的ROS知识来一次实践。那么接下来,大家就跟随我一起来动手,看看这样一个小项目是如何实现的吧!


0x01 项目架构设计

在实现一个项目前,我们都需要先清楚整个项目最终要实现什么样的功能,然后再想想项目需要哪些模块作为支撑。如何设计这些模块之间的通信来完成指定的需求和功能,只有当这些模块架构有了整体规划后,就可以开始动手编写各模块代码了。当然,模块代码在编写过程中要边实现边测试。当各模块代码实现后,就可以进行模块间代码调试了,当所有模块之间的通信都调试通,那么整个项目也就完工了。

下面我们就根据在简介部分的介绍来设计本项目的实现架构,这里需要注意的是这个实现架构设计重点在于:介绍清楚整个项目的各模块及其之间的通信方式,不必拘泥于架构设计是否为最优方案。因为我们在实现过程中,整个架构设计也会不断的进行微调,这个初始版本的架构设计就是为了方便指导我们立马开始项目而已。下图就是我设计的一个人脸跟踪项目架构图(仅供参考),不美观就将就着看吧:

https://cdn.china-scratch.com/timg/190125/141951K54-0.jpg

上面这张图虽然画的不够详细,但是对于我们了解整个项目的简单实现已经够了。例如硬件组成包括哪些、硬件如何连接、代码运行在哪里、人脸检测位置,下面来详细介绍软件代码部分架构如何设计的。


0x02 下位机Arduino代码架构

这里使用arduino板作为下位机的主控板,主要完成的功能是通过串口接收上位机ROS节点发送过来的控制舵机转动的命令。arduino代码就是来解析命令,然后控制相应的舵机来转动。现在已经清楚了,arduino代码要完成的功能,接下来就可以设计一下代码的流程图了,如下图所示:

https://cdn.china-scratch.com/timg/190125/1419522505-1.jpg

通过上面的流程图我们就得知,其实arduino部分的代码不难,就是一直在读取串口缓冲区中的数据,然后解析该数据,找到需要执行的命令,最后执行相应的控制舵机转动的函数即可。


0x03 ROS控制代码

这部分ROS代码算是很重要的代码了,它作为人脸检测模块和舵机驱动的桥梁。它一边要通过USB线连接着arduino控制板,一边要接收着人脸检测模块识别到的人脸位置信息。当人脸位置一偏离图像中心位置时,就把偏差位置生成控制命令发送给该模块。然后该模块再将该控制命令通过USB线发送给arduino控制板,这样就可以控制舵机转动,始终保持人脸在图像的中心位置。

下面我们就可以来设计一下该部分代码的框图,因为太细节的部分我们可以在后面逐渐细化。这里要先知道个大概,了解该模块在整个项目中的作用。下面就是我设计的框图:

https://cdn.china-scratch.com/timg/190125/1419521219-2.jpg

通过上图可以发现其实这部分代码也不难,差不多两个节点就可以了。当然,在后面实现这部分代码的时候,我们会细化其中的细节。在这里我们只需要有个初步认识即可,最后来认识一下人脸检测模块代码。


0x04 人脸检测代码流程

在这里使用的人脸检测代码不是自己来开发,而是使用github上大名鼎鼎的face_recognition。该人脸识别项目目前在github上拥有2万多star,那是相当的厉害,所以我们就没必要自己写个人脸检测识别的代码了(曾经尝试写过,但误识别率有点高,经常把不是人脸的东西也当做人脸)。

https://cdn.china-scratch.com/timg/190125/1419524534-3.jpg

https://cdn.china-scratch.com/timg/190125/1419532426-4.gif

接下来我们就可以利用该代码来进行人脸检测(只需识别出人脸位置即可),这里我们先不用人脸识别(识别出每张脸对应哪一个人)。下面来设计下这部分代码实现的流程图,只需要先想清楚大概要实现的模块即可:

https://cdn.china-scratch.com/timg/190125/14195420Q-5.jpg

通过上面的流程图可以得知,人脸检测模块的实现步骤也很简单。因为这里我们是直接调用face_recognition的API来实现的人脸检测,这里少了一大块实现人脸检测的代码。一直介绍到这里,我们才基本上对要开始的人脸跟踪项目的实现有了个整体的认识和了解。接下来,我们就可以开始动手实际操作,一步一步来实现整个项目了。

最后可以给大家剧透一下,这个项目最终可以实现的效果是什么样的。如下动图所示(这里要感谢同事的露脸出镜测试)

https://cdn.china-scratch.com/timg/190125/1419541408-6.gif


0x05 References

[1].Adam Geitgey.face_recognition的github主页.

https://github.com/ageitgey/face_recognition

[2].Adam Geitgey.face_recognition的API文档.

https://face-recognition.readthedocs.io/en/latest/readme.html


0x06 Feedback

大家在按照教程操作过程中有任何问题,可以关注ROS小课堂的官方微信公众号,在公众号中给我发消息反馈问题即可,我基本上每天都会处理公众号中的留言!当然,如果你要是顺便给ROS小课堂打个赏,我也会感激不尽的,打赏30块还会邀请进ROS小课堂的微信群与更多志同道合的小伙伴一起学习和交流!

--end--

声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com