
MediaPipe 在 Coral Edge TPU 上的实时检测实战构建、交叉编译与 USB/PCIe 部署指南【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipeMediaPipe 提供跨平台的流式媒体机器学习方案其mediapipe/examples/coral目录集中展示了如何让 MediaPipe 图在 Google Coral Edge TPUUSB 与 PCIe 形态上运行量化 TFLite 模型实现对摄像头视频流的实时人脸检测与目标检测。本文以该示例目录为核心完整讲解启用 Edge TPU 的 Bazel 编译开关、在 x86 主机上交叉编译 ARM32/ARM64 产物的 Docker 流程以及把二进制连同模型、图配置部署到树莓派或 Coral Dev Board 上运行的全过程并深入图配置文件与TfLiteInferenceCalculator源码说明 Edge TPU 推理分支的底层原理。一、Coral 支持概览与示例目录结构mediapipe/examples/coral是一个自包含的桌面端示例集包含编译脚本、Coral 专用量化模型、推理图配置与通用图运行入口。目录中已确认存在的文件包括BUILDBazel 构建定义声明demo_run_graph_main公共库及face_detection_tpu、object_detection_tpu两个可执行目标Makefile封装了进入 Docker 交叉编译环境与在当前环境直接 Bazel 构建两条命令链Dockerfile.amd64、Dockerfile.armhf、Dockerfile.arm64对应三种平台的预配置 Docker 镜像demo_run_graph_main.cc读取文本格式CalculatorGraphConfig并驱动摄像头/视频流的 C 运行入口graphs/face_detection_desktop_live.pbtxt与object_detection_desktop_live.pbtxt两个推理图配置models/face-detector-quantized_edgetpu.tflite、object-detector-quantized_edgetpu.tflite两个 Edge TPU 量化模型与object_detection_labelmap.txt标签文件images/本文开头两张演示动图/截图。与常规 MediaPipe 图不同这里的推理全部下放到 Edge TPU 专用硬件执行CPU 仅承担图像预处理与后处理因此具备低功耗、低延迟的实时能力适合树莓派ARM32、Coral Dev BoardARM64这类嵌入式板卡。二、Bazel 编译开关如何开启 Edge TPU 支持MediaPipe 通过编译期宏MEDIAPIPE_EDGE_TPU来启用 Edge TPU 代码路径。要运行 Coral 模型只需在bazel命令后追加--define MEDIAPIPE_EDGE_TPUtype其取值与适用场景为取值适用设备平台要求usbCoral USB AcceleratorLinux 与 macOSpciCoral PCIe Accelerator如 Dev Board 的 M.2/PCIe 模块仅 LinuxallUSB 与 PCIe 两者同时启用仅 Linux2.1 需要提前安装的依赖库编译含 USB 支持的目标前必须安装libusbLinuxlibusb-1.0-0-dev通常通过sudo apt-get install -y libusb-1.0-0-dev安装macOS通过 MacPorts 或 Homebrew 安装libusb。编译链接时通过--linkopt-l:libusb-1.0.so显式指定链接该库。2.2 本地直接编译人脸检测示例在 x86 Linux/macOS 主机上本地编译命令如下以usb模式为例bazel build \ --compilation_modeopt \ --define darwinn_portable1 \ --define MEDIAPIPE_DISABLE_GPU1 \ --define MEDIAPIPE_EDGE_TPUusb \ --linkopt-l:libusb-1.0.so \ mediapipe/examples/coral:face_detection_tpu其中几个开关的含义需要理解清楚--compilation_modeopt开启优化保证实时推理性能--define darwinn_portable1启用 Coral 的便携式驱动支持Darwinn 是 Edge TPU 芯片的内部代号--define MEDIAPIPE_DISABLE_GPU1关闭 GPU 相关代码路径因为本示例推理走 Edge TPU、图像处理走 CPU不需要桌面 GPU 管线--define MEDIAPIPE_EDGE_TPUusb定义上文所述宏并让third_party拉取 Edge TPU 运行时库与 USB 驱动。在仓库中make封装的 Bazel 命令同时默认追加了--define MEDIAPIPE_EDGE_TPUall见 Makefile即 USB/PCIe 一并支持。三、Edge TPU 推理宏在源码中的实际作用--define MEDIAPIPE_EDGE_TPU宏的影响点集中在 tflite_inference_calculator.cc这也是所有 Coral 示例共用推理算子。从源码可以梳理出四条被宏激活的代码分支禁用桌面加速委托#if !defined(MEDIAPIPE_EDGE_TPU)时才会引入并启用 XNNPack 委托L70-L72、L949启用 Edge TPU 后该委托不参与避免与硬件委派冲突。注册 Edge TPU 自定义算子宏开启后引入tflite/public/edgetpu.hBuildEdgeTpuInterpreter通过resolver-AddCustom(edgetpu::kCustomOp, edgetpu::RegisterCustomOp())把 Edge TPU 自定义算子注入解析器再以interpreter-SetExternalContext(kTfLiteEdgeTpuContext, edgetpu_context)把解释器外设上下文指向 Edge TPUL108-L119。自动识别模型中的 Edge TPU 算子ContainsEdgeTpuCustomOp遍历模型 flatbuffer 中所有子图的算子检查operator_codes中是否存在edgetpu::kCustomOpL94-L106。运行时按需打开设备图初始化阶段若模型确含 Edge TPU 自定义算子则通过edgetpu::EdgeTpuManager::GetSingleton()-OpenDevice()打开设备并构建 Edge TPU 解释器否则退回普通解释器路径L849-L869。同时MEDIAPIPE_EDGE_TPU与 Emscripten 分支一样会把解释器线程数强制设为 1L873-L879因为 Edge TPU 算子本身在硬件上串行执行。可见只要给bazel传入MEDIAPIPE_EDGE_TPU宏TfLiteInferenceCalculator就会自动检测模型是否面向 Edge TPU即是否含edgetpu::kCustomOp并选择合适的解释器普通 TFLite 模型也能继续按原逻辑运行两种模型可在同一编译产物中共存。四、交叉编译从 x86 主机产出 ARM 二进制树莓派等 ARM32 板卡与 Coral Dev Board 等 ARM64 板卡通常无法直接在板卡上完成整套 Bazel 构建。此时有两种做法在主机安装交叉编译工具链或直接使用仓库预置的 Docker 环境推荐环境开箱即用。4.1 进入预配置的 Docker 交叉编译环境# 面向 ARM32例如 Raspberry Pi make -C mediapipe/examples/coral PLATFORMarmhf docker # 面向 ARM64例如 Coral Dev Board make -C mediapipe/examples/coral PLATFORMarm64 docker该命令会构建Dockerfile.PLATFORM对应的镜像并把仓库根目录挂载进容器、以当前用户身份启动交互式 shell。容器内已经装好交叉编译工具链进入后可直接执行 Bazel 构建。从 Makefile 可看到dockertarget 实际做了三件事docker run以交互 TTY 模式运行、把$(MEDIAPIPE_DIR)即仓库根挂载到容器内/mediapipe、把宿主机用户映射进容器以解决文件权限问题。4.2 容器内手动交叉编译进入 Docker 环境后ARM32 构建命令为bazel build \ --crosstool_topcrosstool//:toolchains \ --compilergcc \ --cpuarmv7a \ --define darwinn_portable1 \ --define MEDIAPIPE_DISABLE_GPU1 \ --define MEDIAPIPE_EDGE_TPUusb \ --linkopt-l:libusb-1.0.so \ mediapipe/examples/coral:face_detection_tpuARM64Coral Dev Board构建命令为bazel build \ --crosstool_topcrosstool//:toolchains \ --compilergcc \ --cpuaarch64 \ --define darwinn_portable1 \ --define MEDIAPIPE_DISABLE_GPU1 \ --define MEDIAPIPE_EDGE_TPUusb \ --linkopt-l:libusb-1.0.so \ mediapipe/examples/coral:face_detection_tpu二者的区别仅在于--cpu交叉编译 ARM32 用armv7aARM64 用aarch64其余参数与本地编译一致。Docker 环境已预设了BAZEL_CPU环境变量可直接用${BAZEL_CPU}代替bazel build \ --crosstool_topcrosstool//:toolchains \ --compilergcc \ --cpu${BAZEL_CPU} \ --define darwinn_portable1 \ --define MEDIAPIPE_DISABLE_GPU1 \ --define MEDIAPIPE_EDGE_TPUusb \ --linkopt-l:libusb-1.0.so \ mediapipe/examples/coral:face_detection_tpu4.3 用 Makefile 一键构建上面这条带${BAZEL_CPU}的完整命令已经固化在Makefile的buildtarget 中因此无需手动记忆参数直接执行make -C mediapipe/examples/coral \ BAZEL_TARGETmediapipe/examples/coral:face_detection_tpu \ build构建完成后Makefile 会把产物从bazel-bin/自动复制到out/platform目录即仓库根下的out/目录。4.4 不进入交互 shell 的单命令构建如果你不想停留在 Docker 交互 shell 中可以把要执行的构建命令通过DOCKER_COMMAND一次性传入make -C mediapipe/examples/coral \ PLATFORMarmhf \ DOCKER_COMMANDmake -C mediapipe/examples/coral BAZEL_TARGETmediapipe/examples/coral:face_detection_tpu build \ docker运行结束后同样到out/platform目录取二进制。任意 MediaPipe 目标都可以用这种方式交叉编译例如桌面端手部跟踪示例mediapipe/examples/desktop/hand_tracking:hand_tracking_cpu注意hand_tracking_cpu不依赖 Edge TPU若目标不含 Coral 依赖则不需要相应宏。4.5 Makefile 变量速查综合 Makefile 与 README可用的关键变量及默认值如下变量默认值说明PLATFORMamd64选择Dockerfile.值取armhf/arm64/amd64BAZEL_TARGETmediapipe/examples/coral:face_detection_tpu要构建的 Bazel targetBAZEL_CPUk8x86 主机传入--cpu的目标架构BAZEL_COMPILATION_MODEopt传给 Bazel 的编译模式DOCKER_COMMAND空容器内要执行的一条命令缺省时进入交互 shellDOCKER_FILEDockerfile.$(PLATFORM)使用的 Dockerfile4.6 平台与产物目录对照架构PLATFORM输出目录典型目标板ARM32PLATFORMarmhfout/armv7aRaspberry Pi 等 ARM32 板卡ARM64PLATFORMarm64out/aarch64Coral Dev Board 等 ARM64 板卡x86_64PLATFORMamd64out/k8普通 x86 Linux 主机五、两个 Coral 示例目标及其依赖构成mediapipe/examples/coral目录提供两个可直接部署的示例均可按上述任一路径交叉编译# 人脸检测 make -C mediapipe/examples/coral \ PLATFORMarmhf \ DOCKER_COMMANDmake -C mediapipe/examples/coral BAZEL_TARGETmediapipe/examples/coral:face_detection_tpu build \ docker # 目标检测 make -C mediapipe/examples/coral \ PLATFORMarmhf \ DOCKER_COMMANDmake -C mediapipe/examples/coral BAZEL_TARGETmediapipe/examples/coral:object_detection_tpu build \ docker从 BUILD 可以看出两个二进制的构成逻辑demo_run_graph_main是一个通用cc_library依赖calculator_framework、image_frame(_opencv)、OpenCV highgui/imgproc/video、parse_text_proto与 absl 等即读配置 → 跑图 → 摄像头输入/窗口输出的可复用骨架详见下文第六节face_detection_tpu与object_detection_tpu是各自独立的cc_binaryface_detection_tpu链接了mediapipe/graphs/face_detection:desktop_live_calculators与图像/张量处理算子image_transformation_calculator、tflite_converter_calculator、tflite_inference_calculator、tflite_tensors_to_detections_calculator、detection_label_id_to_text_calculator、detection_letterbox_removal_calculatorobject_detection_tpu则链接了mediapipe/graphs/object_detection:desktop_tflite_calculators。也就是说示例进程本身不内嵌任何具体业务逻辑具体做什么检测完全由启动时传入的.pbtxt图配置决定这也正是同一入口可运行人脸、目标乃至其他桌面示例的原因。六、运行入口demo_run_graph_main 的三种输入输出模式作为共享运行入口demo_run_graph_main.cc 定义三个命令行 flagFlag默认值作用--calculator_graph_config_file空必填文本格式CalculatorGraphConfigproto 文件路径决定加载哪张推理图--input_video_path空视频文件完整路径为空则尝试打开摄像头设备索引 0--output_video_path空结果保存路径仅.mp4编码器为avc1为空则在窗口中实时显示其工作流与桌面端hello world一脉相承用mediapipe::file::GetContents读取.pbtxt并ParseTextProtoOrDie解析成CalculatorGraphConfig→graph.Initialize(config)→ 通过AddOutputStreamPoller轮询output_video流 → 循环capture 取帧、BGR2RGB转色、包裹成ImageFrame以时间戳 packet 送入input_video流 → 取回结果帧、RGB2BGR转回并显示或写盘。摄像头模式下会固定 640x48030fps 并关闭自动对焦L80-L87load_video为真时不做水平翻转、为假时按摄像头镜像习惯水平翻转L103-L105。七、部署到目标板并运行7.1 拷贝产物与辅助文件交叉编译产物在主机out/platform目录。把二进制连同对应的模型、图配置一起拷到目标系统。为了省事可以直接把整个mediapipe目录拷贝过去scp -r mediapipe userhost:.face_detection_tpu与object_detection_tpu在运行期需要mediapipe/examples/coral/graphs/下的.pbtxt与mediapipe/examples/coral/models/下的.tflite、标签文件按第 9 节命令的相对路径从仓库根解析所以保持目录层级完整拷贝即可直接运行。7.2 目标板安装运行依赖目标系统需要 OpenCV 运行时库Debian/Ubuntu 系安装命令为sudo apt-get install -y \ libopencv-core-dev \ libopencv-highgui-dev \ libopencv-calib3d-dev \ libopencv-features2d-dev \ libopencv-imgproc-dev \ libopencv-video-dev如果目标板通过 USB 连接 Coral USB Accelerator还需额外安装libusbsudo apt-get install -y \ libusb-1.0-0对应 Linux 桌面发行版编译时的libusb-1.0-0-dev交叉编译的目标板只需运行库源码构建依赖仅宿主机需要。7.3 运行人脸/目标检测把 USB 摄像头和 Coral 设备USB 加速器或 Dev Board 板载 Edge TPU连接到目标板后执行# 人脸检测 GLOG_logtostderr1 ./face_detection_tpu --calculator_graph_config_file \ mediapipe/examples/coral/graphs/face_detection_desktop_live.pbtxt # 目标检测 GLOG_logtostderr1 ./object_detection_tpu --calculator_graph_config_file \ mediapipe/examples/coral/graphs/object_detection_desktop_live.pbtxtGLOG_logtostderr1让 glog 日志输出到 stderr便于观察推理状态。窗口将实时显示叠加了红框检测结果及目标类别/置信度的画面——即文章开头两张演示图所示的效果。八、推理图逐节点拆解人脸检测128×128 Edge TPU 模型face_detection_desktop_live.pbtxt 定义了一整条摄像头输入 → 缩放 → 量化 → TPU 推理 → 锚点解码 → NMS → 去 letterbox → 标注叠加的数据流FlowLimiterCalculator流量控制器。首帧直通其后必须等下游TfLiteTensorsToDetectionsCalculator产出一次detections通过FINISHED回边信号才放行下一帧期间的帧直接丢弃把在途帧数限制为 1避免实时场景下中间节点排队导致延迟与内存膨胀图内注释对此有完整说明。ImageTransformationCalculator把输入图缩放到128×128scale_mode: FIT保持宽高比、允许留 letterbox并额外输出LETTERBOX_PADDING供后续还原坐标。TfLiteConverterCalculator把ImageFrame转成TfLiteTensoruse_quantized_tensors: true对应 Edge TPU 所需的 8bit 量化张量输入。TfLiteInferenceCalculator加载mediapipe/examples/coral/models/face-detector-quantized_edgetpu.tflite在 Edge TPU 上执行推理详见第三节的宏分支。SsdAnchorsCalculator按 SSD 配置4 层、strides: 8/16/16/16、min_scale: 0.1484375、max_scale: 0.75、输入 128×128、fixed_anchor_size: true生成 896 个锚点对应下文num_boxes: 896。TfLiteTensorsToDetectionsCalculator把模型输出的张量结合锚点解码为人脸检测框配置中num_coords: 16、num_keypoints: 6、num_values_per_keypoint: 2表明模型还回归了 6 个关键点双眼、双耳、鼻、嘴x_scale/y_scale/h_scale/w_scale: 128.0与 128×128 输入对应min_score_thresh: 0.75过滤低分框。NonMaxSuppressionCalculator非极大值抑制min_suppression_threshold: 0.3、algorithm: WEIGHTED去除重叠冗余框。DetectionLetterboxRemovalCalculator把 letterbox 图上的归一化框坐标换算回原始输入图坐标人脸图缩放采用 FIT 模式因此这一步必不可少。DetectionsToRenderDataCalculator AnnotationOverlayCalculator将检测结果转为红色r:255 g:0 b:0绘制指令叠加到原图上输出output_video。九、推理图逐节点拆解目标检测300×300 Edge TPU 模型object_detection_desktop_live.pbtxt 与上例结构同构但面向 91 类 COCO 目标检测模型几点关键差异ImageTransformationCalculator输出300×300且未设置 scale_mode即默认STRETCH整幅图被拉伸填满 300×300宽高比可能改变、物体会变形但该目标检测模型对形变不敏感图内注释说明因此不需要 letterbox也无需DetectionLetterboxRemovalCalculator。TfLiteInferenceCalculator加载object-detector-quantized_edgetpu.tflite。TfLiteTensorsToDetectionsCalculator解码参数不同num_classes: 91、num_boxes: 2034、num_coords: 4纯框无关键点、ignore_classes: 0忽略背景类、x_scale/y_scale: 10.0、h_scale/w_scale: 5.0、apply_exponential_on_box_size: true、min_score_thresh: 0.6。NonMaxSuppressionCalculatormax_num_detections: 3每帧最多保留 3 个框、min_suppression_threshold: 0.4。DetectionLabelIdToTextCalculator通过label_map_path: mediapipe/examples/coral/models/object_detection_labelmap.txt把类别 ID 映射为可读标签文本这就是演示画面上 person / keyboard / cell phone 文字的来源。收尾同样是DetectionsToRenderDataCalculator AnnotationOverlayCalculator叠加红框输出。两张图都以FlowLimiterCalculator开头、以input_stream: input_video/output_stream: output_video作为对外接口与demo_run_graph_main.cc中硬编码的输入输出流名kInputStream/kOutputStream严格对应这也解释了为何同一入口能无缝切换这两套检测图。十、可复用的构建方法论小结纵观整个示例可以沉淀出一套在 MediaPipe 上落地 Coral Edge TPU 应用的可复用模式准备 Edge TPU 量化模型将模型转换为含edgetpu::kCustomOp自定义算子的.tflite本示例直接使用仓库models/下的现成模型编写图配置按第八、九节的算子链编写.pbtxt把TfLiteInferenceCalculator的model_path指向 Edge TPU 模型其余参数输入尺寸、锚点、解码尺度、阈值必须与模型训练配置一致选择编译形态目标与宿主机同架构直接bazel build加--define MEDIAPIPE_EDGE_TPUusb|pci|all跨架构则用make -C mediapipe/examples/coral PLATFORMarmhf|arm64 DOCKER_COMMAND... docker一条命令产出out/armv7a或out/aarch64二进制部署与运行目标板安装 OpenCV 与libusb-1.0-0保持目录结构拷贝后用GLOG_logtostderr1 binary --calculator_graph_config_file graph.pbtxt启动。该流程不止适用于两个官方示例——只要提供正确的模型与图配置任何人脸、手势、姿态等 MediaPipe 桌面示例都可以沿同样的交叉编译与容器化路径移植到 Coral 边缘设备上。【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考