尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Kornia 边缘部署实战指南:ONNX Runtime 导出与 kornia-rs 两条生产路径

发布时间:2026/9/24 19:26:57

资讯中心
01
ARTICLE

Kornia 边缘部署实战指南:ONNX Runtime 导出与 kornia-rs 两条生产路径

Kornia 边缘部署实战指南:ONNX Runtime 导出与 kornia-rs 两条生产路径
计算机视觉深度学习人工智能图像处理【免费下载链接】kornia 空间人工智能的几何计算机视觉库项目地址https://gitcode.com/kornia/kornia点击查看免费下载训练好的 Kornia 视觉管线并不一定要随 Python 与 PyTorch 运行时一起交付。本指南以仓库文档 docs/source/get-started/edge.rst 为核心骨架系统讲解把 Kornia 管线部署到生产环境与资源受限设备的两条路径一是将算子和模型导出为 ONNX借助 ONNXSequential 链式组合并在 ONNX Runtime 的 CPU / CUDA / TensorRT / OpenVINO 执行提供商上运行二是使用由同一组织从零开发的 Rust 原生计算机视觉库 kornia-rs面向机器人、相机等不欢迎 Python 运行时的安全关键与嵌入式场景。读完本文你将掌握完整的 ONNX 导出、链式组合、执行提供商切换的实操方法并理解kornia.io底层如何由 Rust 后端驱动。为什么需要把 Kornia 管线带到 Python 之外Kornia 是一个基于 PyTorch 的空间人工智能几何计算机视觉库算子与模型天然运行在 Python PyTorch 的生态里。但生产部署往往面临截然不同的约束推理设备可能是只有几 MB 内存的嵌入式主板、需要毫秒级延迟的相机端、或者对运行时依赖有严格审计要求的安全关键系统。此时把整个 Python 解释器和 PyTorch 运行时打包进设备通常不可接受。针对这一需求Kornia 官方提供了两条互补的部署路径路径核心产物目标场景运行环境ONNX 导出 ONNX Runtime单个.onnx图跨平台推理、GPU 加速、深度学习模型部署CPU / CUDA / TensorRT / OpenVINO 等执行提供商kornia-rsRust 原生库Rust crate嵌入式、安全关键系统、相机与机器人端原生二进制无 Python 运行时下面分别深入两条路径。路径一把 Kornia 管线导出为 ONNX 并在 ONNX Runtime 上运行Kornia 算子和模型均可导出为 ONNX核心入口是 kornia.onnx 模块中的ONNXSequential它能把多个已导出的 ONNX 图本地文件、onnx.ModelProto对象或来自kornia/ONNX_models仓库的预导出算子与模型串联成单个计算图并以类似 PyTorchnn.Sequential的方式直接调用。完整教程见仓库中的 ONNX 支持指南API 参考见 docs/source/onnx.rst。1. 安装 ONNX 与 ONNX Runtime在基础安装之上通过官方 extras 一次性安装onnx、onnxruntime与onnxscript依赖声明见 pyproject.toml 的onnx [onnx, onnxruntime, onnxscript]pip install kornia[onnx]基础安装pip install kornia只包含 PyTorch、numpy 与 kornia-rs见 安装指南。kornia[onnx]额外解锁 kornia.onnx 模块、Kornia 模块的 ONNX 导出能力以及 OnnxLightGlue 匹配器——后者的构造函数会显式检查onnxruntime是否可用缺失时抛出提示安装kornia[onnx]的ImportError。2. 导出你自己的 Kornia 模块任何 Kornia 算子或算子的nn.Sequential都是普通nn.Module因此torch.onnx.export可以直接把它转成ONNXSequential能够加载、链式组合并再次导出的 ONNX 文件。官方指南建议使用 legacy 导出器并固定 opset 17dynamoFalse使 IR 版本与 Hub 上预导出算子的版本保持一致import torch import kornia torch.onnx.export( kornia.color.RgbToGrayscale(), torch.rand(1, 3, 256, 512), gray.onnx, input_names[input], output_names[output], dynamic_axes{input: {0: B, 2: H, 3: W}, output: {0: B, 2: H, 3: W}}, opset_version17, dynamoFalse, )导出产物与任何其他模型一样接入序列ONNXSequential(gray.onnx, ...)。注意 ONNX 图默认的输入/输出节点名约定为input/output这正是ONNXSequential自动串联的前提见下文。除了手动torch.onnx.exportKornia 的 ONNXExportMixin 还为可导出对象提供了to_onnx()方法它以 opset 17、开启常量折叠、input_names[input]/output_names[output]的默认参数调用torch.onnx.export并自动写入(source, kornia)与版本元数据。该 mixin 定义了ONNX_EXPORTABLE、ONNX_DEFAULT_INPUTSHAPE[-1, -1, -1, -1]-1表示动态维度与ONNX_EXPORT_PSEUDO_SHAPE[1, 3, 256, 256]等类属性供导出时构造 dummy 输入与动态轴。3. 用 ONNXSequential 链式组合多个模型ONNXSequential接受任意数量的 ONNX 模型onnx.ModelProto对象或文件路径字符串自动串联并创建优化后的推理会话。来自官方kornia/ONNX_models仓库的算子与模型使用hf://前缀引用import numpy as np from kornia.onnx import ONNXSequential # 来自 kornia/ONNX_models 仓库的两个预导出算子 onnx_seq ONNXSequential( hf://operators/kornia.color.gray.RgbToGrayscale, hf://operators/kornia.geometry.transform.affwarp.Resize_512x512 ) input_data np.random.randn(1, 3, 256, 512).astype(np.float32) outputs onnx_seq(input_data) print(outputs)从源码看kornia/onnx/sequential.pyONNXSequential的构造函数依次完成四件事通过_load_ops加载所有图 → 通过combine(io_maps...)把多个图合并为一个ModelProto→create_session创建 ONNX RuntimeInferenceSession→set_session绑定会话。最终推理通过 mixin 的__call__完成从会话读取输入节点名构造{输入名: numpy 数组}字典后调用session.run(None, ...)返回输出列表见 kornia/core/mixin/onnx.py。4. 自定义模型间的输入输出映射io_maps默认情况下ONNXSequential假定每个 ONNX 图只有一个名为input的输入节点和一个名为output的输出节点并自动按(前图输出, 后图输入)顺序连接。若你的模型 I/O 名称不同通过io_maps指定io_maps [(model1_output_0, model2_input_0), (model1_output_1, model2_input_1)] onnx_seq ONNXSequential(model1.onnx, model2.onnx, io_mapsio_maps)其中io_maps[0]描述第 1、2 个模型之间的连接依此类推。若模型输入输出名称混乱还可先用 ONNXLoader 相关工具函数 中的io_name_conversion()把 I/O 名称统一改写为input/output。5. 导出合并后的单文件模型组合完成后一条export调用即可把整个管线序列化为单个 ONNX 文件便于分发与离线加载onnx_seq.export(combined_model.onnx)export内部调用onnx.save保存self._combined_op合并图。还可以用add_metadata()为合并图附加(key, value)元数据方便追溯模型来源与版本。6. 选择执行提供商CPU / CUDA / TensorRT / OpenVINOONNXSequential与ONNXModule的providers参数控制 ONNX Runtime 的执行提供商execution provider。构造时会按给定顺序创建会话onnx_seq ONNXSequential( hf://operators/kornia.geometry.transform.flips.Hflip, # 本地模型同样可用YOUR_OWN_MODEL.onnx或一个已加载的 onnx.ModelProto hf://models/kornia.models.detection.rtdetr_r18vd_640x640, providers[CUDAExecutionProvider] ) outputs onnx_seq(input_data)如果省略providersONNXRuntimeMixin._create_session 默认使用[CPUExecutionProvider]并把graph_optimization_level设为ORT_ENABLE_EXTENDED。除构造参数外会话创建后还可动态切换设备as_cpu()切换到 CPU 执行as_cuda(device_id0)切换到 CUDA需要安装onnxruntime-gpuas_tensorrt(device_id0)切换到 TensorRTas_openvino(device_typeGPU)切换到 OpenVINOdevice_type支持CPU、NPU、GPU、GPU.0、GPU.1及 Hetero / Multi / Auto 组合。7. 在 CUDA 上运行完整示例CUDA 执行需要onnxruntime-gpu包官方指南给出 CUDA 11.x 的安装示例onnxruntime-gpu1.19.2通过aiinfra索引安装详见 ONNX 支持指南 的 Running on CUDA 一节。安装完成后可在会话间用as_cuda()/as_cpu()自由切换并对比耗时import time import kornia from kornia.onnx import ONNXSequential onnx_seq ONNXSequential( hf://operators/kornia.geometry.transform.flips.Hflip, hf://models/kornia.models.detection.rtdetr_r18vd_640x640, # 也可以换成 YOUR_OWN_MODEL.onnx ) inp kornia.io.get_sample_images()[0].numpy()[None] onnx_seq.as_cuda() onnx_seq(inp) # GPU 预热 start_time time.time() onnx_seq(inp) print(--- GPU %s seconds --- % (time.time() - start_time)) onnx_seq.as_cpu() start_time time.time() onnx_seq(inp) print(--- CPU %s seconds --- % (time.time() - start_time))指南中给出的典型结果为 GPU 约 0.0148 秒、CPU 约 0.1768 秒具体数值随硬件与模型而异此处仅作为量级参考。示例中的kornia.io.get_sample_images()会从预设 URL 下载示例图片到.kornia_hub/images缓存目录后由 Rust 后端解码为张量实现见 kornia/io/sample.py。8. 预导出算子与模型ONNXLoader 与 hf:// 协议官方预导出的算子和模型统一发布在kornia/ONNX_models仓库中可通过两种方式获取在ONNXSequential/ONNXModule中直接写hf://operators/name算子或hf://models/name完整模型使用 ONNXLoader 显式加载返回onnx.ModelProtofrom kornia.onnx.utils import ONNXLoader # 从 Hugging Face 加载算子 ONNXLoader.load_model(hf://operators/kornia.color.gray.GrayscaleToRgb) # 加载本地已转换/已下载的算子 ONNXLoader.load_model(operators/kornia.color.gray.GrayscaleToRgb)从源码看ONNXLoader.load_model支持三种输入hf://前缀自动拼装https://huggingface.co/kornia/ONNX_models/resolve/main/name.onnx下载、http(s)://直链、以及本地已存在的文件路径下载由 CachedDownloader 完成默认缓存到kornia_config.hub_onnx_dir即.kornia_hub/onnx_models见 kornia/config.py。with_dataTrue时还会一并下载外置权重文件.onnx_data。此外list_operators()与list_models()可通过 Hugging Face API 列出仓库内全部可用算子与模型。9. 深入源码合并、会话与版本转换的底层机制ONNXSequential的链式能力建立在 ONNXMixin 的三个关键机制上合并_combine对每个待合并图调用onnx.compose.add_prefix打上K00-、K01-… 前缀以避免节点名冲突再按io_map依次调用onnx.compose.merge_models拼接。默认io_map为(K00-output, K01-input)这正是前面要求input/output命名约定的原因。IR / OPSET 版本转换_auto_version_conversion当auto_ir_version_conversionTrue时自动把模型转换为 IR 版本 9、OPSET 版本 17可通过target_ir_version/target_opset_version覆盖。转换流程先onnx.save_model再onnx.load_model_from_string必要时调用onnx.version_converter.convert_version最后onnx.checker.check_model校验。会话创建_create_session默认开启ORT_ENABLE_EXTENDED图优化级别providers缺省为 CPU会话从序列化图字节直接构建。这些机制在仓库测试中得到印证tests/onnx/test_sequential.py用mock验证了_load_op、merge_models调用、export落盘与create_sessiontests/onnx/test_export_coverage.py 则覆盖了 dynamo 导出器torch.onnx.export(..., dynamoTrue)需要 torch ≥ 2.5在多个算子上的导出路径导出图经onnx.checker校验后在 onnxruntime 下与 eager 结果对比。官方文档亦声明Kornia 大部分公开算子可经torch.onnx.export导出并在 ONNX Runtime 下运行每个算子、模型与增强的导出结论可在 ONNX, torch.compile and torch.export support 页面按名称检索。路径二kornia-rs —— 面向嵌入式与安全关键场景的 Rust 原生库1. kornia-rs 是什么kornia-rs是由 Kornia 同一组织开发的Rust 原生计算机视觉库它不是 Python 绑定或 PyTorch 的包装而是从零实现from-scratch implementation专为安全关键safety-critical与嵌入式应用设计对相机 I/O与高效图像解码提供一等支持。这与 ONNX 路径形成互补——当部署目标是机器人、相机或其他不希望携带 Python 运行时的设备时kornia-rs 是官方推荐的路径。2. kornia.io 的 Rust 后端仓库内的直接证据kornia-rs 并非只存在于仓库文档的描述中——它已经实际驱动着 Kornia 自身的图像 I/O 模块kornia.io。在 kornia/io/io.py 的源码顶部可以看到from kornia_rs import io as _rs_io也就是说Python 包kornia_rs是 Kornia 与 Rust 库之间的桥梁。load_image()与write_image()的全部底层编解码工作都委托给 Rust 后端JPEG 解码.jpg/.jpeg走_rs_io.read_image_jpegturbo基于 TurboJPEG 的高效路径PNG 解码先读取文件头中的 color type 字节灰度0、索引色3走read_image_png_u8(..., mono)RGBA6走rgba其余类型回退到通用read_image编码.jpg/.png/.tiff分别对应write_image_jpeg支持quality参数默认 80、write_image_png_u8/write_image_png_u16、write_image_tiff_u8/write_image_tiff_u16/write_image_tiff_f32支持 uint8、uint16、float32 三种 dtype。load_image还提供desired_type参数ImageLoadType 枚举UNCHANGED、GRAY8、RGB8、RGBA8、GRAY32、RGB32默认RGB32与device参数解码后的 HxWxC 数组经image_to_tensor转为 CxHxW 张量并搬到目标设备。依赖层面pyproject.toml 将kornia_rs0.1.14声明为基础依赖意味着任何pip install kornia都会带上这个 Rust 后端。3. 适用场景与选型建议kornia-rs 的典型定位是部署目标为机器人、相机或其他拒绝 Python 运行时的设备。由于它是独立实现的 Rust crate可编译为体积小、启动快、无解释器的原生二进制适合安全审计严格的场景。若你基于 kornia-rs 构建应用可通过仓库官方渠道Discord与维护团队联系交流。其 Python 侧的价值则体现在kornia.io的底层加速——Python 开发者无需感知 Rust 的存在即可获得由 Rust 后端提供的图像解码与编码能力。两条路径如何选择你的约束推荐路径理由需要跨设备移植深度学习模型、GPU 加速、与现有 ONNX 生态互操作ONNX ONNX RuntimeONNXSequential把管线冻结为单一图CPU / CUDA / TensorRT / OpenVINO 一套模型通吃部署目标是嵌入式设备、相机、机器人不接受 Python 运行时kornia-rsRust 原生实现体积与启动成本低一等相机 I/O 支持只想在 Python 内获得更快的图像编解码无需选择kornia.io已默认由 kornia-rs 后端驱动两条路径并不互斥你可以先用kornia.ioRust 后端在 Python 侧做数据读取与预处理再通过 ONNX 导出把推理部分下沉到任意设备也可以把 ONNX 推理与 Rust 原生视觉逻辑在边缘端各自独立部署。延伸阅读ONNX 支持指南安装、链式组合、I/O 映射、导出与 CUDA 运行的完整教程kornia.onnx API 参考ONNXModule、ONNXSequential、ONNXLoader的完整类文档kornia.io 源码 与 kornia/io/sample.pyRust 后端图像 I/O 的实现细节ONNX mixin 实现导出、合并、会话管理与设备切换的底层逻辑ONNX 测试 与 导出覆盖测试验证链式组合与导出正确性的参考用例安装指南kornia基础安装与kornia[onnx]等可选 extras 说明赞分享计算机视觉深度学习人工智能图像处理【免费下载链接】kornia 空间人工智能的几何计算机视觉库项目地址https://gitcode.com/kornia/kornia点击查看免费下载相关推荐Kornia ONNX 实战指南用 ONNXSequential 导出、串联与部署计算机视觉算子Kornia ONNX 实战指南用 ONNXSequential 导出、串联与部署计算机视觉算子 本篇指南讲解 Kornia 的 ONNX 支持体系如何把任计算机视觉深度学习人工智能图像处理Atmosphère 的 jpegdec 模块解析重实现 Horizon 系统 JPEG 解码服务并开放给 HomebrewAtmosphère 的 jpegdec 模块解析重实现 Horizon 系统 JPEG 解码服务并开放给 Homebrew 导读 jpegdec 是 Atm计算机视觉深度学习人工智能图像处理MXNet 模型部署实战指南ONNX 导出、Jetson 边缘推理与 AWS 云端部署MXNet 模型部署实战指南ONNX 导出、Jetson 边缘推理与 AWS 云端部署 本指南以 Apache MXNet 官方部署专题文档 docs/py深度学习人工智能机器学习分布式训练上一篇HelloGitHub发现有趣开源项目的终极指南下一篇从0到1掌握Knockout.js版本演进API变更全解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。