AI 摄像头
Raspberry Pi AI 相机使用索尼 IMX500 成像传感器,可为任何相机应用提供低延迟、高性能的 AI 功能。与 Raspberry Pi 的相机软件栈 的紧密集成使用户能够以最小的工作量部署自己的神经网络模型。
树莓派人工智能相机
本节演示如何在摄像头上运行预装或自定义神经网络模型。此外,本节还包括在 rpicam-apps 和 Picamera2 中解释在 IMX500 上运行的神经网络生成的推理数据所需的步骤。
入门
以下说明介绍了如何在 Raspberry Pi AI 相机上运行预打包的 MobileNet SSD 和 PoseNet 神经网络模型。
硬件设置
按照 安装 Raspberry Pi 摄像头 中的说明,将摄像头安装到 Raspberry Pi 5 板上。
前提条件
这些说明假定您使用的是连接到 Raspberry Pi 4 Model B 或 Raspberry Pi 5 板上的 AI 相机。只要稍作改动,您就可以在其他带有摄像头连接器的 Raspberry Pi 型号上使用这些说明,包括 Raspberry Pi Zero 2 W 和 Raspberry Pi 3 Model B+。
首先,确保你的 Raspberry Pi 运行最新的软件。运行以下命令更新:
sudo apt update && sudo apt full-upgrade
安装 IMX500 固件
在启动过程中,AI 摄像机必须将运行时固件下载到 IMX500 传感器上。要将这些固件文件安装到 Raspberry Pi 上,请运行以下命令:
sudo apt install imx500-all
此命令:
- 安装运行 IMX500 传感器所需的
/lib/firmware/imx500_loader.fpk和/lib/firmware/imx500_firmware.fpk固件文件 - 在
/usr/share/imx500-models/中放置大量神经网络模型固件文件 - 在
rpicam-apps中安装 IMX500 后期处理软件阶段 - 安装索尼网络模型打包工具
IMX500 内核设备驱动程序会在相机启动时加载所有固件文件。如果之前没有缓存神经网络模型固件,这可能需要几分钟时间。下面的演示会在控制台上显示一个进度条,以显示固件加载进度。
重新启动
现在您已经安装了先决条件,请重启 Raspberry Pi:
sudo reboot
运行示例应用程序
更新所有系统软件包并安装固件文件后,我们就可以开始运行一些示例应用程序了。如前所述,Raspberry Pi AI 摄像头与 libcamera、rpicam-apps 和 Picamera2 完全集成。
rpicam-apps.
rpicam-apps相机应用程序包括 IMX500 物体检测和姿态估计阶段,可在后处理管道中运行。有关后处理管道的更多信息,请参阅 后处理文档。
本页的示例使用位于 /usr/share/rpi-camera-assets/中的后处理 JSON 文件。
对象检测
MobileNet SSD 神经网络可执行基本的物体检测,为找到的每个物体提供边界框和置信度值。imx500_mobilenet_ssd.json 包含使用 MobileNet SSD 神经网络进行 IMX500 物体检测后处理阶段的配置参数。
imx500_mobilenet_ssd.json 声明了包含两个阶段的后处理管道:
imx500_object_detection,用于在输出张量中提取神经网络生成的边界框和置信度值。object_detect_draw_cv在图像上绘制边界框和标签。
MobileNet SSD 张量无需在 Raspberry Pi 上进行大量后处理即可生成边界框的最终输出。所有物体检测都直接在人工智能相机上运行。
下面的命令运行带有物体检测后处理的 rpicam-hello:
rpicam-hello -t 0s --post-process-file /usr/share/rpi-camera-assets/imx500_mobilenet_ssd.json --viewfinder-width 1920 --viewfinder-height 1080 --framerate 30
运行该命令后,你会看到一个取景器,在神经网络识别的对象上叠加了边界框:
IMX500 移动网络
要录制带有物体检测叠加的视频,请使用 rpicam-vid 代替:
rpicam-vid -t 10s -o output.264 --post-process-file /usr/share/rpi-camera-assets/imx500_mobilenet_ssd.json --width 1920 --height 1080 --framerate 30
您可以通过多种方式配置 imx500_object_detection 阶段。
例如,max_detections(最大检测次数)定义了管道在任何给定时间内检测到的对象的最大数量。threshold 定义了管道将任何输入视为 对象所需的最小置信度值。
该网络的原始推理输出数据可能会有相当大的噪声,因此这一阶段也会执行一些时间过滤并应用滞后。要禁用这种过滤,请移除 temporal_filter 配置块。
姿态估计
PoseNet 神经网络执行姿态估计,标记身体上与关节和四肢相关的关键点。imx500_posenet.json 包含使用 PoseNet 神经网络进行 IMX500 姿势估计后处理阶段的配置参数。
imx500_posenet.json 声明了包含两个阶段的后处理流水线:
imx500_posenet从 PoseNet 神经网络获取的原始输出张量plot_pose_cv在图像上绘制线条叠加图
AI摄像头可执行基本的检测,但输出张量需要在 Raspberry Pi 主机上进行额外的后处理,以产生最终输出。
下面的命令运行带有姿态估计后处理的 rpicam-hello:
rpicam-hello -t 0s --post-process-file /usr/share/rpi-camera-assets/imx500_posenet.json --viewfinder-width 1920 --viewfinder-height 1080 --framerate 30
IMX500 PoseNet
您可以通过多种方式配置 imx500_posenet 阶段。
例如,max_detections(最大检测次数)定义了管道在任何给定时间内检测到的最大物体数量。threshold 定义管道将输入视为体所需的最小置信度值。
Picamera2
有关使用 Picamera2 进行图像分类、物体检测、物体分割和姿态估计的示例,请参阅 picamera2 GitHub 代码仓库。
大多数示例都使用 OpenCV 进行了一些额外处理。要安装运行 OpenCV 所需的依赖项,请运行以下命令:
sudo apt install python3-opencv python3-munkres
现在下载 picamera2 资源库 到你的 Raspberry Pi 上运行示例。你会在根目录中找到示例文件,并在 README.md 文件中找到更多信息。
从软件源运行以下脚本来运行 YOLOv8 对象检测:
python imx500_object_detection_demo.py --model /usr/share/imx500-models/imx500_network_ssd_mobilenetv2_fpnlite_320x320_pp.rpk
要尝试在 Picamera2 中进行姿势估计,请运行软件源中的以下脚本:
python imx500_pose_estimation_higherhrnet_demo.py
工作原理
概览
如下图所示,Raspberry Pi AI 相机的工作原 理与传统的基于 AI 的相机图像处理系统不同:
传统与 IMX500 AI 相机系统对比
左侧展示的是传统人工智能相机系统的架构。在这种系统中,摄像头向树莓派(Raspberry Pi)发送图像。树莓派处理图像,然后执行人工智能推理。传统系统可能使用外部人工智能加速器(如图所示),也可能完全依赖于 CPU。
右侧展示了使用 IMX500 的系统架构。摄像头模块包含一个小型图像信号处理器(ISP),可将原始摄像头图像数据转化为输入张量。摄像头模块将张量直接发送到摄像头内的人工智能加速器,该加速器产生包含推理结果的输出张量。人工智能加速器将这些张量发送到 Raspberry Pi。无需外部加速器,Raspberry Pi 也无需在 CPU 上运行神经网络软件。
要充分理解这个系统,请先熟悉以下概念:
输入张量
传感器图像中传递给人工智能引擎进行推理的部分。由一个小型的板载 ISP 生成,该 ISP 还将摄像头图像裁剪并缩放至已加载的神经网络所期望的尺寸。输入张量通常不向应用程序提供,但可以为调试目的进行访问。
感兴趣区域(ROI)
精确指定传感器图像在重新缩放为神经网络所需的大小之前被裁剪掉的部分。可由应用程序查询和设置。使用的单位始终是全分辨率传感器输出中的像素。默认 ROI 设置使用从传感器接收到的完整图像,不裁剪任何数据。
输出张量
神经网络执行推理的结果。输出的精确数量和形状取决于神经网络。应用代码必须了解如何处理张量。