当前位置:首页 > 聚焦财报 > 正文内容

在树莓派5上开启YOLO姿态估计识别之旅!

聚亿千财2025-07-22聚焦财报3611

大家好,接下来会为大家开一个树莓派5和YOLO的连载文章。

内容包括四个部分:

在树莓派5上使用YOLO进行物体和动物识别-入门指南

在树莓派5上开启YOLO人体姿态估计识别之旅

YOLO物体检测在树莓派AI Hat+上 | 如何编写自定义Python代码

YOLO姿态估计在树莓派AI Hat+上 | 编写自定义Python代码

今天是第二部分:树莓派5上使用YOLO进行人体姿态估计识别之旅

如果大家对这个专题感兴趣,记得关注树莓派开发者,这样你将会第一时间收到我们的内容更新通知。

你是否曾想涉足计算机视觉领域?那么在树莓派这样一款低功耗、便携式的硬件设备上尝试如何?

在本指南中,我们将在树莓派5上,借助OpenCV和YOLO姿态估计模型家族进行相关设置。我们将探讨一些可用的不同YOLO模型,以及如何优化这些模型以获得更流畅的帧率(FPS),还会介绍如何使用模型生成的关键点数据,以便将姿态估计应用到你的下一个项目中。这是我们近期制作的最有趣的指南之一,让我们开始吧!

对于需要相关资料的外部读者,这里是我们的项目代码压缩文件夹,其中包含运行姿态估计所需的所有脚本。

考验你英语听力的时候到了,你可以选择观看视频演示。

目录:

所需物品

硬件组装

安装树莓派操作系统

设置虚拟环境并安装YOLO

运行姿态估计

更换YOLO模型

提高处理速度

太空入侵者演示及后续方向

致谢

项目压缩文件下载

太空入侵者演示

要跟随本指南进行操作,你需要准备以下物品:

树莓派5 - 4GB或8GB型号均可。虽然理论上也可以在树莓派4上完成,但速度远于树莓派5,体验不佳,因此我们未在树莓派4上进行测试。

树莓派摄像头 - 我们使用的是摄像头模块V3

转接线 - 树莓派5配备的是不同尺寸的CSI摄像头线,而你的摄像头可能配备的是较旧的较粗线,因此请仔细检查。摄像头模块V3肯定需要转接线

散热方案 - 我们使用的是主动散热器(计算机视觉会让你的树莓派达到性能极限)

电源

Micro SD卡 - 容量至少为16GB

显示器和Micro-HDMI转HDMI线

鼠标和键盘

*所需物品可以直接联系我们进行购买。

硬件组装

硬件组装过程相对简单。将线缆较粗的一端连接到摄像头,较细的一端连接到树莓派5。这些连接器上有一个标签 - 将其抬起,然后将线缆插入插槽。确保线缆插入整齐后,将标签压回原位以固定线缆。

注意,这些连接器只能以一个方向插入,且较为脆弱,因此请避免过度弯曲(稍微弯曲一点没问题)。

34555e6e-63a9-11f0-a486-92fbcf53809c.jpg

安装树莓派操作系统

首先,我们需要将树莓派操作系统安装到Micro SD卡上。使用树莓派成像工具,选择树莓派5作为设备,树莓派操作系统(64位)作为操作系统,以及你的MicroSD卡作为存储设备。

下载树莓派操作系统:https://www.raspberrypi.com/software/

注意:将树莓派操作系统安装到MicroSD卡上会清除卡上的所有数据。

下载并安装操作系统可能需要几分钟时间。安装完成后,将卡插入树莓派并启动。树莓派将进行首次安装设置,请确保将其连接到互联网。

设置虚拟环境并安装库

随着2023年Bookworm操作系统的推出,我们现在需要使用虚拟环境(或venv),因为它们是在树莓派上提供一个独立的空间,我们可以在其中进行实验而不会损害树莓派操作系统或其他项目。本指南提供了所有所需的命令和说明,但如果你需要帮助,虚拟环境有其自己的指南。

3475f9ee-63a9-11f0-a486-92fbcf53809c.jpg

要创建虚拟环境,请打开一个新的终端窗口并输入:

python3 -m venv--system-site-packagesyolo_pose

创建venv后,我们可以通过输入以下命令进入:

sourceyolo_pose/bin/activate

执行上述操作后,你会在绿色文本的左侧看到虚拟环境的名称 - 这意味着我们正在其中正确工作。如果你需要重新进入此环境(例如,如果你关闭了终端窗口,你将退出环境),只需再次输入上述source命令即可。

现在,我们处于虚拟环境中,可以开始安装所需的软件包。首先,通过输入以下三行命令确保PIP(Python软件包管理器)是最新的:

sudoapt updatesudo apt install python3-pip -ypip install -U pip

然后,使用以下命令安装Ultralytics软件包:

pip install ultralytics[export]

Ultralytics的优秀团队是最新YOLO模型的主要开发者和维护者之一。他们的这个软件包将承担大部分繁重的工作,并安装OpenCV以及我们运行YOLO所需的所有基础设施。

此过程还将安装大量其他软件包,因此可能会失败。如果你的安装失败(会显示一大片红色文本),只需再次输入Ultralytics安装命令,它应该会继续。在极少数情况下,可能需要重复输入安装命令几次。

安装完成后,重启树莓派。如果你想成为高级用户,可以在shell中输入:

reboot

我们还有一件事要做,那就是设置Thonny以使用我们刚刚创建的虚拟环境。Thonny是我们将运行所有代码的程序,我们需要让它从同一个venv中运行,以便它可以访问我们安装的库。

首次打开Thonny时,它可能处于简化模式,你会在右上角看到“切换到常规模式”。如果存在此选项,请点击它并关闭Thonny以重新启动。

现在,通过选择“运行”>“配置解释器”进入解释器选项菜单。在“Python可执行文件”选项下,有一个带三个点的按钮。选择它并导航到我们刚刚创建的虚拟环境中的Python可执行文件。

349cf4ae-63a9-11f0-a486-92fbcf53809c.jpg

该文件位于home/pi/yolo_pose/bin下,在此文件中,你需要选择名为“python3”的文件。点击确定,你现在将在此venv中工作。

无论何时打开Thonny,它都将自动在此环境中运行。你可以通过从同一解释器选项菜单中“Python可执行文件”下的下拉菜单中选择它来更改工作环境。如果你想退出虚拟环境,请选择bin/python3选项。

34ab033c-63a9-11f0-a486-92fbcf53809c.jpg

运行姿态估计

现在,我们已经安装了所需的库,并且Thonny正在虚拟环境中运行,我们可以运行姿态估计脚本了。继续并将项目压缩文件夹解压到桌面等方便的位置。

在那里,你将找到我们将使用的第一个脚本“pose demo.py”。在Thonny中打开它并点击绿色的大运行按钮。首次运行此脚本时,它可能会自动安装一些额外所需的内容,几秒钟后,你应该会看到一个预览窗口出现,其中正在运行你的姿态估计。

34b77928-63a9-11f0-a486-92fbcf53809c.jpg

此时应该会发生几件事。首先,YOLO将尝试检测人类,如果识别到一个人,它会在其周围绘制一个方框,并在顶部显示置信度评分。重要的是,它将在它认为你身体的一些关键部位放置点(这些点称为关键点),并在这些点之间绘制线条以估计人的姿态和方向。右上角还将显示此脚本运行的FPS(我们稍后将提高它)。

就这样!通过这几个简单的步骤,我们已经让树莓派运行姿态估计了!

更换YOLO模型

到目前为止,我们一直在运行YOLO11,而这个Ultralytics软件包的美妙之处在于,我们只需在代码中替换一行即可完全更改模型。我们可以使用它来运行更高级的YOLO11模型,甚至是旧模型。你只需要更改设置中的这一行:

# Load our YOLO11 modelmodel= YOLO("yolo11n-pose.pt")

此行当前使用的是nano模型,它是YOLO11中最小、功能最弱但速度最快的模型。我们可以通过更改“11”后面的单个字母来更改此行以运行此模型的不同尺寸版本,如下所示。如果你将此行更改为另一个模型尺寸并运行它,脚本将自动下载新模型(对于较大的模型,可能达到数百MB)。

34d3d76c-63a9-11f0-a486-92fbcf53809c.jpg

这些模型之间的差异在于姿态估计性能和FPS之间的权衡。模型越大,它越擅长估计可能未被摄像头捕捉到的身体部位,以及更复杂的角度和画面中有更多人的帧,但你可能只能期望每10秒处理一帧!我们将在下一步中提高它。

另一方面,nano模型运行速度最快,未经优化时约能达到1.5 FPS,但它没有较大模型的处理能力。对于姿态估计,大多数情况下nano模型就足够了,因为它通常能满足你的需求,但如果你需要更强大的功能,请继续增大模型尺寸以满足你的需求。

34e7913a-63a9-11f0-a486-92fbcf53809c.jpg

在此行中,我们还可以更改正在运行的YOLO版本。如果你想,可以回退到旧模型,或者利用新模型。本指南最终会过时,如果Ultralytics发布了YOLO13,你应该只需将此行更改为以下内容即可开始使用更新的YOLO版本:

# Load our YOLO11 modelmodel= YOLO("yolo13n-pose.pt")

另外请注意,一些较旧的YOLO模型名称中包含“v”。例如,YOLO8称为:

# Load our YOLO11 modelmodel= YOLO("yolov8n-pose.pt")

提高处理速度

我们可以采取两种方法来提高树莓派上的FPS,而最有效的方法是将模型转换为称为NCNN的格式。这是一种更优化以在树莓派等基于ARM处理器上运行的模型格式。打开名为“ncnn conversion.py”的脚本,你将找到以下内容:

fromultralyticsimportYOLO# Load a YOLO11n PyTorch modelmodel = YOLO("yolo11n-pose.pt")# Export the model to NCNN formatmodel.export(format="ncnn", imgsz=640) # creates 'yolov11n-pose_ncnn_model'

要使用此脚本,首先指定你想要转换的模型。这使用我们在上一节中讨论的相同命名约定。然后,指定模型格式“ncnn”作为输出格式以及分辨率。目前保持默认的640。首次运行此脚本时,它将下载更多所需的内容,但实际转换应该只需几秒钟。

完成后,在脚本所在的文件夹中,你将找到一个名为“yolo11n-pose_ncnn_model”之类的新文件夹。复制此文件名并返回到我们之前的演示脚本。

现在,你需要通过将模型行更改为它刚刚创建的文件夹的名称来告诉脚本使用我们创建的模型。它应该如下所示:

# Load our YOLO11 modelmodel= YOLO("yolo11n-pose_ncnn_model")

如果你运行脚本,它应该与之前完全一样地工作,但由于NCNN转换,FPS提高了4倍。

我们可以做的另一件事来提高FPS是降低处理分辨率。这是我们将运行YOLO模型的分辨率,像素越少意味着处理每帧所需的时间越少。

虽然转换为NCNN是免费的FPS提升,但降低分辨率确实会牺牲一些能力。较低的分辨率会略微降低姿态估计的准确性(虽然不太明显),并且它最大的影响是降低了可以估计姿态的距离。默认分辨率为640时,范围相当远,因此我们可以适当降低一点。

为此,请打开我们刚刚使用的NCNN转换脚本并在以下行中指定你想要的分辨率:

# Export the model to NCNN formatmodel.export(format="ncnn", imgsz=320) # creates 'yolov11n-pose_ncnn_model'

注意:这必须是32的倍数。因此,你不能将其设置为300,但可以设置为320

我们发现,160到320范围内的分辨率在性能和速度之间取得了良好的平衡。

3502f736-63a9-11f0-a486-92fbcf53809c.jpg

运行转换代码,它将导出具有所需分辨率的模型。这样做也会覆盖任何之前导出的同名模型。

在演示脚本中,确保你像之前一样指定了NCNN模型。还有一件重要的事情我们必须做,那就是告诉脚本要向模型输入什么分辨率。在while true循环中,你将找到以下行。确保它与模型的分辨率匹配,对于此示例,我们导出的是320:

# Run YOLO model on the captured frame and store the results results= model.predict(frame, imgsz =320)

如果一切顺利,你应该会看到FPS再次显著提高。根据需要调整此分辨率,但请记住:

它必须是32的倍数

你必须更改主脚本中的名称以使用导出的模型

你必须将主脚本中的分辨率设置为与模型匹配

太空入侵者演示及后续方向

现在,我们的姿态估计已经运行,并且达到了合适的FPS,让我们看看如何利用这些关键点做些什么。模型输出的所有数据都存储在“results”变量中。继续并打开名为“keypoint acquisition.py”的脚本。此脚本与之前的演示脚本几乎相同,只是在顶部添加了以下函数:

defget_keypoint_position(keypoint_num, axis='x'): """ Keypoint reference: 0: nose 5: left_shoulder 10: right_wrist 15: left_ankle 1: left_eye 6: right_shoulder 11: left_hip 16: right_ankle 2: right_eye 7: left_elbow 12: right_hip 3: left_ear 8: right_elbow 13: left_knee 4: right_ear 9: left_wrist 14: right_knee """ ifnot0<= keypoint_num <= 16:        raise ValueError("Keypoint number must be between 0 and 16")    if axis.lower() not in ['x', 'y']:        raise ValueError("Axis must be 'x' or 'y'")    # Get the keypoint data    keypoint = results[0].keypoints.xyn[0][keypoint_num]    # Return x or y coordinate based on axis parameter    return keypoint[0].item() if axis.lower() == 'x' else keypoint[1].item()

此函数接受两个输入:你想要使用的关键点和你想在屏幕上获取的其x或y坐标。然后,它将接受此请求并从函数中提取该数据以输出。它还包含一个映射参考,说明关键点编号对应于身体上的哪个点。如果我们想调用函数来查找鼻子(关键点0)的位置以及它在x轴上的位置,我们将使用以下行:

nose_x= get_keypoint_position(0,'x')

这将返回鼻子在x轴上的相对位置,因此它将是一个0到1之间的数字。0将在屏幕的最左侧,1将在屏幕的最右侧。如果我们获取的是y轴,它也将返回一个数字,其中0是屏幕的顶部,1是屏幕的底部。运行脚本是获得对此的直观理解的最好方法。

这是YOLO运行姿态估计与将其应用到我们的项目中的桥梁,因为我们现在有一个Python脚本可以跟踪身体特定部位的位置并返回其在摄像头中的位置。作为一个可能的示例,我们(大致)创建了名为“space invaders.py”的脚本。这是关键点获取脚本的修改版本,它使用鼻子在x轴上的位置来控制一个简单的太空入侵者游戏。运行此脚本并玩一玩!

351d2386-63a9-11f0-a486-92fbcf53809c.jpg

这是使用一个名为Pygame的酷炫库制作的,但不幸的是,这不是一个关于如何使用Pygame的教程。我们也没有手动编写此代码,而是咨询了一位Pygame专家,你也可以访问他。像ChatGPT和Claude这样的大型语言模型在编写此类代码方面很有经验,我们只是将关键点获取代码和一些文本要求它制作一个太空入侵者游戏粘贴在一起,它就为我们输出了这段代码。你可以做同样的事情,但用于其他简单游戏,如打砖块和贪吃蛇!

很有可能它不会一次就完美,你可能会遇到错误,或者它可能太慢,或者颜色可能不对。但你可以简单地要求它修复这个问题,它会尽力解决。它还可以分解并教你代码的工作原理,就像你问一个人一样。

你还可以做的不仅仅是控制视频游戏,你还可以使用这些点来控制硬件,如伺服电机、马达和电磁阀。或者你可以发挥创意,跟踪肩膀的位置并制作一个引体向上或俯卧撑计数器。

无论你的项目是什么,你现在都有一个树莓派,它可以分析视频源,寻找人类,并输出那个人身体上点的位置。而且我们能够在我们谦逊的小树莓派上运行所有这些功能,这确实是一项了不起的成就。

如果你用这个制作了什么酷炫的东西,或者你需要任何帮助,请在我们的论坛上专门为本指南发布的帖子下方留言。

致谢

首先,我们要感谢OpenCV和COCO库的众多贡献者、开发者和维护者。现代计算机视觉领域的许多成果都建立在他们的努力之上。

我们还要感谢Joseph Redmon和Ultralytics开发并维护了许多这里使用的YOLO模型。它们是非常强大的模型,能够在树莓派等低功耗硬件上运行,这绝非易事!