Облегчённая установка
Путь ONNX-инференса в LibreYOLO написан на numpy от начала до конца, включая декодирование и NMS. Ничто на этом пути не требует PyTorch во время работы, поэтому установка, которая пропускает разрешение зависимостей, может выполнять детекцию, когда torch на машине отсутствует.
- Применимо к
- ONNX-детекция, семь семейств моделей
- Точка входа
libreyolo.backends.onnx.OnnxBackend- Уровень поддержки
- По мере возможностей, не отдельный дистрибутив
Почему это работает
pip install --no-deps libreyolo устанавливает пакет и полностью пропускает
список его зависимостей. Разрешать их за вас никто не будет, и вы сами
отвечаете за установку того, чем действительно пользуетесь.
Это полезно только тогда, когда нужный вам путь исполнения кода и правда обходится без пропущенных зависимостей, — а для ONNX-детекции это так. Декодирование, включая non-maximum suppression, написано на numpy. Рецепты предобработки — тоже numpy. PyTorch нужен для обучения и eager-инференса, а на этом пути он не вызывается ни разу.
До этого релиза импорт всё равно падал: импорт чего угодно из
libreyolo.models создавал каждый класс модели, чтобы заполнить реестр
автоопределения чекпойнтов, а эти классы — подклассы torch.nn.Module.
Теперь рецепты предобработки живут в отдельном пакете libreyolo.preprocess,
а импорт torch отложен до момента, когда что-то обратится к torch-атрибуту,
поэтому ONNX-путь импортируется и без torch на машине. В этом пакете лежит свой
препроцессор на numpy для каждого семейства: yolo9, yolonas, yolox,
ec, rtdetr, rfdetr, dfine, deim и deimv2 — на два больше, чем семь
семейств, проверенных ниже от начала до конца. Каждый
libreyolo/models/<family>/utils.py реэкспортирует из него, поэтому
существующие пути импорта продолжают работать.
Сначала попробуйте wheel только для CPU
Большинству тех, кто об этом спрашивает, нужно избежать установки на несколько
гигабайт, а объём сосредоточен в одном месте: стандартный wheel torch тянет с
собой CUDA. Сборка только для CPU весит малую долю от этого и не требует
особого способа установки.
# Установите пакет без его списка зависимостей, а затем добавьте# четыре пакета, которые ONNX-путь детекции действительно импортирует.pip install --no-deps libreyolopip install numpy pillow opencv-python-headless onnxruntime# Сначала попробуйте этот вариант. Он сохраняет все возможности и# обходится без wheel с CUDA, на который уходит большая часть места.pip install libreyolo --index-url https://download.pytorch.org/whl/cpuВариант только для CPU сохраняет все возможности LibreYOLO: обучение, валидацию, все задачи, все семейства, CLI. Выбирайте облегчённый путь, когда torch на машине не нужен совсем, а не просто нужен поменьше.
Что покрывает облегчённая установка
| Задача | Детекция |
| Формат | ONNX |
| Точка входа | OnnxBackend |
| Интерфейс | Python-библиотека |
На этом пути проверены семь семейств: YOLOv9, YOLO-NAS, EdgeCrafter, RT-DETR, RF-DETR, D-FINE и DEIM — считая варианты внутри каждого семейства.
Это проверенная область, а не ограничение, заложенное в библиотеку. Остальные задачи и остальные семейства просто не входили в проверку: часть из них при вызове потянет torch, а часть может случайно заработать. Считайте всё за пределами этого списка непроверенным, а не поддерживаемым или сломанным.
Внутри списка результаты идентичны обычной установке, а не просто близки. Каждое семейство экспортировали в ONNX и запускали дважды — обычным способом и с заблокированным torch; рамки, оценки и классы совпали в точности. Тест на паритет в наборе тестов не даёт этому контракту разъехаться.
Пять вещей, на которых спотыкаются
Используйте OnnxBackend, а не классы моделей. LibreYOLO9("model.onnx")
по-прежнему требует torch, потому что LibreYOLO9 сам по себе — подкласс
nn.Module. Это самая вероятная ошибка, ведь на всех остальных страницах этой
документации модель загружается через свой класс или через LibreYOLO().
Экспортируйте в другом месте. Чтобы получить файл .onnx, нужен torch, так
что облегчённая машина его не сделает. Экспортируйте на машине для разработки
или в CI и доставляйте артефакт на урезанный целевой хост.
В результатах лежат numpy-массивы. result.boxes.xyxy здесь — это
ndarray. Контейнеры принимают оба типа, поэтому имена атрибутов не меняются,
но код, который вызывает .cpu() или .numpy() на результате, упадёт.
Одно изображение возвращает один Results. predict() возвращает один
Results для одного изображения и список для нескольких. Индексация
одиночного результата через [0] выбирает первую детекцию, а не первое
изображение, и вместо ошибки вы незаметно получаете результат с одной рамкой.
CLI работать не будет. typer и click не входят в эти четыре пакета,
поэтому команда libreyolo недоступна. Это установка библиотеки.
Предсказание
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. Эти
четыре пакета — те, которые полный predict() без torch действительно
импортирует: их записали во время вызова, а не вывели рассуждением.
opencv-python-headless подставлен вместо объявленного opencv-python: тот же
модуль, без GUI-библиотек, меньше на диске.
Из остальных объявленных зависимостей requests нужен только для загрузки
изображения по URL, pycocotools и scipy — это валидация и подсчёт метрик, а
typer и click — это CLI.
Этот список будет устаревать — так задумано
Список пакетов выше верен для релиза, указанного вверху этой страницы.
--no-deps выключает для вас разрешение зависимостей, поэтому список никто не
проверяет, и более поздний релиз может импортировать что-то, чего здесь нет.
Если вы наткнулись на ModuleNotFoundError, приём вам уже понятен: установите
недостающий пакет. Это и есть предполагаемая модель сопровождения, а не повод
для баг-репорта. Этот путь поддерживают по мере возможностей, а не как
отдельный дистрибутив; поэтому на PyPI нет второго облегчённого пакета и не
планируется.
Чтобы убедиться, что среда действительно без torch, а не тихо использует установленную копию, проверьте это явно:
import importlib.util
assert importlib.util.find_spec("torch") is None, "torch is installed"Такую проверку стоит держать в CI для урезанного образа. Без неё среда, в которой torch всё-таки есть, пройдёт все тесты и ничего вам не скажет.