大家好,我是何三,独立开发者
之前我分享过一款 OCR-API 工具,用于检测图片的旋转角度,帮助大家快速将倾斜的图片"转正"。

最近,有位老哥反馈让优化下,正好过年有空,我对这个工具进行了重大升级——从 burn 框架迁移到 ONNX Runtime,并用 Rust 完全重写。升级后的版本性能提升显著,今天就来和大家分享一下这次升级的成果。

为什么选择重写?
之前的版本基于 burn 框架,虽然功能正常,但在部署和性能方面存在一些痛点:
- 部署复杂:需要携带额外的模型文件,运行时路径配置容易出问题
- 内存占用较高:对于资源受限的环境不太友好
- 启动速度慢:模型加载需要一定时间
这次重写,我选择了 Rust + ONNX Runtime 的组合,主要考虑:
- 性能:Rust 的零成本抽象和 ONNX Runtime 的高效推理
- 部署:静态资源打包,一个 exe 文件搞定
- 安全:Rust 的内存安全特性

核心升级亮点
1. 静态资源嵌入
这次升级最大的改进之一,就是将 ONNX 模型直接嵌入到可执行文件中:
// 嵌入二进制文件
const MODEL_BYTES: &[u8] = include_bytes!("../rotate_model.onnx");
这意味着: - 部署时无需携带额外的模型文件 - 避免运行时文件路径问题 - 简化分发和部署流程
最终的可执行文件约 90 MB左右,包含了所有必需的资源。
2. 技术栈升级
| 组件 | 新版本 |
|---|---|
| Web 框架 | Axum 0.7.9 |
| ONNX 推理 | ort 2.0.0-rc.9 |
| 图像处理 | image 0.25.5, ndarray 0.16 |
| 异步运行时 | tokio 1.42.0 |
3. API 接口保持兼容
接口设计保持简单易用:
POST /yzm_api/xuanzhuan/{token}/b64
请求参数:img - Base64 编码的图像数据
响应示例:
{
"code": 0,
"msg": "success",
"data": 90.0
}
性能测试数据
重写后的性能表现让我非常惊喜,下面是详细的测试数据。
内存占用
| 指标 | 数值 |
|---|---|
| 工作集内存 | 20.78 MB |
| 私有内存 | 12.24 MB |
对于包含 ONNX 模型的 OCR 服务来说,这个内存占用非常轻量!
处理速度
单次顺序测试(10次):
| 指标 | 数值 |
|---|---|
| 首次请求耗时 | 68 ms(包含模型初始化) |
| 后续请求平均耗时 | 3-4 ms |
| 最小响应时间 | 2 ms |
并发压力测试(50次,每次5个并发):
| 指标 | 数值 |
|---|---|
| 成功率 | 100% |
| 平均响应时间 | 471.88 ms |
| 峰值内存 | 20.78 MB |
关键发现
- 内存占用极低:实际工作集内存仅约 20-21 MB
- 首次加载有预热:第一次请求约 68ms,后续仅需 2-4ms
- 内存稳定性好:经过 60 次请求后,内存仅增长约 0.36MB,无内存泄漏
- 并发处理能力强:支持多并发请求,表现稳定
部署更简单
部署时只需要两个个文件:
deploy/
├── ocr_api.exe # 主程序(已嵌入模型)
└── config.ini # 配置文件
启动服务:
.\ocr_api.exe
服务默认监听 0.0.0.0:3000,启动后会显示:
________ ___________________ _____ __________.___
\_____ \ \_ ___ \______ \ / _ \\______ \ |
/ | \/ \ \/| _/ ______ / /_\ \| ___/ |
/ | \ \___| | \ /_____/ / | \ | | |
\_______ /\______ /____|_ / \____|__ /____| |___|
\/ \/ \/ \/
欢迎使用ocr-api,本软件仅供学习、研究,请勿用于非法用途
启动完成
总结
这次升级带来的改进是全方位的:
- ✅ 低内存占用:仅约 20MB 工作集内存
- ✅ 高处理速度:预热后单次请求 2-4ms
- ✅ 内存稳定:无内存泄漏
- ✅ 并发支持:支持多并发请求
- ✅ 部署简单:静态资源嵌入,无需额外文件
如果你也在做图像处理相关的项目,或者需要一个轻量级的图片角度检测服务,欢迎试试这个新版本。
软件下载:关注“何三笔记”,回复“ocr-api”进行获取软件
本软件仅供学习、研究,请勿用于非法用途