资讯详情

预训练 ONNX 模型转换为 .eim

📅 2026/10/19 13:00:52 | 华诺云谱 👁 阅读
预训练 ONNX 模型转换为 .eim
预训练 ONNX 模型转换为 .eim在开发视觉识别应用时我们可以使用已经训练好的模型完成图像分类、目标检测等任务。本篇文章将介绍如何通过 Edge Impulse把兼容的预训练 ONNX 模型构建为 .eim 部署程序1. 概念讲解什么是预训练模型预训练模型是已经使用数据完成训练的模型保存了学习到的参数。例如一个经过训练的目标检测模型可以识别人、杯子、手机等物体并给出它们在图片中的位置使用预训练模型可以省去自己收集、标注数据和训练的过程。但模型能够识别哪些类别取决于它原来的训练内容不能只修改类别名称就让它获得新的识别能力什么是 ONNXONNX 的全称是 Open Neural Network Exchange是一种开放的机器学习模型表示标准常见文件扩展名为 .onnxONNX 文件保存模型的计算结构、参数以及输入输出信息方便模型在不同工具之间交换和部署。它本身不是可执行程序需要由兼容的推理引擎加载和执行例如ONNX Runtime 就是一种能够执行 ONNX 模型的推理引擎。程序把处理好的图片数据交给它它执行模型计算再返回输出结果Edge Impulse 和 BYOMEdge Impulse 是面向边缘设备的机器学习开发平台提供数据采集、模型训练、优化和部署等功能本教程主要使用其中的 BYOMBring Your Own Model导入已有模型 功能上传现成模型配置与模型匹配的输入输出再为目标设备构建部署文件无需重新训练。BYOM 支持导入 ONNX、TensorFlow SavedModel 和 TFLite 等格式什么是 .eim?.eim 是 Edge Impulse 的一种可执行模型部署产物。在本教程涉及的 Linux 环境中它包含模型推理、相关数据处理代码以及供其他程序调用的通信接口。Python、C 等应用可以通过相应 SDK 与它交互获取推理结果与 ONNX 文件相比.eim 更接近“已经为目标平台构建好的模型运行程序”。因此构建时需要选择正确的系统、处理器架构和计算后端2. 准备模型与转换环境本教程选择已经训练好的 YOLOX-Nano 目标检测模型。它可以识别 COCO 数据集中的 80 类常见物体我们直接使用上游提供的 ONNX 文件无需重新训练YOLOX部署链接我们选择YOLOX-Nano下载后得到yolox_nano.onnx文件适配模型输入模型输入不仅包含图片宽高还包括颜色顺序、数据排列方式和像素数值范围为了方便使用 Edge Impulse 的标准图像输入本教程给模型增加一层输入适配项目原始模型入喉适配后的入口输入形状[1, 3, 416, 416][1, 416, 416, 3]数据布局NCHWNHWC颜色顺序BGRRGB输入类型float32float32像素范围02550255适配层在模型内部完成颜色通道交换和数据维度调整原有预训练权重保持不变这些设置仅针对本文指定的模型文件不能直接套用到其他 ONNX 模型生成适合导入的 ONNX 模型接下来我们创建一个新工程把前面下载的yolox_nano.onnx文件放入该文件夹中并创建prepare_yolox.py文件prepare_yolox.py内容如下frompathlibimportPathimportcv2importnumpyasnpimportonnximportonnxruntimeasortfromonnximportTensorProto,helper,numpy_helper SOURCEPath(yolox_nano.onnx)TARGETPath(yolox_nano_rgb.onnx)LABELS[person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic light,fire hydrant,stop sign,parking meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports ball,kite,baseball bat,baseball glove,skateboard,surfboard,tennis racket,bottle,wine glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot dog,pizza,donut,cake,chair,couch,potted plant,bed,dining table,toilet,tv,laptop,mouse,remote,keyboard,cell phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy bear,hair drier,toothbrush,]defmain(): description : 为指定 YOLOX-Nano 模型添加 RGB 输入适配并核对输出一致性 return : 无返回值 modelonnx.load(str(SOURCE))onnx.checker.check_model(model)originalort.InferenceSession(str(SOURCE),providers[CPUExecutionProvider],)inputsoriginal.get_inputs()iflen(inputs)!1orinputs[0].shape![1,3,416,416]:raiseValueError(本脚本只适用于输入为 [1,3,416,416] 的指定模型)ifinputs[0].type!tensor(float):raiseValueError(原始模型输入必须为 float32)iflen(original.get_outputs())!1:raiseValueError(本脚本要求单输出模型)old_nameinputs[0].name new_inputhelper.make_tensor_value_info(ei_rgb_images,TensorProto.FLOAT,[1,416,416,3],)reverse_channelsnumpy_helper.from_array(np.array([2,1,0],dtypenp.int64),nameei_reverse_channels,)adapters[helper.make_node(Transpose,[ei_rgb_images],[ei_rgb_nchw],nameei_to_nchw,perm[0,3,1,2],),helper.make_node(Gather,[ei_rgb_nchw,ei_reverse_channels],[old_name],nameei_to_bgr,axis1,),]original_nodeslist(model.graph.node)delmodel.graph.node[:]model.graph.node.extend(adaptersoriginal_nodes)delmodel.graph.input[:]model.graph.input.extend([new_input])model.graph.initializer.extend([reverse_channels])onnx.checker.check_model(model)onnx.save(model,str(TARGET))imagecv2.imread(test.jpg)ifimageisNone:raiseFileNotFoundError(请在当前目录放入测试图片 test.jpg)height,widthimage.shape[:2]ratiomin(416/height,416/width)resizedcv2.resize(image,(int(width*ratio),int(height*ratio)),interpolationcv2.INTER_LINEAR,)squarenp.full((416,416,3),114,dtypenp.uint8)square[:resized.shape[0],:resized.shape[1]]resized cv2.imwrite(test_416.png,square)rgbcv2.cvtColor(square,cv2.COLOR_BGR2RGB).astype(np.float32)[None]bgr_nchwnp.ascontiguousarray(rgb[...,::-1].transpose(0,3,1,2))referenceoriginal.run(None,{old_name:bgr_nchw})[0]adaptedort.InferenceSession(str(TARGET),providers[CPUExecutionProvider],)resultadapted.run(None,{ei_rgb_images:rgb})[0]ifreference.shape!(1,3549,85):raiseValueError(输出形状与本教程指定模型不一致)np.testing.assert_allclose(result,reference,rtol1e-4,atol1e-4,)Path(labels.txt).write_text(\n.join(LABELS)\n,encodingutf-8,)print(模型适配与本次测试图片的输出一致性检查通过)print(新输入:,adapted.get_inputs()[0].shape)print(输出:,result.shape)if__name____main__:main()接下来我们还需要准备一张包含人、杯子、手机等常见物体的图片命名为test.jpg当然我们也可以使用Ultralytics 官方 YOLO 目标检测示例图片 bus.jpg使用以下命令即可curl-Lhttps://ultralytics.com/images/bus.jpg-otest.jpg我们进入终端windows的powershell即可python推荐3.11版本创建虚拟环境python-mvenv .venvsource.venv/Scripts/activate接下来安装依赖python-mpipinstall--upgradepip python-mpipinstallnumpy opencv-python onnx onnxruntime然后验证python-cimport cv2, numpy, onnx, onnxruntime; print(依赖安装成功)验证成功之后运行该程序即可python prepare_yolox.py最后我们看到整个文件结构如下图所示yolox_nano_rgb.onnx文件是导入 Edge Impulse 的适配后模型labels.txt是按模型类别编号排列的 80 个标签test_416.png是经过等比缩放、补边的测试图片在 Edge Impulse 中导入模型打开Edge Impulse 登录账号并创建项目创建完成项目后点击下面的Upload your model上传我们刚刚转换好的模型即可这里我们选择自己使用的平台也可以不选择我选择使用arduino 的ventuno q我们第一次操作代表性校准数据可以暂时不上传BYOM的具体操作我们可以查看官方文档这里部署目标我选择ventuno q,选择自己使用的平台即可build完成之后可以参考对应平台的部署文档构建完成后模型会自动下载本教程下载为yolox-nano-onnx-to-eim-linux-aarch64-qnn-v1-impulse-#1.eim的文件配置开发板 可选接下来我们要对ventuno q进行配置首先我们更换镜像源针对arm架构开发板打开配置文件sudonano/etc/apt/sources.list.d/ubuntu.sources把原来的内容替换为图片中的内容即可只修改了URIs部分内容如下Types: deb URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ Suites: noble noble-updates noble-backports Components: main universe restricted multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg## Ubuntu security updates. Aside from URIs and Suites,## this should mirror your choices in the previous section.Types: deb URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ Suites: noble-security Components: main universe restricted multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg接下来安装 Edge Impulse 依赖项sudoaptupdatecurl-fsSLhttps://deb.nodesource.com/setup_20.x|sudo-Ebash-sudoaptinstall-ygcc gmakebuild-essential nodejs sox gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-base gstreamer1.0-plugins-base-apps安装Edge Impulse Linux CLIsudonpminstalledge-impulse-linux-g--unsafe-permEdge Impulse Linux CLI 是 Edge Impulse 提供的一套 Linux 命令行工具主要用于将 Linux 设备连接到 Edge Impulse 平台实现数据采集、模型下载、EIM 部署及模型推理测试APP lab中使用转换的模型点击左下角登录账号要求与 Edge Impulse 账号时同一个邮箱这样可以直接在app lab中使用 Edge Impulse平台的项目无需额外下载移植我们直接copy Detect Objects on Camera工程我们打开Video Object Detection这个brick然后点击AI models页面可以看到yolox-nano-onnx-to-eim项目这个就是我们在Edge Impulse 中转换的模型我们选中这个模型直接运行该app即可注意该app需要连接摄像头我们看到python日志最上方- Local URL: http://localhost:7000 - Network URL: http://10.166.51.72:7000我们在与开发板同一网络的主机电脑下在浏览器打开http://10.166.51.72:7000链接即可实际网络地址会有所不同注意查看
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑