PaddleDetection 基于 Arm Virtual Hardware 在 Cortex-M55 裸机部署 PP-PicoDet 目标检测模型完整指南
PaddleDetection 基于 Arm Virtual Hardware 在 Cortex-M55 裸机部署 PP-PicoDet 目标检测模型完整指南【免费下载链接】PaddleDetectionObject Detection toolkit based on PaddlePaddle. It supports object detection, instance segmentation, multiple object tracking and real-time multi-person keypoint detection.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleDetection本文基于 PaddleDetection 仓库中的 deploy/third_engine/demo_avh 示例系统讲解如何将 PP-PicoDet 目标检测模型部署到 Arm® Cortex®-M55 CPU 的裸机bare metal环境并通过 Arm Virtual HardwareAVH虚拟硬件平台完成仿真运行与结果验证。读者可以从中掌握 AVH 环境搭建、TVMtvmc模型编译、图像到 C 数组转换、裸机交叉编译、仿真器运行以及自定义输入图片的完整端到端流程并理解 PicoDet 模型结构与底层部署原理。概览在裸机 Cortex-M55 上运行 PP-PicoDetdeploy/third_engine/demo_avh目录包含一个完整的示例将 PaddleDetection 的 PP-PicoDet 目标检测模型运行在 Arm Cortex-M55 CPU 的裸机无操作系统环境上并使用 Arm Virtual Hardware 进行仿真验证。整个示例的自动化流程由 run_demo.sh 脚本驱动它会依次完成环境准备按需自动安装依赖、下载 PP-PicoDet 推理模型、使用 tvmc 将模型编译为面向 Cortex-M55 与 CMSIS-NN 的代码、把输入图片转换为 C 数组头文件、构建裸机可执行程序、在基于 Arm Corstone-300 软件的虚拟硬件上运行最后在仿真串口UART输出检测框坐标、类别与置信度分数。上图为本示例默认使用的 640×640 公园场景测试图片COCO 风格含人物等目标用于验证裸机推理流程的输出结果。运行环境与前置条件根据运行环境的不同前置条件分为三种情况Case 1Arm Virtual Hardware AMI 实例推荐在 AWS / AWS 中国区提供的 Arm Virtual Hardware Amazon Machine ImageAMI实例中运行时所需软件会通过 configure_avh.sh 脚本自动安装无需手动干预。Case 2TVM 提供的 ci_cpu Docker 容器使用 TVM 官方 ci_cpu Docker 容器时所需软件已预先安装可直接运行示例。Case 3手动安装依赖若不在上述两种环境中需要自行安装以下软件基于 Arm Corstone-300 软件的 Fixed Virtual PlatformFVPCMake 3.19.5Arm 提供的 GCC 交叉编译工具链arm-none-eabi-gccArm Ethos-U NPU 驱动栈CMSISCortex 微控制器软件接口标准本目录 requirements.txt 中列出的 Python 库paddlepaddle、numpy、opencv-python可通过以下命令安装 Python 依赖pip install -r ./requirements.txt在 Case 2 与 Case 3 中还需要将 CMake 与 FVP 的可执行文件路径加入PATH环境变量。例如安装到/opt/arm时export PATH/opt/arm/FVP_Corstone_SSE-300/models/Linux64_GCC-6.4:/opt/arm/cmake/bin:$PATH此外还需要 TVM可通过 TLCPack 安装或从源码构建从源码构建时需在config.cmake中设置以下开关set(USE_CMSISNN ON) set(USE_MICRO ON) set(USE_LLVM ON)说明FVP、CMSIS、TVM 等均为第三方工具具体获取与安装方式以其官方发布渠道为准本文不作外部链接展开。运行演示应用基础运行命令在满足上述任一环境条件后执行./run_demo.sh在 AWS / AWS 中国区 AVH AMI 实例中运行时脚本会自动安装所有依赖并完成从下载模型到输出检测结果的完整流程。使用本地 FVP 运行如果无法使用云端 AVH AMI 实例可通过--enable_FVP 1参数让应用运行在本地 FVP 可执行文件上./run_demo.sh --enable_FVP 1指定 CMSIS 与 Ethos-U 平台路径当 Ethos-U 平台或 CMSIS 未安装在默认路径/opt/arm/ethosu时可通过参数显式指定./run_demo.sh --cmsis_path /home/tvm-user/cmsis \ --ethosu_platform_path /home/tvm-user/ethosu/core_platform脚本支持的完整参数从 run_demo.sh 的show_usage()函数可以看到脚本支持的全部参数参数说明-h, --help显示帮助信息--cmsis_path CMSIS_PATH设置 CMSIS 的路径--ethosu_platform_path ETHOSU_PLATFORM_PATH设置 Arm Ethos-U core platform 的路径--fvp_path FVP_PATH设置 FVP 的路径脚本会自动拼接models/Linux64_GCC-6.4子目录加入PATH--cmake_path设置 cmake 的路径--enable_FVP设为1时使用本地 FVP 可执行文件运行0默认时使用云端 AVH运行流程详解源码级1. 环境初始化与参数解析脚本启动后先设置默认的交叉编译工具链路径/opt/arm/gcc-arm-none-eabi/bin并通过sudo pip install -r ./requirements.txt安装 Python 依赖随后逐项解析命令行参数。根据--enable_FVP的值选择仿真平台默认使用VHT_Corstone_SSE-300_Ethos-U55云端 AVH本地模式使用FVP_Corstone_SSE-300_Ethos-U55若选择云端模式且/opt/arm/不存在脚本会自动调用sudo ./configure_avh.sh完成环境安装。2. 下载 PaddlePaddle 推理模型脚本会下载 PaddlePaddle 推理格式的picodet_s_320_coco_lcnet_no_nms模型包并解压wget https://bj.bcebos.com/v1/paddledet/deploy/Inference/picodet_s_320_coco_lcnet_no_nms.tar tar -xf picodet_s_320_coco_lcnet_no_nms.tar该模型与 configs/picodet/picodet_s_320_coco_lcnet.yml 训练配置对应输入 320×320、LCNet 主干网络、COCO 80 类且推理时去除了 NMS 后处理no_nms将后处理移交给裸机端 C 代码完成。3. 使用 tvmc 编译模型脚本使用 TVM 的 tvmc 命令行工具将 PaddlePaddle 模型编译为面向 Cortex-M55 与 CMSIS-NN 的 C 代码python3 -m tvm.driver.tvmc compile --targetcmsis-nn,c \ --target-cmsis-nn-mcpucortex-m55 \ --target-c-mcpucortex-m55 \ --runtimecrt \ --executoraot \ --executor-aot-interface-apic \ --executor-aot-unpacked-api1 \ --pass-config tir.usmp.enable1 \ --pass-config tir.usmp.algorithmhill_climb \ --pass-config tir.disable_storage_rewrite1 \ --pass-config tir.disable_vectorize1 picodet_s_320_coco_lcnet_no_nms/model.pdmodel \ --output-formatmlf \ --model-formatpaddle \ --module-namepicodet \ --input-shapes image:[1,3,320,320] \ --outputpicodet.tar关键编译参数说明--targetcmsis-nn,c生成 CMSIS-NN 算子与纯 C 代码混合的目标在 Cortex-M 系列上利用 CMSIS-NN 库加速卷积等算子--target-cmsis-nn-mcpucortex-m55/--target-c-mcpucortex-m55指定目标 CPU 为 Cortex-M55--runtimecrt使用 TVM 的 C Runtime适合无操作系统的裸机环境--executoraotAOTAhead-Of-Time执行器编译期生成静态可调用的推理函数--executor-aot-interface-apic与--executor-aot-unpacked-api1生成 C 接口、非打包unpackedAPI便于裸机代码直接调用--pass-config tir.usmp.enable1启用统一静态内存池USMP在编译期完成静态内存规划避免运行时动态分配这对裸机场景至关重要--input-shapes image:[1,3,320,320]固定输入张量为 NCHW 布局的 1×3×320×320--output-formatmlf输出为 MLFModel Library Format模型库格式--module-namepicodet生成的运行函数命名为tvmgen_picodet_run等与主程序中的调用对应。编译产物picodet.tar解包后将得到codegen/host下的模型生成源码与runtimeCRT目录供后续 Makefile 引用。4. 生成输入与输出 C 头文件python3 ./convert_image.py ./image/000000014439_640x640.jpgconvert_image.py 负责将图片转换为 C 数组并写入头文件include/inputs.h包含输入图像张量数据float input[]声明在.data.tvm段中预处理过程为resize 到模型输入尺寸 → BGR 转 RGB → CHW 转置 → 除以 255 归一化 → 减去 ImageNet 均值[0.485, 0.456, 0.406]并除以标准差[0.229, 0.224, 0.225]include/outputs.h包含输出张量占位数组其中output0为 8500 个 float对应 2125 个候选框 × 4 个坐标值output1为 170000 个 float对应 2125 个候选框 × 80 个类别分数这两个尺寸与 PicoDet 的no_nms输出结构一一对应。生成的头文件通过__attribute__((section(.data.tvm), aligned(16)))将张量数据放到专门的.data.tvm段便于链接脚本统一规划到 DDR 内存区域。5. 交叉编译与仿真运行make使用 Makefile 完成裸机应用的交叉编译核心输入包括主程序 src/demo_bare_metal.cTVM 编译生成的 codegen 源码build/codegen/host/src/*.c与 CRT 运行时stack_allocator.c、crt_backend_api.cCMSIS 设备启动代码CMSIS_PATH/Device/ARM/ARMCM55/Source/*.c与 CMSIS-NN 静态库通过 arm-none-eabi-gcc.cmake 工具链文件以 CMake 构建Corstone-300 平台的 UART 驱动源码core_platform/targets/corstone-300/*.c。编译参数使用-mcpucortex-m55 -mthumb -mfloat-abihard等目标为 ARMCM55链接脚本为 corstone300.ld其内存规划如下内存区域基地址大小用途ITCM0x00000000512KB存放代码只读DTCM0x20000000512KB存放数据读写SSE-300 SRAM0x210000002MB通用 SRAMData SRAM0x010000002MB数据 SRAMDDR0x6000000032MB大容量内存存放模型权重.rodata.tvm/.data.tvm段随后脚本启动仿真平台并运行可执行文件$Platform -C cpu0.CFGDTCMSZ15 \ -C cpu0.CFGITCMSZ15 -C mps3_board.uart0.out_file\-\ -C mps3_board.uart0.shutdown_tag\EXITTHESIM\ \ -C mps3_board.visualisation.disable-visualisation1 -C mps3_board.telnetterminal0.start_telnet0 \ -C mps3_board.telnetterminal1.start_telnet0 -C mps3_board.telnetterminal2.start_telnet0 -C mps3_board.telnetterminal5.start_telnet0 \ ./build/demo --stat其中mps3_board.uart0.out_file-将仿真串口输出重定向到终端shutdown_tagEXITTHESIM用于在应用退出后自动结束仿真。6. 裸机推理主程序剖析src/demo_bare_metal.c 是裸机应用的核心。main()函数先初始化 UART然后构造 TVM 生成的输入/输出结构体并调用推理函数struct tvmgen_picodet_outputs rec_outputs { .output0 output0, .output1 output1, }; struct tvmgen_picodet_inputs rec_inputs { .image input, }; tvmgen_picodet_run(rec_inputs, rec_outputs);推理完成后进入后处理循环对output1中每个候选框共 2125 个按 80 类排布步长 2125遍历所有类别找出最大分数及其类别当分数大于阈值0.1且坐标output0有效时将坐标乘以 2 还原到 640×640 原始图像尺度并打印box: x0, y0, x1, y1, class: 类别ID, score: 置信度这正是模型在训练/推理配置中去除 NMS 后把解码与阈值过滤放到裸机端 C 代码完成的典型实现方式。使用自定义图片convert_image.py 接收一个命令行参数即待转换图片的路径。修改 run_demo.sh 中的以下行即可使用自己的图片python3 ./convert_image.py path/to/image脚本会将该图片执行 resize、颜色空间转换、归一化等预处理后生成include/inputs.h与include/outputs.h两个头文件供主程序编译链接。注意图片内容应尽量与 COCO 80 类目标人、动物、车辆等相关以获得有意义的检测输出。模型介绍PP-PicoDet本示例使用的模型为 PP-PicoDetPaddleDetection 推出的轻量级目标检测模型。得益于其出色的性能表现PP-PicoDet 非常适合部署在移动端或 CPU 等资源受限平台。其对应训练配置位于 configs/picodet/picodet_s_320_coco_lcnet.yml关键结构配置如下主干网络 LCNetscale: 0.75输出特征图feature_maps: [3, 4, 5]特征金字塔 LCPANout_channels: 96检测头 PicoHeadV2feat_in: 96、feat_out: 96、num_convs: 2、share_cls_reg: True、use_se: True训练策略300 个 epoch、use_ema: true、基础学习率 0.32配合 CosineDecay 与 LinearWarmup 调度。推理时模型输入为 1×3×320×320 的归一化图像输出为no_nms形式的候选框坐标张量与类别分数张量与上文 convert_image.py 生成的输出头文件尺寸完全吻合。常见问题与排查建议无法使用云端 AVH 实例改用./run_demo.sh --enable_FVP 1在本地 FVP 上运行CMSIS / Ethos-U 平台不在默认路径通过--cmsis_path与--ethosu_platform_path显式指定如/home/tvm-user/cmsis、/home/tvm-user/ethosu/core_platformtvmc 编译失败确认 TVM 构建时已开启USE_CMSISNN、USE_MICRO、USE_LLVM且PATH中能找到 cmake 与 FVP输出检测结果为空检查输入图片是否与 COCO 类别相关、预处理resize 到 320×320 并归一化是否正确以及后处理阈值0.1是否需要调整链接或运行期内存问题检查 corstone300.ld 中 ITCM/DTCM/DDR 区域配置是否满足模型权重与运行时内存需求例如 CPU 缓存大小通过仿真参数cpu0.CFGDTCMSZ/cpu0.CFGITCMSZ配置。总结通过 deploy/third_engine/demo_avh 示例开发者可以快速将 PaddleDetection 的 PP-PicoDet 模型部署到 Arm Cortex-M55 裸机环境并在 Arm Virtual Hardware 虚拟硬件上完成完整的仿真验证。该示例覆盖了模型下载 → TVM 编译CMSIS-NN CRT AOT→ 图像转 C 数组 → 裸机交叉编译 → 仿真运行与结果输出的嵌入式 AI 部署全链路为移动端与嵌入式端侧部署 PaddleDetection 系列模型提供了可复制的参考方案。【免费下载链接】PaddleDetectionObject Detection toolkit based on PaddlePaddle. It supports object detection, instance segmentation, multiple object tracking and real-time multi-person keypoint detection.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleDetection创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

2026最新实战:3步搞定色瑟项目,解决API变更痛点

2026最新实战:3步搞定色瑟项目,解决API变更痛点

2026最新实战:3步搞定色瑟项目,解决API变更痛点 刚把项目升级到最新版,发现之前写的接口调用全报错?别慌,这不是你的代码写得烂,是底层协议变了。很多老项目卡在“版本升级后 API 全变了”这一步,直接导致上线延期。…

2026/9/23 9:04:20 阅读更多 →
GUI Design Studio:嵌入式状态驱动界面编译器

GUI Design Studio:嵌入式状态驱动界面编译器

1. 这不是“拖拽出个窗口”那么简单:GUI Design Studio到底在解决什么问题?GUI Design Studio不是又一个画布上拉控件、改颜色、导出代码的玩具工具。我用它做过工业HMI组态系统、医疗设备嵌入式操作面板、实验室数据采集终端的前端,也带过三…

2026/9/23 9:03:20 阅读更多 →
Python交通事故数据分析可视化毕设实战:ETL清洗+H3热力图+Flask离线看板

Python交通事故数据分析可视化毕设实战:ETL清洗+H3热力图+Flask离线看板

简介:本资源是一套基于Python实现的中国交通事故数据分析与可视化系统源码及配套资料,面向计算机、人工智能、自动化等专业的本科生与教师,适用于毕业设计、课程大作业及数据分析实践学习。项目已通过高分答辩(98分)&a…

2026/9/23 9:03:20 阅读更多 →

最新新闻

fidder避坑指南

fidder避坑指南

3个步骤搞定Fiddler环境,源码解析助你避坑 配置环境就卡半天,这大概是每个后端或测试工程师在接入 Fiddler 时的共同噩梦。你下载了安装包,双击运行,结果浏览器毫无反应,或者抓包全是乱码,甚至直接导致服务崩溃。别急,今天我不讲虚的…

2026/9/23 9:48:25 阅读更多 →
前端实现table表格高亮demo,vue+elementui

前端实现table表格高亮demo,vue+elementui

<template><div><el-table ref"myTable" :data"tableData" style"width:100%"><el-table-column prop"data" lable"日期" width"180"><template slot-scope"scope"><…

2026/9/23 9:48:25 阅读更多 →
unity urp的内置后期效果参数

unity urp的内置后期效果参数

效果参数详解1. Tonemapping 色调映射参数含义展厅 Mode映射算法&#xff1a;None&#xff08;不映射&#xff0c;易死白&#xff09;/ Neutral&#xff08;中性&#xff09;/ ACES&#xff08;电影感&#xff0c;对比更稳&#xff09;ACES2. Bloom 泛光参数含义推荐Threshold多…

2026/9/23 9:48:25 阅读更多 →
惠普1020打印机驱动:3步解决报错,兼顾性能优化实战

惠普1020打印机驱动:3步解决报错,兼顾性能优化实战

惠普1020打印机驱动:3步解决报错,兼顾性能优化实战 刚接手新设备,打印测试页直接弹出一堆红色报错,StackTrace 满屏乱窜,根本看不懂哪行代码崩了?别急,这不仅是驱动问题,更是系统调用链路的 性能优化…

2026/9/23 9:48:25 阅读更多 →
5分钟搞定必死陷阱:Python与Go进程控制完整示例对比

5分钟搞定必死陷阱:Python与Go进程控制完整示例对比

5分钟搞定必死陷阱:Python与Go进程控制完整示例对比 官方文档翻了三遍还是晕头转向?别急,直接上干货。很多老铁在搞自动化运维或者后端服务时,卡在进程管理的“必死”问题上,其实就是没看懂 完整示例…

2026/9/23 9:48:25 阅读更多 →
UVC摄像头开发实战:C++与C#双语言采集方案与避坑指南

UVC摄像头开发实战:C++与C#双语言采集方案与避坑指南

简介&#xff1a;这份资源面向从事USB摄像头开发的C与C#程序员&#xff0c;聚焦UVC&#xff08;USB Video Class&#xff09;设备驱动与应用开发这一细分领域。UVC标准让摄像头无需专用驱动即可在Windows、Linux、macOS上完成视频传输&#xff0c;而包内代码正是围绕该协议展开…

2026/9/23 9:47:24 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事&#xff1a;用Flutter给OpenHarmony做一款游戏集合类的App&#xff0c;说白了就是把若干小游戏塞进一个壳里&#xff0c;用统一入口分发。这个方向本身不算新鲜&#xff0c;真正让我花了不少心思的&#xff0c;是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档&#xff0c;最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事&#xff1a;今天在表后面多加了两个空白行&#xff0c;明天给客户交稿前发现整个章节的编号全部错位&#xff0c;光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年&#xff0c;说实话&#xff0c;第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年&#xff0c;流量惨淡、功能臃肿、代码自己都懒得看第二遍之后&#xff0c;我才慢慢琢磨明白一个道理&#xff1a;第一个网站是练手&…

2026/9/22 8:51:04 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践&#xff1a;原型怎样变成可用功能分类&#xff1a;[AI/大模型]细分主题&#xff1a;AI 增强型 CI/CD 流水线自动化与 GitOps 实践&#xff1a;Agent 工作流、工具调用与任务拆解&#xff1a;从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战&#xff1a;复盘记录怎样真正派上用场分类&#xff1a;[工程技术]细分主题&#xff1a;Kubernetes 生产环境运维与排障实战&#xff1a;可复制的项目复盘模板与决策记录大部分团队的事故复盘报告&#xff0c;最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理&#xff1a;核心链路应该先拆哪一步分类&#xff1a;[工程技术]细分主题&#xff1a;Docker 容器化技术与镜像安全管理&#xff1a;核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用&#xff08;包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →