查看 Markdown

轻量安装

LibreYOLO 的 ONNX 推理路径从头到尾都是 numpy,包括解码和 NMS。这条路径上没有任何东西在运行时需要 PyTorch,所以一次跳过依赖解析的安装,可以在机器上没有 torch 的情况下跑检测。

适用范围
ONNX 检测,七个模型家族
入口
libreyolo.backends.onnx.OnnxBackend
支持级别
尽力而为(best effort),不是单独的发行版

这为什么可行

pip install --no-deps libreyolo 会安装这个包,并完全跳过它的依赖列表。没有任何 东西替你解析,你要自己负责装上你实际用到的那些。

只有当你想走的代码路径确实不需要你跳过的那些依赖时,这才有用,而 ONNX 检测正是 如此。解码,包括非极大值抑制在内,是 numpy 写的。预处理配方是 numpy 写的。 PyTorch 是训练和 eager 推理的依赖,在这条路径上它从来不会被调用。

在这个版本之前,导入本身就会失败:导入 libreyolo.models 下的任何东西,都会构建 每一个模型类,用来填充检查点(checkpoint)自动识别的注册表(registry),而这些类 是 torch.nn.Module 的子类。预处理配方现在住在自己的包里,libreyolo.preprocess, torch 的导入被推迟到有东西真的碰到某个 torch 属性时才发生,所以在机器上没有 torch 的情况下,ONNX 路径也能完成导入。那个包里为每个家族放了一个 numpy 原生的预处理 器:yolo9yolonasyoloxecrtdetrrfdetrdfinedeimdeimv2,比下文端到端验证过的那七个家族多两个。每个 libreyolo/models/<family>/utils.py 都从它那里重新导出,所以现有的导入路径仍然 可用。

先试试仅 CPU 的 wheel

大多数来问这件事的人,想避开的是一次几个 GB 的安装,而体积集中在一个地方:默认的 torch wheel 打包了 CUDA。仅 CPU 的构建只有它的一小部分,而且不需要什么特殊的安装 方式。

轻量
# 安装这个包但不带它的依赖列表,然后自己补上 ONNX 检测路径# 实际会导入的那四个包pip install --no-deps libreyolopip install numpy pillow opencv-python-headless onnxruntime
仅 CPU 的 torch
# 先试这个,它保留全部功能,并避开 CUDA wheel,# 磁盘占用主要就出在那里pip install libreyolo --index-url https://download.pytorch.org/whl/cpu

仅 CPU 这个选项保留了 LibreYOLO 的每一项功能:训练、验证、每一种任务、每一个家族、 CLI。只有当你想让机器上一点 torch 都没有,而不只是少一点时,才走轻量这条路。

轻量安装覆盖什么

任务检测
格式ONNX
入口OnnxBackend
接口Python 库

这条路径上验证过七个家族:YOLOv9YOLO-NASEdgeCrafterRT-DETRRF-DETRD-FINEDEIM,每个家族的各个变体都 算在内。

这是验证过的范围,不是库强制执行的边界。其他任务和其他家族只是不在检查过的范围 里:有些在你调用时会把 torch 拉进来,也有少数可能碰巧能跑。这份清单之外的东西, 都按尚未验证看待,而不是按受支持或按坏掉看待。

在清单之内,结果和正常安装是完全一致的,而不只是接近。每个家族都导出成 ONNX 并跑了 两次,一次正常跑,一次在 torch 被屏蔽的情况下跑;检测框、分数和类别完全对得上。 测试套件里有一个一致性测试,防止这个约定漂移。

五个容易踩的坑

OnnxBackend,不要用模型类。 LibreYOLO9("model.onnx") 仍然需要 torch, 因为 LibreYOLO9 本身就是 nn.Module 的子类。这是最容易犯的错误,因为这套文档里 其他每一页都是通过模型类或者 LibreYOLO() 来加载模型的。

在别的地方导出。 生成 .onnx 文件需要 torch,所以轻量的那台机器造不出来。在 开发机或者 CI 机器上导出,再把产物送到精简的目标机上。

Results 里装的是 numpy 数组。 这里的 result.boxes.xyxy 是一个 ndarray。 容器两种类型都接受,所以属性名没有变化,但对结果调用 .cpu().numpy() 的 代码会失败。

单张图片返回一个 Results predict() 对一张图片返回一个 Results,对多张 返回一个列表。用 [0] 索引单个结果,取到的是第一个检测框,而不是第一张图片, 这会悄无声息地给你一个只有一个框的结果,而不是报错。

CLI 用不了。 typerclick 不在这四个包里,所以 libreyolo 命令不可用。 这是一次库的安装。

预测

Python
from libreyolo.backends.onnx import OnnxBackend model = OnnxBackend("libreyolo9t.onnx")result = model.predict("https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg") # 这里的 xyxy 是 numpy ndarray,不是 torch 张量print(result.boxes.xyxy)print(result.boxes.conf)print(result.boxes.cls)

onnxruntime 换成 onnxruntime-gpu 就能跑在 CUDA 上。这四个包是一次完整的、 不带 torch 的 predict() 实际导入的那些,是在调用过程中记录下来的,而不是推想 出来的。opencv-python-headless 顶替了声明里的 opencv-python:同一个模块,不带 GUI 库,占的磁盘更小。

在其余声明的依赖里,requests 只在从 URL 加载图片时才需要,pycocotoolsscipy 用于验证和评估,typerclick 是 CLI。

这份清单会漂移,这是设计如此

上面那份软件包清单,对应的是本页顶部标明的那个版本。--no-deps 让你退出了依赖 解析,所以没有任何东西替你检查它,后续的版本也可能导入这里没有列出的东西。

如果你碰到 ModuleNotFoundError,你已经明白这套做法了:把缺的包装上。这就是预期 的维护方式,而不是一份缺陷报告。这条路径属于尽力而为,不是单独受支持的发行版, 这也是为什么 PyPI 上没有第二个轻量包,也没有做一个的计划。

要确认你的环境真的没有 torch,而不是悄悄回退到某个已经装好的副本,用断言检查 一下:

python
import importlib.util

assert importlib.util.find_spec("torch") is None, "torch is installed"

对精简镜像来说,这个检查值得留在 CI 里。没有它,一个碰巧装了 torch 的环境会通过 每一项测试,什么也告诉不了你。

已针对 LibreYOLO v1.5.0 验证。