使用BYOM Freeform构建一个视觉处理管道,用于检测人物
计算机视觉任务的细节层次逐渐递进。图像分类为整个画面赋予一个标签;目标检测在每个物体周围绘制边界框;实例分割则更进一步,逐像素地勾勒出每个物体的轮廓,为每个实例生成独立的掩码。这种更高的精确度使我们能够清晰地将一个人从场景中分离出来,追踪传送带上不规则形状的部件,或测量物体的真实形状,而不仅仅是其周围的矩形区域。
Edge Impulse 将分类和目标检测作为内置的学习模块提供,但不包含实例分割功能。本指南通过结合两种技术来实现该功能:
•模型级联链条,两个模型各司其职。一个小型快速检测器先运行,当检测到值得分割的内容时,再由更复杂的分割模型进行处理。每个模型都保持简单,便于训练和部署,从而将计算资源集中在真正需要的地方。
•BYOM Freeform(“自带模型”)允许您将任何ONNX模型上传到Edge Impulse,让运行时直接返回原始输出张量,无需修改。这是部署Edge Impulse无法原生解析的架构(如YOLO-seg)的便捷方式,您可以自行完成后续处理。
为了更具体地说明,我们开发了一个针对人脸模糊的隐私应用:第一阶段检测出人物,第二阶段对每个个体进行分割,然后使用像素级精确的遮罩对人物进行模糊处理,使人物被隐藏,而背景保持清晰——这一点仅靠边界框难以实现。整个流程在高通QCS6490上的Edge Impulse Linux运行环境中运行,由于基于.eim文件构建,相同的代码可在任何Edge Impulse Linux目标设备上运行。
使这款应用成为边缘AI应用的关键在于,它在设备上实时运行。当通过USB摄像头连接到电路板时,系统会实时处理每一帧图像,即时模糊人物,无需经过云端的往返通信。这正是在边缘端进行推理的核心目的:应用程序可离线持续运行,不产生网络延迟,并且对于此类隐私应用场景,原始视频从未离开设备。下方视频展示了从USB摄像头实时运行的完整边缘推理过程,使用的是Rubik Pi 3设备。
你将学到什么
•将两个模型串联成检测-分割的级联结构
•在 Edge Impulse 上使用 Freeform 输出类型部署 YOLO11-seg 模型
•使用简单的后处理将原始分割张量转换为实例掩码
•在这些遮罩之上构建一个隐私保护的个人模糊应用
•在高通QCS6490板上实时运行整个流水线
注意:Edge Impulse .eim 文件遵循 Edge Impulse for Linux 协议,因此本仓库中的代码可在任何支持的目标设备上正常运行,例如 Raspberry Pi 5、其他高通 Dragonwing 板卡,或用于开发的 macOS 笔记本电脑。本指南针对 QCS6490。若使用其他板卡,请为该目标重新构建 .eim 文件,并保持其余部分不变。
先决条件
硬件
软件
•一个 Edge Impulse 账户。
•Python 3.10+,包含运行时环境和 OpenCV:pip install "edge_impulse_linux>=1.2.2" opencv-python numpy
•一次性导出ONNX时使用:pip install ultralytics
重要提示:请使用 edge_impulse_linux 1.2.2 或更高版本。较新的 .eim 构建会通过共享内存返回大量自由形式输出,而较旧的 SDK 无法读取这些数据,因此第二阶段将返回字符串 "shm" 而不是张量。有关此问题的更多说明,请参见第二阶段部分。
级联是如何工作的
模型级联将工作分配给两个模型,使每个模型保持简单:
第一阶段是一个快速检测器,用于判断物体的位置。第二阶段是更复杂的分割模型,用于生成掩码,仅在第一阶段检测到物体时才需要运行。通过这种方式分阶段处理任务,可以方便地部署每个模型,选择性地运行昂贵的模型,并且无需修改整个流程的其余部分即可替换任一阶段。
项目结构
models/ 文件夹中包含两个平台的 .eim 文件:*-aarch64.eim 用于 Rubik Pi 3,以及 *-macos-arm64.eim 用于在 Apple Silicon 上的本地开发。有关如何重新构建这些文件,请参见 models/README.md。
设置 Rubik Pi 3
Rubik Pi 3 采用高通龙翼 QCS6490 边缘 AI 芯片组,该芯片集成了八核 Kryo CPU、Adreno GPU 和六边形 NPU(约 12 TOPS)。这种设备本地计算能力使得在边缘端运行此类视觉级联处理成为可能。它运行标准的 Ubuntu 镜像,因此准备过程非常快捷。本节内容有意简略,请参考链接中的指南获取完整详细信息。
启动并引导板,然后将其连接到您的网络。有关板的设置和支持的部署目标,请参见 Edge Impulse Rubik Pi 3 页面。
安装 Edge Impulse Linux 运行时环境和 Python 依赖。运行时用于执行 .eim 文件;详情请参见 Edge Impulse for Linux。
pip install "edge_impulse_linux>=1.2.2" opencv-python numpy
将此仓库复制到板上(克隆或通过scp复制文件夹),并使模型可执行:
将此仓库复制到板上(克隆或通过 scp 复制文件夹),并使模型可执行:chmod +x models/*.eim
这正是董事会所需的一切。从这里开始,无论是在 Rubik Pi 3 上运行,还是在开发时使用带内置 *-macos-arm64.eim 的 macOS 笔记本电脑上运行,命令都是完全相同的。
第一阶段:目标检测
第一阶段在每一帧上检测人物及其包围框。获取检测器有两种方法。
选项A:在Edge Impulse Studio中自行训练模型。收集并标注图像,然后训练一个物体检测模型。请确保其中一个物体类别为“人”,因为后续的流程依赖于该标签。这是从数据到.eim文件的标准Edge Impulse流程;更多详情请参阅物体检测文档。
选项B:重用预训练检测器(本指南的做法)。当一个经过充分验证的模型已经适用时,就不必再运行完整的训练流程。我选择使用YOLOX-Nano,因为它已经在COCO数据集上训练过,该数据集包含人体类别,且性能非常出色。因此,我无需从头收集数据并重新训练,而是直接选用该模型:通过BYOM将预训练的YOLOX-Nano上传至Edge Impulse,并仅使用Studio生成部署文件下载。由于该模型已上传时附带了已知的输出类型(YOLO解析器),Edge Impulse会直接返回解析后的边界框,这与第二阶段自由形式输出形成对比。
无论如何,只要检测器识别到你的目标类别,就会插入进来,而不会改变其余的级联过程。
最快的方法是直接使用我的检测器:打开我的公开 Edge Impulse 项目,将其克隆到你的账户中,然后通过“部署 > Linux (AARCH64) > 构建”生成 .eim 文件。你无需自行编译或上传模型,底层检测器为 YOLOX。将下载的 .eim 文件放入 models/ 目录中。要检查输入尺寸和标签:
第二阶段:使用BYOM Freeform进行实例分割
这就是实例分割在 Edge Impulse 中的应用。BYOM(自带模型)功能允许你上传任意 ONNX 模型,而自由形式的输出类型则指示运行时直接传递所有原始输出张量,无需解析。你只需负责后处理工作,这使得像 YOLO-seg 这样的非原生架构也能实现部署。
与第一阶段相同,最快的方法是直接使用我的模型:打开我的 Edge Impulse 项目,将其克隆到你的账户中,然后从部署选项卡(Deployment tab)构建 .eim 文件。这样可以跳过下面的导出和上传步骤。本节其余部分将展示如何从零开始构建,如果你希望使用自己的数据进行训练,应采用此方法。
该模型
一个预训练的YOLO11n-seg网络。它会产生两个输出张量:
检测的掩码是其32个系数与32个原型相乘,通过Sigmoid函数后,再裁剪至其框内。
导出为 ONNX
导出使用了Ultralytics:
以BYOM自由格式上传
•前往上传模型(BYOM)并上传 yolo11n-seg.onnx。
•将模型输出类型设置为自由形式,输入尺寸为640x640,3通道,缩放范围为0到1。
•从部署 > Linux (AARCH64) 开始构建,并将 .eim 文件放置在 models/ 目录中。
处理原始输出
Freeform 仅提供张量,其他内容一概不给。有四件事容易让人出错,只要其中任何一项做错了,就会显示为空的蒙版,或整个画面都被填充的蒙版。
将RGB打包成每个像素一个浮点数
Linux 运行器期望每个像素有一个浮点数,其 R、G 和 B 值被打包在整数位中,而不是作为三个独立的值:
按大小匹配输出张量,而非索引
Freeform 不保证张量的顺序,因此请根据元素数量来识别每个张量:
将原型掩码从 NHWC 转换为 NCHW
原型数据以 NHWC 顺序返回,因此在使用前需要重新整形并转置:
大容量自由形式输出通过共享内存传输
为避免序列化数兆字节的 JSON 数据,最新的 .eim 构建版本会将大容量的自由格式输出写入 POSIX 共享内存,并返回标记字符串 "shm"。edge_impulse_linux 的 1.2.2 版本可读取这些段落并为您替换真实张量。较旧的 SDK 会保留 "shm" 字符串,因此只需升级软件包即可,无需修改任何代码。
后期处理
postprocess.py 将两个张量转换为实例掩码。它解析检测结果,应用置信度阈值和非最大值抑制,根据系数和原型构建每个掩码,并调整尺寸以匹配原始帧:
单独检查第二阶段与单个图像的对比:
运行级联
cascade/cascade_inference.py 会在一张图像上同时运行两个阶段,并将它们合并,通过 IoU 将第一阶段的框与第二阶段的掩码进行匹配,使检测结果和掩码对齐:
在板上(提前设置),使用分屏演示运行视频文件的级联效果。此路径无需显示:
注意:在 macOS 上开发时,将捆绑的 *-macos-arm64.eim 文件替换为 *-aarch64.eim 文件,命令保持不变。如果 macOS 报告 .eim 文件损坏,请清除隔离标志:xattr -d com.apple.quarantine 。
人像模糊应用
cascade/person_blur.py 使用 cascade 对人物进行匿名化处理。边界框模糊会覆盖一个矩形区域,并将背景一并模糊。实例掩码则沿身体轮廓绘制,使模糊效果仅作用于人物本身,不包含其他内容。
模糊效果使用所有人物蒙版的并集作为混合图。多通道高斯滤波(通过 --blur-passes 设置的通道数)对人脸和服装进行匿名化处理:
在剪辑中运行:
相同的蒙版也可用于其他应用,例如背景替换、对象去除、选择性效果或AR叠加。
实时网络摄像头演示
若要使用实时USB摄像头而非文件运行,请移除 --video 标志。预览窗口将在板子的显示屏上打开,因此请从板子自身的终端启动它:
按 q 或关闭窗口退出。在实时模式下,两个标志用于在速度与质量之间权衡:--skip N 表示每 N 帧跳过一次第二阶段(重模型),并在中间重复使用遮罩;而 --blur-passes 用于设置模糊强度。提高 --skip 或降低 --blur-passs 可获得更平滑的输出。
注意:在 Wayland 桌面环境中(即 Rubik Pi 3 的默认设置),请按所示方法将 QT_QPA_PLATFORM 设置为 xcb,否则 OpenCV/Qt 窗口可能会显示为一个黑色小方框。
关于硬件加速的说明
QCS6490 配备了 Hexagon NPU,Edge Impulse 可通过 Linux(AARCH64 与高通 QNN)部署选项进行目标优化。该 NPU 能够加速 int8 量化模型,非常适合检测和分类类的模型任务。
本指南中的级联处理在CPU上运行,使其简单且可在所有Edge Impulse Linux目标设备上移植。对于NPU对自由形式分割模型进行量化,本身是一项值得开展的工作,因为其多张量输出使得int8量化需要针对具体模型进行定制化处理。当CPU流水线运行后,可将其视为下一步工作。
故障排除
结论
本指南通过结合两个理念,将实例分割技术引入 Edge Impulse,而无需使用原生的学习模块:两阶段模型级联与 BYOM Freeform。一个快速检测器用于定位人体,YOLO11n-seg 模型生成像素级精确的掩码,随后由小型后处理模块将原始的 Freeform 张量转换为可驱动隐私保护人脸识别应用的实例。由于每个阶段都以 .eim 格式在 Edge Impulse Linux 运行时环境中运行,因此从 Raspberry Pi 5 到开发笔记本电脑等任何支持的目标设备上,相同的流水线都能保持不变地运行。在此基础上,您可以使用自己的分割数据训练第二阶段模型,构建其他基于掩码的应用(如背景替换或选择性特效),或探索在 QCS6490 的 Hexagon NPU 上部署检测式模型的 int8 版本。
本文编译自hackster.io





