打造家庭助理机器人OriginBot,我希望它能够识别并欢迎家庭成员。为此,我引入了“家人识别”功能,它由人脸检测和人脸识别两大核心部分组成。
「人脸检测」是识别摄像头图像中是否存在人脸的过程。我采用了经典的Haar cascades算法,并对其进行了优化,确保它能在ROS环境中高效运行。通过将ROS图像转换为OpenCV格式,我们能够在图像上准确地标出人脸位置,并在检测到人脸时进行标记。
「人脸识别」则是确定图像中人脸身份的高级技术。我选择了阿里云视觉智能开放平台。因为对于非算法专业人员来说,最方便。
人脸检测
人脸检测借鉴了如何在OriginBot上实现人脸识别 - 古月居里面的内容。我把其中的代码做了一些优化并添加了详细的注释,优化后的代码如下:
# 导入所需库
import cv2
import cv_bridge
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
# 定义人脸检测节点
class FaceDetection(Node):
def __init__(self, cascade_path, image_topic, output_topic):
super().__init__('face_detection') # 初始化节点,节点名为'face_detection'
self.classifier_path = cascade_path # haarcascade模型路径
# 实例化cv_bridge对象,用来转换ROS图像和OpenCV图像
self.bridge = cv_bridge.CvBridge()
# 加载预训练的人脸检测模型
self.face_cascade = cv2.CascadeClassifier(self.classifier_path)
# 订阅图像主题,注册回调函数image_callback
self.image_sub = self.create_subscription(Image, image_topic, self.image_callback, 10)
# 创建Publisher,主题名为output_topic,队列长度为10
self.pub = self.create_publisher(Image, output_topic, 10)
# 定义图像回调函数
def image_callback(self, msg):
# 将接收到的ROS图像消息转化为OpenCV图像
image = self.bridge.imgmsg_to_cv2(msg, 'bgr8')
# 将图像转为灰度图,因为人脸检测需要灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 进行人脸检测
faces = self.face_cascade.detectMultiScale(
gray,
scaleFactor=1.2, # 表示每次图像尺寸减小的比例
minNeighbors=3, # 表示每一个目标至少要被检测到3次才算是真的目标
minSize=(20, 20) # 设置人脸的最小尺寸
)
# 如果检测到人脸,就在图像上画一个矩形框表示人脸
if len(faces) > 0:
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2)
# 将OpenCV图像转化为ROS图像消息,并发布出去
self.pub.publish(self.bridge.cv2_to_imgmsg(image, 'bgr8'))
# 定义主函数
def main(args=None):
rclpy.init(args=args) # 初始化ROS
face_detection = FaceDetection("haarcascade_frontalface_default.xml", "/image_raw", "/camera/process_image") # 实例化FaceDetection节点
rclpy.spin(face_detection) # 开始循环,不断调用回调函数
face_detection.destroy_node() # 销毁节点
rclpy.shutdown() # 关闭ROS
# 如果直接运行这个文件,就执行main函数
if __name__ == '__main__':
main()
❝这里的人脸检测算法是Haar cascades,这是一个比较旧的算法,可能在某些情况下无法检测到人脸或者产生误检。可以考虑使用一些更高级的算法,例如MTCNN,Dlib HOG或者Dlib CNN,以后再优化。
❞
把上面这个代码封装到一个ros2 package中,编译之后就可以使用了。
人脸识别
目前比较常用的人脸识别算法是FaceNet。
以下引用内容有chatGPT4 产生
❝FaceNet是Google于2015年发布的一种深度学习的人脸识别系统。FaceNet的目标是将人脸图像映射到欧氏空间,使得同一人的不同图像之间的距离尽可能小,而不同人的图像之间的距离尽可能大。这种映射是通过一个深度卷积神经网络实现的,网络的结构可以是Inception模型,也可以是其他的模型。
「优点:」
高精度:FaceNet 在 LFW(Labeled Faces in the Wild)和 YouTube Faces DB 等公开数据集上都取得了最好的性能。
端到端学习:FaceNet是一个端到端的系统,整个系统(包括特征提取和度量学习)都可以一起优化。
实时性:由于网络可以直接输出嵌入向量,因此可以用于实时的人脸识别应用。
「缺点:」
❞
训练难度大:FaceNet使用的三元组损失需要精心选择正例和负例,训练过程比较复杂。
需要大量标记数据:虽然FaceNet只需要身份标签,但是为了获得好的性能,仍然需要大量的训练数据。
对数据质量敏感:如果训练数据中有错误的标签,可能会对训练结果造成影响。
把这样一个比较大的算法直接部署在OriginBot上运行起来效果估计不会很好,毕竟需要的算力很大。再加上我本身不是做算法出身的,直接手撸FaceNet对我有点难,所以我最后选择使用阿里云的视觉智能开放平台。
阿里云视觉智能开放平台提供了一系列高效、易用的视觉智能API接口,旨在帮助用户轻松实现图像识别、视频分析、图像搜索等功能,从而提升业务效率和用户体验,这对我来说正适合。
以下是阿里云视觉智能开放平台的一些主要特点和功能:
点击如何让机器人认出你?OriginBot的家人识别功能 - 古月居 (guyuehome.com)可查看全文