Полегшене встановлення
Шлях інференсу ONNX у LibreYOLO використовує numpy від початку до кінця, зокрема для декодування й NMS. Під час виконання йому не потрібен PyTorch, тому встановлення без визначення залежностей може запускати виявлення, коли torch відсутній на машині.
- Застосовується до
- Виявлення ONNX, сім сімейств моделей
- Точка входу
libreyolo.backends.onnx.OnnxBackend- Рівень підтримки
- Максимальні зусилля, не окремий дистрибутив
Чому це працює
pip install --no-deps libreyolo установлює пакет і повністю пропускає його
список залежностей. Нічого не визначається автоматично, і ви самі відповідаєте
за встановлення того, що використовуєте.
Це корисно лише тоді, коли потрібний шлях коду справді не потребує пропущених залежностей. Шлях виявлення ONNX не потребує їх. Декодування, зокрема немаксимальне пригнічення, використовує numpy. Рецепти попередньої обробки використовують numpy. PyTorch є залежністю для навчання й інференсу з негайним виконанням, і на цьому шляху він ніколи не викликається.
До цього випуску імпорт однаково завершувався помилкою: імпорт будь-чого з
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 є ndarray numpy, а не тензором torch.print(result.boxes.xyxy)print(result.boxes.conf)print(result.boxes.cls)Щоб працювати на CUDA, замініть onnxruntime на onnxruntime-gpu.
Чотири пакети, це ті, які повністю вільний від torch виклик predict()
фактично імпортує. Це зафіксовано під час виклику, а не визначено теоретично.
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, пройде всі тести й нічого не доведе.