Ориентация: что такое CV сегодня

Инструменты и окружение CV-инженера

Содержание курса

Окружение курса

Код курса вы запускаете у себя: прогнать модель на своём кадре, замерить, сколько это заняло, посмотреть, где она ошиблась. Соберём окружение под это одним заходом — версии здесь жёсткие, и половина вопросов «почему у меня не работает» снимается именно на этом шаге.

Python и виртуальное окружение

Берите Python 3.13 — на нём собран и прогнан весь курс. Версии новее брать не советуем: научные пакеты выпускают готовые сборки с задержкой, и пока сборки нет, pip пытается компилировать пакет прямо у вас, что на Windows обычно кончается стеной ошибок компилятора.

Заведите папку под курс и создайте в ней окружение, чтобы жёсткие версии курса не разъехались с другими вашими проектами:

mkdir cv-course
cd cv-course
python -m venv .venv

Активация зависит от системы: source .venv/bin/activate на Linux и macOS, .venv\Scripts\Activate.ps1 в PowerShell, .venv\Scripts\activate.bat в cmd. После активации в начале строки терминала появится (.venv).

PyTorch ставится не с PyPI

Это первое место, где легко потерять несколько часов. Обычная команда pip install torch под Windows ставит колесо, собранное без CUDA — платформы вычислений на видеокартах NVIDIA, через которую считает вся экосистема зрения. Ошибки при этом не будет: код запустится, обучение молча уйдёт на процессор и станет медленнее в десятки раз. Поэтому torch берётся из индекса PyTorch, а ключ -i (короткая запись --index-url) на этот индекс и указывает:

pip install torch==2.13.0 torchvision==0.28.0 -i https://download.pytorch.org/whl/cu130

Хвост cu130 — версия CUDA, под которую собрано колесо. Она должна быть не новее той, что поддерживает ваш драйвер: со старым драйвером берите cu126, а если видеокарты нет вовсе — cpu. Версию драйвера показывает nvidia-smi, там же в правом верхнем углу написана максимальная поддерживаемая CUDA.

Остальное ставится обычным способом. Соберите файл requirements.txt:

numpy==2.4.6
scipy==1.18.0
pillow==12.3.0
pyyaml==6.0.3
tqdm==4.70.0
requests==2.34.2
opencv-python==5.0.0.93
ultralytics==8.4.115
timm==1.0.28
albumentations==2.0.8
kornia==0.8.3
supervision==0.29.1
transformers==5.14.1
imagehash==4.3.2
onnx==1.22.0
onnxruntime-gpu==1.28.0
rfdetr==1.9.3
pytorch-lightning==2.6.5
accelerate==1.14.0
peft==0.20.0
torchmetrics==1.9.0
pycocotools==2.0.11
faster-coco-eval==1.7.2
lap==0.5.13
filterpy==1.4.5
rapidocr==3.9.2
Levenshtein==0.27.4
fiftyone==1.20.0
pandas==3.0.5
matplotlib==3.11.1
kagglehub==1.0.2
ezc3d==1.7.2
huggingface-hub==1.26.0
datasets==5.0.1
onvif-python==0.3.1
psutil==7.2.2
py-cpuinfo==9.0.0
av==18.0.0
pip install -r requirements.txt

Версии выписаны точные, и это не занудство: соседние выпуски ultralytics и opencv регулярно расходятся между собой, а разбирать потом чужой конфликт зависимостей дольше, чем поставить нужные версии сразу. Тяжёлое сюда не входит: инструменты экспорта моделей ставятся отдельно, когда понадобятся.

И ещё две команды следом

Установка на строке fiftyone притормозит: этот пакет тянет за собой собственную базу MongoDB. Заодно он приносит с собой чужой opencv. Поэтому сразу после установки выполните:

pip install --force-reinstall --no-deps opencv-python==5.0.0.93

Дело в том, что FiftyOne объявляет зависимость opencv-python-headless<5 и ставит версию 4.10. У OpenCV две сборки под разными именами — обычная opencv-python и opencv-python-headless, та же библиотека без оконной части, для серверов без экрана. Обе кладут на диск один и тот же пакет cv2, поэтому чужая 4.10 перебивает нашу 5.0.0.93, и без этой команды проверка ниже напечатает opencv 4.10. Команда ставит нужную сборку последней и тем самым возвращает и версию, и окна: cv2.imshow у вас работать будет. --no-deps нужен, чтобы вместе с ней не переустановился numpy.

Прописать это строкой в requirements.txt нельзя: pip сверяет весь файл целиком и отказывается ставить пару, которая противоречит объявленным границам FiftyOne. Отсюда и отдельная команда — она эти границы обходит сознательно. Ограничение у FiftyOne устарело: с opencv 5 он и наборы читает, и своё приложение открывает, а до того, какая из двух сборок положила cv2, ему дела нет. После этого pip check будет жаловаться на несошедшиеся границы — так и задумано, окружение от этого не ломается.

Вторая команда — пакет для работы с лицами:

pip install --no-deps insightface==1.0.1

Флаг --no-deps здесь по той же причине, что и отдельная команда выше. insightface объявляет зависимостью onnxruntime — сборку под процессор, — и при обычной установке кладёт её рядом с onnxruntime-gpu из списка. Две сборки в одном окружении делят между собой одно имя onnxruntime и спорят за то, какие устройства доступны; на видеокарте после этого не считается ничего. Остальные зависимости insightface в списке уже есть, так что отключать их безопасно. GPU-сборка при этом умеет и процессор: если видеокарты нет, всё то же самое считается на нём, только медленнее.

Проверка

Соберите файл check.py и запустите его. Он ничего не качает и в сеть не ходит — только смотрит, что пакеты встали и видна ли видеокарта:

import cv2
import torch
import ultralytics

print("torch       ", torch.__version__)
print("сборка CUDA ", torch.version.cuda or "нет — это сборка под процессор")
print("карта видна ", torch.cuda.is_available())

if torch.cuda.is_available():
    card = torch.cuda.get_device_properties(0)
    print("устройство  ", card.name)
    print("видеопамять ", f"{card.total_memory / 1024**3:.1f} ГБ")

print("opencv      ", cv2.__version__)
print("ultralytics ", ultralytics.__version__)

Вот что он печатает на машине, где собирался курс:

Вывод проверки окружения: torch 2.13.0+cu130, CUDA 13.0, карта видна True, 8 ГБ видеопамяти

Ключевые строки — вторая и третья. Если в сборке CUDA стоит прочерк, значит поставилось колесо с PyPI: переставьте torch командой с --index-url. Если сборка с CUDA, а карта видна всё равно False, дело в драйвере — он старше, чем версия CUDA в колесе.

А главная строка здесь — видеопамять. Её объём решает, какая модель у вас влезет и с каким размером входа; марка и поколение карты влияют куда меньше. Курс сделан на карте с 8 ГБ, и примеры обучения подобраны так, чтобы в эти 8 ГБ помещаться.

Если подходящей видеокарты нет

Библиотеки зрения по умолчанию считают на картах NVIDIA. У AMD своя платформа, ROCm: под Linux на ней работают и PyTorch, и Ultralytics, под Windows поддержка появилась недавно и покрывает только свежие карты — Radeon RX 9070 и 9070 XT, RX 9060 XT, RX 7900 XTX, PRO W7900, AI PRO R9700. Для Radeon постарше под Windows рабочего пути нет: остаётся Linux или облако. У Apple Silicon свой ускоритель, MPS: прогнать готовую модель хватает, обучать на нём не стоит.

Своей карты может не быть вовсе — тогда остаётся облако, и бесплатных лимитов на учебные прогоны там хватает. Как завести Google Colab и Kaggle и что там с ограничениями — отдельный шаг ниже в этом уроке.

И не всё в курсе вообще требует видеокарты: замеры скорости, экспорт моделей, ускорение под процессор, работа с документами и распознавание текста проходятся на обычном ноутбуке.

Редактор

Подойдёт любой. Если выбираете — VS Code с расширениями Python и Pylance; после создания окружения выберите его интерпретатором проекта через Ctrl+Shift+P → Python: Select Interpreter и путь внутри .venv. Часть материала удобнее гонять в блокнотах Jupyter — это страницы, где код разбит на ячейки: каждая запускается отдельно, вывод появляется прямо под ней, а переменные остаются общими на весь блокнот. Открывает их у вас на машине расширение Jupyter — поставьте вместе с двумя предыдущими. Облачные Colab и Kaggle — те же блокноты, только в браузере: там ставить ничего не нужно.

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

Переписка и фото хранятся 90 дней после последнего принятого сообщения. Преподаватель получит доступ к диалогу, когда вы попросите его помочь.

Проверка решения остаётся отдельным действием.