# rust-onnx-infer
**Repository Path**: magic-codex/rust-onnx-infer
## Basic Information
- **Project Name**: rust-onnx-infer
- **Description**: Production-grade ONNX Runtime inference in pure Rust — from YOLO detection and SAM segmentation to Grounding DINO, BiRefNet matting, ArcFace face recognition and RoMaV2 matching. Every engine behind one unified sync/async API, compiled into a single self-contained binary.
- **Primary Language**: Rust
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 14
- **Created**: 2026-09-24
- **Last Updated**: 2026-09-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# rust-onnx-infer
**一个 crate,40+ 视觉引擎,零原生依赖。**
基于 ONNX Runtime 的生产级纯 Rust 推理库 —— 从 YOLO 检测、SAM 分割到 Grounding DINO
开放词表、BiRefNet 抠图、ArcFace 人脸识别、RoMaV2 特征匹配,40+ 引擎共享同一套
同步/异步 API,编译产物为单个自包含可执行文件。
[](https://crates.io/crates/rust-onnx-infer)
[](https://docs.rs/rust-onnx-infer)
[](#许可证)
[](https://www.rust-lang.org)
[English](README.md) | 简体中文
---
## 亮点
- **静态链接 ONNX Runtime** —— 基于 `ort` + 预编译静态库,产物为完全自包含的可执行文件,
无需 `LD_LIBRARY_PATH`、无需环境配置、无运行时下载。
- **纯 Rust 图像处理栈** —— `image` + `fast_image_resize` + 内置颜色空间/形态学/阈值等原语,
**无 OpenCV**、无 C++ 工具链、无跨编译负担。
- **一套 API 打通所有引擎** —— 同步 `predict` / `predict_batch` + tokio 原生
`predict_async` / `predict_batch_async`,40+ 引擎接口完全一致。
- **类别标签零配置** —— 自动从 ONNX 元数据解析类别名(YOLO `names` / `labels` /
`categories`,或逗号分隔格式)。
- **内置 SAHI 切片推理** —— 大图小目标场景提升召回,支持 GREEDYNMM / NMM / NMS 合并
与 IoU / IOS 度量。
- **GPU 加速 + 优雅回退** —— 执行提供器由引入方按目标平台通过 feature 启用:macOS 加
`coreml`(Apple Silicon 可走 ANE/NPU)、NVIDIA 加 `cuda`,另有 `tensorrt` / `directml` /
`openvino` / `rocm`;未启用对应 feature 时该设备类型自动回退 CPU。
## 安装
```bash
cargo add rust-onnx-infer
```
或在 `Cargo.toml` 中添加:
```toml
[dependencies]
rust-onnx-infer = "0.1"
```
## 快速上手
```rust
use rust_onnx_infer::{core::factory::create_detection_engine, DeviceType, Image};
let image = Image::load("input.jpg")?;
let engine = create_detection_engine("yolo11n.onnx", DeviceType::Cpu, 0.5, 0.45)?;
let detections = engine.predict(&image)?;
for d in &detections {
println!("{d}");
}
```
异步只需一行(tokio):
```rust
let out = engine.predict_async(&img).await?;
```
运行完整示例:
```bash
cargo run --example onnx_inference_example
```
## 支持的模型
| 类别 | 说明 |
|---|---|
| **图像分类** | YOLO-CLS(pixel/255)、ImageNet 系(ResNet/MobileNet/EfficientNet/ViT,mean/std 归一化)、自定义归一化 |
| **目标检测** | YOLOv5/v8/v9/v10/v11/v26(自动识别 End2End 与传统布局)、RT-DETR、DETR、RF-DETR |
| **实例分割** | YOLO-Seg(传统 + End2End)、RF-DETR-Seg、YOLOE(运行时视觉提示 / 运行时文本提示 / 烘焙提示) |
| **交互式分割** | SAM、SAM2(单文件合并 ONNX) |
| **开放词表** | Grounding DINO(BERT 分词)、Grounded-SAM(DINO + SAM2 流水线)、DART v2(SAM3 骨干,文本/视觉概念提示,掩码输出) |
| **显著性抠图** | BiRefNet(soft alpha 输出) |
| **超分 / 增强** | Real-ESRGAN(2x/4x 重叠分块)、去噪(DnCNN)、低光增强(Zero-DCE)、去雾(DehazeFormer)、多步增强流水线 |
| **特征匹配** | LightGlue(含批量)、DeDoDe-G、LoMa-R、RoMaV2(密集对应场) |
| **姿态估计** | YOLOv8/11/26-Pose(COCO 17 点,传统+End2End)、RTMO 实时姿态(一阶段 SimCC) |
| **人脸** | YuNet 检测(5 地标)、SFace/ArcFace 识别(512/128 维)、年龄性别、8 类表情、106 精细关键点、活体检测(CDCN 分割式) |
| **文字识别** | PaddleOCR v4/v5 det+rec 流水线(DBNet 检测 + SVTR 识别 + CTC 解码,中英文) |
| **深度估计** | Depth Anything V2 / MiDaS(相对深度图,原图分辨率输出) |
| **风格迁移** | fast-neural-style(candy/mosaic 等,任意尺寸,动/静态自适应) |
| **行人重识别** | OSNet-x1.0(512 维 embedding + 图库检索) |
| **表格识别** | SLANet-plus(结构 token + 单元框,HTML 输出,配合 OCR 回填文本) |
| **旋转框检测** | YOLOv8/11-OBB(传统)+ YOLO26-OBB(End2End),旋转 IoU NMS,DOTA 15 类 |
| **语义分割** | SegFormer-B0(ADE20K 150 类),类别直方图 + 调色板叠加 |
| **人体解析** | SegFormer-B2 人衣 18 类(帽/发/上衣/裤/鞋/四肢部件占比) |
| **人像分割** | PP-HumanSeg / MODNet(实时 alpha 抠人,BGRA 输出) |
| **去模糊** | NafNet(512 对齐输入,输出同尺寸) |
| **图像质量** | QualityAssessor 纯算法(清晰度/亮度/对比度/噪声)+ FIQA 深度 IQA 挂载(352 输入) |
| **二维码检测+解码** | WeChat QR Detector(SSD 先验)+ rqrr 内容解码 |
| **动作识别** | ST-GCN 骨架动作分类(COCO17 帧序列输入,配合姿态引擎) |
| **姿态规则** | 零模型几何规则(躺卧/站立/举手判别) |
| **手势分类** | 手部 21 点纯几何规则(握拳/手掌/胜利/点赞等) |
| **车牌** | mnet 检测(四角透视矫正)+ LPRNet 识别(中国单行/绿牌) |
| **人脸精细关键点** | insightface 2d106det(106 点,YuNet 串联) |
| **手部** | MediaPipe Palm 检测(≤4 手)+ RTMPose-hand 21 关键点 |
| **全身关键点** | RTMPose-m WholeBody 133 点(body17+foot6+face68+hand42) |
## 模块结构
| 模块 | 内容 |
|---|---|
| `core` | 引擎接口 / 基础引擎 / 会话工厂 / 运行配置 / 引擎工厂 / 异步批处理优化器 |
| `engines` | 各模型引擎实现 |
| `sahi` | 切片推理:Slicer / Postprocess / Adapters / SlicedPredictor |
| `util` | MattingUtils(抠图结果合成) |
| `model` | Detection / Segmentation / ClassificationResult / MatchResult / MattingResult 等结果类型 |
| `imaging` | Image / resize / cvtColor / threshold / morphologyEx / boundingRect / FloatMask 等图像原语 |
## 构建说明
- 首次构建时 `ort` 会自动下载 ONNX Runtime 预编译**静态库**(需网络),之后离线可重复构建。
- 项目内 `.cargo/config.toml` 清空了 `PKG_CONFIG_PATH` / `PKG_CONFIG_LIBDIR`:防止 ort-sys
通过 pkg-config 找到系统的 onnxruntime 动态库,确保静态链接、产物自包含。
- 加速后端(Execution Provider):默认 CPU,按需启用(透传至 `ort` 同名 feature):
`features = ["coreml"]`(Apple Silicon 可走 ANE/NPU)、`features = ["cuda"]`(NVIDIA),
以及 `tensorrt` / `directml` / `openvino` / `rocm`。启用后 `DeviceType` 枚举与工厂入口
即已就绪;未启用 feature 时选择该设备类型会回退 CPU 并给出警告。
注意:同时启用多个无单一预编译二进制覆盖的 EP(如 `cuda` + `coreml`)时 `ort` 会在
链接期报错,可另加 `lax-feature-matching` 回退最接近的二进制。
- 二进制获取方式同样由引入方决定:默认 `download-binaries`(自动下载静态库);改为
`default-features = false` 并启用 `load-dynamic` 可在运行时动态加载 `onnxruntime` 库。
- 所有模型的 NMS/CTC 解码/坐标还原等后处理在 CPU 纯 Rust 执行,EP 只加速模型前向。
- 产物为自包含二进制,运行时仅依赖 macOS 系统自带框架,无 OpenCV / ONNX Runtime
动态库依赖(可用 `otool -L target/release/examples/onnx_inference_example` 验证)。
## 模型目录(`models/`)
所有引擎所需模型按**引擎名子目录**组织(`testmodels/` 仅为测试散件):
| 子目录 | 内容 |
|---|---|
| `classification/` | ConvNeXt-tiny |
| `detection/` | yolov8n / yolo26n / rtdetr-l / rfdetr_base |
| `segmentation/` | yolov8n-seg / yolo26n-seg / rfdetr_seg_small |
| `yoloe/` | 11s/26n 文本烘焙版、rt 编码器+检测器、文本编码器(text_encoder/tpe_head/clip_tokenizer) |
| `sam/` `sam2/` | mobile_sam、sam2_fused |
| `grounding_dino/` | dinor50 tiny + BERT tokenizer |
| `pose/` `pose_rt/` | yolov8n-pose、yolo26n-pose、rtmo_s |
| `face_detection/` `face_recognition/` `face_attribute/` `face_liveness/` `face_landmark106/` | yunet、sface、age_gender+emotion、CDCN 活体、2d106det |
| `hand/` `wholebody/` | palm 检测 + rtmpose-hand 21 点、rtmpose-wholebody 133 点 |
| `obb/` | yolov8n-obb / yolo26n-obb |
| `semantic_segmentation/` `human_parsing/` `portrait_matting/` | segformer b0/b2、pp_humanseg |
| `ocr/` | PP-OCRv4/v5 det+rec+字典 |
| `table_recognition/` `reid/` | slanet-plus、osnet_x1_0 |
| `deblur/` `depth/` `style_transfer/` `image_quality/` `qr_detector/` | nafnet、depth_anything_v2、candy/mosaic、FIQA、wechat_qr |
| `birefnet/` `real_esrgan/` `image_enhance/` `lightglue/` `dedode/` `lomar/` `roma_v2/` | 对应模型 |
| `dart/` | DART v2 全套(骨干 1.8GB,SAM License) |
| `test_images/` | 各引擎共用测试图 |
## 测试
测试无需任何标志:`cargo test` 自动运行全部用例,模型/测试资产缺失的用例自动 SKIP
(控制台打印缺失清单);设 `MODEL_TESTS=1` 可强制缺失即失败(CI 用)。
模型路径默认搜索 `models/` 与 `testmodels/` 两棵树,也可用 `MODEL_DIR=models/`、
`TESTMODELS_DIR=models/`、`DART_MODELS_DIR=models/dart` 指定。
## 已知限制
- 手部 21 点定位的 MediaPipe 官方模型仅 tflite 格式,库内使用 RTMPose-hand 替代(已完整支持)
- OBB 的 SAHI 合并以轴对齐近似(官方 sahi 不支持旋转框),精确角度场景请关闭 SAHI
- DART 引擎内存约 3.5GB,CPU 单类推理约 45s(推荐 GPU EP)
## 许可证
基于 [MIT License](LICENSE-MIT) 或 [Apache License 2.0](LICENSE-APACHE) 双协议开源,
使用者可任选其一。