大家好,这是一个树莓派和OpenCV的连载专题。
使用树莓派与OpenCV实现姿态估计和面部特征点追踪
使用树莓派与OpenCV实现面部和运动追踪的云台系统
使用树莓派和OpenCV实现手部识别与手指识别
使用树莓派和OpenCV实时扫描并存储二维码
使用树莓派和OpenCV实现物体与动物识别
使用树莓派、摄像头和OpenCV进行速度检测
今天是第一部分:使用树莓派与OpenCV实现姿态估计和面部特征点追踪
如果大家对这个专题感兴趣,记得关注树莓派开发者,这样你将会第一时间收到我们的内容更新通知。
考验你英语听力的时候到了,你可以选择观看视频演示。
[更新——在OPEN-CV与新版树莓派“Bullseye”操作系统完全兼容之前,我强烈建议现阶段将先前的树莓派“Buster”操作系统刷写到Micro-SD卡上,以配合本指南使用——官方“Buster”镜像下载链接在下方]
为了进一步探索树莓派在人工智能领域的全面知识,我自然而然地迈出了下一步,即利用强大的树莓派单板计算机研究姿态识别(人体关键点检测)和面部遮罩技术。
你是否曾好奇过Snapchat滤镜是如何工作的?答案就三个字——面部特征点识别。面部特征点识别(遮罩)与面部识别有何不同?主要有两点实际差异。面部遮罩追踪会在你的整个面部创建点和线段(因此它能准确知道你的眼睛相对于眉毛的位置),并且它只关注你的面部,别无他物。(而面部识别则会在你的头部周围画一个框,并判定框内的任何东西都是面部。它不知道你的下巴在哪里,还会把你身后的背景也当作“人脸”。)另一方面,姿态估计则是利用机器学习模型,通过估计身体关键关节(称为关键点)的空间位置,从图像或视频中估计人的姿态。
跟随本指南,你将确切了解如何操作,从而在创客领域中建立一个适合你特定项目的类似系统。请参见以下指南内容:
你需要准备什么
初始设置与安装流程
功能完备的姿态追踪脚本
功能完备的面部遮罩脚本
接下来做什么(GPIO控制和其他应用)
在树莓派“Buster”操作系统上设置Open-CV
下载脚本
以下是一张图片,展示了在树莓派“Buster”操作系统上运行姿态追踪和面部遮罩软件时的情景,使用的是树莓派4 Model B、高质量摄像头模块和5毫米镜头。
在本页底部,你可以找到将Open-CV安装到树莓派上的流程。这里探索的所有脚本都将使用Python编程语言(如果你需要,可以来参加Python研讨会)。OpenCV和MediaPipe共同协作,使脚本得以运行。MediaPipe及其创建的TensorFlow使我们能够实现姿态检测和面部特征点检测算法。MediaPipe拥有最强大的面部特征点数据集,可在树莓派上运行。
你需要准备什么
以下是一份清单,列出了你需要快速搭建并运行本系统所需的组件。
树莓派4 Model B(树莓派提供的额外计算能力对这项任务非常有帮助,但此设置也适用于树莓派3 Model B,只是速度会稍慢一些)
树莓派高质量摄像头和摄像头镜头(你也可以使用树莓派官方摄像头模块V2)
Micro SD卡
显示器
HDMI线
鼠标和键盘
初始设置与安装流程
将树莓派作为台式计算机连接,并连接到显示器、鼠标和键盘。确保树莓派摄像头已正确安装在插槽中,且排线方向正确,然后启动下面将介绍的Open-CV安装流程。完成此流程后,你将在全新版本的树莓派“Buster”操作系统上安装好Open-CV。然后,打开树莓派配置菜单(通过左上角的菜单并滚动至首选项找到),并在接口选项卡下启用摄像头。启用后,重启树莓派以使更改生效。设置位置请参见下图。
完成上述步骤后,下一步是使用屏幕左上角的黑色按钮打开一个新的终端。下面你可以看到在树莓派“Buster”桌面上打开终端时的样子,图中有一个大箭头指向用鼠标点击以打开终端的图标。
现在,我们将在终端窗口中逐行输入以下命令以安装必要的软件包。当需要你继续安装这些软件包时,请按键盘上的 | Y | 键。
sudo apt-getupdate&&sudo apt-getupgradesudo apt-getinstall python-opencv python3-opencv opencv-datasudo pip3 install mediapipe-rpi3sudo pip3 install mediapipe-rpi4sudo pip3 install gttssudo apt install mpg321
功能完备的姿态追踪脚本
完成上述步骤后,让我们开始吧。以下是我们将用于搭建姿态追踪系统的脚本。请在本页底部找到并下载它。运行时,它将识别人体。当识别人体后,它将在识别出的人体的重要关节和面部放置点。这些点也被称为特征点,每个点都有关联的X、Y坐标。这意味着,与树莓派手部追踪非常相似,你将能够识别出某些关节是在其他关节的上方还是下方。这种变化可以用作计数器来追踪特定动作。
#Import all important functionalityimportcv2importmediapipeasmp#Start cv2 video capturing through CSI portcap=cv2.VideoCapture(0)#Initialise Media Pipe Pose featuresmp_pose=mp.solutions.posempDraw=mp.solutions.drawing_utilspose=mp_pose.Pose()#Start endless loop to create video frame by frame Add details about video size and image post-processing to better identify bodieswhileTrue: ret,frame=cap.read() flipped=cv2.flip(frame,flipCode=1) frame1 = cv2.resize(flipped,(640,480)) rgb_img=cv2.cvtColor(frame1,cv2.COLOR_BGR2RGB) result=pose.process(rgb_img) #Print general details about observed body print(result.pose_landmarks)
#Uncomment below to see X,Y coordinate Details on single location in this case the Nose Location.
#try: # print('X Coords are', result.pose_landmarks.landmark[mp_pose.PoseLandmark.NOSE].x * 640) # print('Y Coords are', result.pose_landmarks.landmark[mp_pose.PoseLandmark.NOSE].y * 480) #except: # pass
#Draw the framework of body onto the processed image and then show it in the preview window mpDraw.draw_landmarks(frame1,result.pose_landmarks,mp_pose.POSE_CONNECTIONS) cv2.imshow("frame",frame1)
#At any point if the | q | is pressed on the keyboard then the system will stop key = cv2.waitKey(1) &0xFF ifkey ==ord("q"): break
运行上述脚本时,打开的预览窗口如下所示。它将在它认为能看到人体的地方创建一个框架并覆盖上去。值得注意的是,此脚本还能识别你头部上的面部和眼睛的大致位置。它还会向shell输出一个表示可见度的数字(介于0和1之间)。如果只看到你的身体的一部分,那么这个可见度数字可能约为0.1。
与我们在《树莓派手部识别》的这一部分中看到的如何识别并获取人手上特定关节的实时X-Y数据点类似,我们也可以在这里对身体部位进行同样的操作。请参见下图,该图展示了MediaPipe在代码中如何对人体的每个部位进行标记和编号。因此,如果你想知道某个人的鼻子的确切X、Y坐标,你可以使用索引号 | 0 | 或通过其全名 | NOSE | 来引用。因此,如果你取上述脚本,取消注释特定部分,然后保存并运行它,它将向shell输出任何识别出的鼻子的X和Y坐标。有趣的是,它甚至似乎能在鼻子不在屏幕上时预测其位置。
功能完备的面部遮罩脚本
以下是我们将用于搭建面部遮罩系统的脚本。请在本页底部找到并下载它。这将识别人脸,并在识别出的人脸上绘制大量点。这些点(也称为特征点)都有关联的X、Y坐标。这个深度学习系统拥有的特征点比68个面部特征点还要多(实际上有468个点),并且在树莓派4 Model B上的帧率超过10 FPS。
importcv2importsys, timeimportmediapipe as mpmp_drawing= mp.solutions.drawing_utilsmp_face_mesh= mp.solutions.face_mesh# For static images:drawing_spec= mp_drawing.DrawingSpec(thickness=1, circle_radius=1)face_mesh= mp_face_mesh.FaceMesh(static_image_mode=True, max_num_faces=1, min_detection_confidence=0.5)defget_face_mesh(image): results= face_mesh.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) # Print and draw face mesh landmarks on the image. ifnot results.multi_face_landmarks: returnimage annotated_image= image.copy() forface_landmarks in results.multi_face_landmarks: #print(' face_landmarks:', face_landmarks) mp_drawing.draw_landmarks( image=annotated_image, landmark_list=face_landmarks, connections=mp_face_mesh.FACEMESH_CONTOURS, landmark_drawing_spec=drawing_spec, connection_drawing_spec=drawing_spec) #print('%d facemesh_landmarks'%len(face_landmarks.landmark)) returnannotated_image
font= cv2.FONT_HERSHEY_SIMPLEX cap= cv2.VideoCapture(0)if(cap.isOpened() == False): print("Unable to read camera feed")
cap.set(cv2.CAP_PROP_FRAME_WIDTH,640)cap.set(cv2.CAP_PROP_FRAME_HEIGHT,480)whilecap.isOpened(): s= time.time() ret, img = cap.read() ifret == False: print('WebCAM Read Error') sys.exit(0)
annotated= get_face_mesh(img) e= time.time() fps=1/ (e - s) cv2.putText(annotated, 'FPS:%5.2f'%(fps), (10,50), font, fontScale =1, color = (0,255,0), thickness =1) cv2.imshow('webcam', annotated) key= cv2.waitKey(1) ifkey ==27: #ESC breakcap.release()
运行上述脚本时,如果它能看到人脸,那么实时预览窗口如下所示。它将在它认为是一张脸的地方覆盖上一个完整的映射框架。
接下来做什么(GPIO控制和其他应用)
你可以对这两个脚本进行多种拓展。你可以“教”系统识别俯卧撑或肱二头肌弯举的动作(基于这些动作中哪些关节在上方和下方),然后使用姿态追踪来记录你做了多少次。你还可以根据可见度因素确保某人仍然在摄像头前,如果他们试图躲开摄像头,系统可以触发警报。你还可以创建一个“改善你的姿势”提醒机器。每当你开始弯腰时,一个烦人的蜂鸣器就会响起,迫使你坐直。此外,如果你想从姿态追踪系统中获取更多三维数据,可以看看PoseNet架构。3D PoseNet可以从连接的2D姿态和深度特征中预测3D姿态。
面部遮罩脚本可以拓展以实现各种功能。虚拟主播(vtubers)欢呼吧,你可以创建自定义Snapchat滤镜。你还可以使用此设置进行基本的情绪检测。这样,如果树莓派检测到你情绪低落,它可以播放你最喜欢的曲子来让你振作起来!或者你可以创建一个防瞌睡检测树莓派系统以提高安全性。通过关注眼睛之间的距离(上下),你可以跟踪自己有多困。无论你做什么,希望这能激发你创作一些有创意的树莓派项目!
那么,面部特征点识别与面部识别有何不同呢?面部遮罩的感兴趣区域要紧密和准确得多。面部遮罩只关注你的面部,别无他物。这意味着面部遮罩可以用来确定你头部的方向,而面部识别只能以一定的置信度告诉你,在其边界框内的某个地方有一张脸。因此,面部识别无法确定边界框内哪些是背景,哪些是人脸。
在树莓派“Buster”操作系统上设置OPEN-CV
以下是一个详细流程,指导你在树莓派上安装Open-CV,以便与上面讨论的姿态和面部遮罩追踪脚本配合使用。很快,我将创建一个脚本/单独的教程来简化此流程。打开一台运行在Micro-SD卡上的全新版本树莓派“Buster”操作系统的树莓派4 Model B,并将系统连接到互联网。
通过按左上角的终端按钮打开终端。将每个命令复制并粘贴到树莓派的终端中,按Enter键,并等待其完成后再继续下一个命令。如果提示“你想继续吗?(y/n)”,请按Y键,然后按Enter键继续。
sudo apt-getupdate&&sudo apt-getupgrade
在运行下一组命令之前,我们必须扩展交换文件。为此,在终端中输入以下行。
sudo nano /etc/dphys-swapfile
将 CONF_SWAPSIZE = 100 上的数字更改为 CONF_SWAPSIZE=2048。完成此操作后,按Ctrl-X、Y,然后按Enter键保存这些更改。此更改只是暂时的,完成此操作后你应该将其改回。为了使这些更改生效,我们必须通过向终端输入以下命令来重启交换文件。然后,我们将恢复正常输入终端命令。
sudo apt-get install build-essential cmake pkg-configsudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-devsudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-devsudo apt-get install libxvidcore-dev libx264-devsudo apt-get install libgtk2.0-dev libgtk-3-devsudo apt-get install libatlas-base-dev gfortransudo pip3 install numpywget -O opencv.zip https://github.com/opencv/opencv/archive/4.4.0.zipwget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.4.0.zipunzip opencv.zipunzip opencv_contrib.zipcd~/opencv-4.4.0/mkdirbuildcdbuildcmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-4.4.0/modules \ -D BUILD_EXAMPLES=ON ..make -j $(nproc)
这个∣make∣命令将需要超过一个小时来安装,并且不会有任何指示表明还需要多长时间。它也可能会冻结显示器。请耐心等待,它会正常工作的。一旦完成,你就完成了大部分工作。如果它在任何时候失败,你会收到类似∣make:???[Makefileall]Error2∣的消息,只需重新输入并输入上面的行∣make?j(nproc) |。不要害怕,它会记住所有已经完成的工作,并从停止的地方继续。一旦完成,我们将继续输入终端命令。
sudomake install && sudo ldconfigsudo reboot
原文地址:
https://core-electronics.com.au/guides/raspberry-pi/pose-and-face-landmark-raspberry-pi/
-
操作系统
+关注
关注
37文章
7190浏览量
126173 -
OpenCV
+关注
关注
32文章
647浏览量
43259 -
树莓派
+关注
关注
122文章
2054浏览量
107829
发布评论请先 登录
树莓派上使用OpenCV和Python实现实时人脸检测
【爱芯派 Pro 开发板试用体验】人体姿态估计模型部署前期准备
树莓派之球形追踪
基于面部特征点定位的图像人脸姿态估计方法
电赛总结之上位机(树莓派python-opencv实时识别黑线)

利用opencv+openpose实现人体姿态检测

用树莓派 + OpenCV 打造人脸识别技术!

评论