← Назад к курсу

Обзор библиотек и подходов к работе с моделями компьютерного зрения в Python

1. Ключевые библиотеки

Библиотека Основные возможности Примечания
OpenCV Обработка изображений, детекция объектов, фильтры, функции feature detection (SIFT, SURF) Быстрая работа с массивами NumPy, ориентация на реальное время
TensorFlow / Keras Глубокие нейронные сети, CNN, предустановленные модели (MobileNet, ResNet) Интеграция с tf.data для эффективного ввода
PyTorch Гибкость граф‑строения, широкое сообщество исследователей, модели Vision Transformer (ViT) Поддержка динамических вычислений, удобство для кастомных архитектур
Detectron2 (Facebook) Семейство методов.instance segmentation, keypoint detection, panoptic segmentation Высокая точность, но требует более мощных ресурсов
FastAI Высоко‑уровневый API, автоматизированный training‑pipeline, transfer learning Идеально для быстрых прототипов и обучения на небольших датасетах

2. Сравнение подходов

Подход Точность (пример на ImageNet) Требуемые ресурсы Скорость инференса Удобство кастомизации
CNN (ResNet‑50, EfficientNet) ~76 % top‑1 Средние‑высокие Высокая Средняя (модели фиксированы)
Vision Transformer (ViT) ~84 % top‑1 Высокие (GPU) Средняя Высокая (можно менять слои, токены)
Meta‑learning (MAML) Зависит от задачи Очень высокие Низкая‑средняя Сложная настройка
Self‑supervised learning (SimCLR, BYOL) До +5 % без разметки Средние‑высокие Средняя Высокая (требует предобучения)

3. Лучшие практики

  1. Трансферное обучение

    • Использовать предобученные модели (ResNet, EfficientNet, ViT) и дообучать на собственном датасете.
    • Заморозить ранние слои, дообучать только классификатор.
  2. Дата‑агрегация и аугментация

    • Применять случайные обрезки, повороты, цветовые трансформации (RandAugment).
    • Для малых наборов данных – fastai‑потоки аугментации.
  3. Оптимизация обучения

    • Выбирать оптимизатор AdamW с параметром weight_decay.
    • С.Grid‑search для подбора lr‑ scheduler‑ов (CosineAnnealing, One‑Cycle).
  4. Оценка и верификация

    • Использовать torchvision.metrics и sklearn.metrics для точности, F1, mAP.
    • Приimbral‑balancing – stratify‑split, weighted loss.
  5. Развёртывание

    • Экспортировать в ONNX/Optimize для ускорения инференса.
    • При деплое в production – рассматривать TensorRT (NVIDIA) или OpenVINO (Intel).

4. Примеры кода

Пример 1: Трансферное обучение с PyTorch + ResNet‑50

import torch, torchvision
from torchvision import transforms, models

# 1️⃣ Подготовка трансформаций
train_tf = transforms.Compose([
    transforms.RandomResizedCrop(224),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406],
                         std =[0.229, 0.224, 0.225])
])

# 2️⃣ Загрузка данных
train_ds = torchvision.datasets.ImageFolder('data/train', transform=train_tf)
train_loader = torch.utils.data.DataLoader(train_ds, batch_size=32, shuffle=True)

# 3️⃣ Модель
model = models.resnet50(pretrained=True)
for param in model.parameters():
    param.requires_grad = False          # Замораживаем базовые слои
model.fc = torch.nn.Linear(model.fc.in_features, <num_classes>)

# 4️⃣ Оптимизатор и обучение
optimizer = torch.optim.AdamW(model.fc.parameters(), lr=1e-3)
criterion = torch.nn.CrossEntropyLoss()

for epoch in range(10):
    for imgs, targets in train_loader:
        optimizer.zero_grad()
        outputs = model(imgs)
        loss = criterion(outputs, targets)
        loss.backward()
        optimizer.step()

Пример 2: Инференс с OpenCV + ONNX‑модель

import cv2, onnxruntime as ort

# 1️⃣ Загрузка модели ONNX
session = ort.InferenceSession('model.onnx')

# 2️⃣ Предобработка изображения
def preprocess(img_path):
    img = cv2.imread(img_path)
    img = cv2.resize(img, (224, 224))
    img = img.astype('float32') / 255.0
    img = img.transpose(2, 0, 1)
    img = img - [0.485, 0.456, 0.406]
    img = img / [0.229, 0.224, 0.225]
    return img.unsqueeze(0)

# 3️⃣ Получение предсказания
input_tensor = preprocess('test.jpg')
outputs = session.run(None, {session.get_inputs()[0].name: input_tensor})
pred = outputs[0]                     # Скораб-вектор
print('Prediction:', pred.argmax())

5. Рекомендованные источники

  • Книги: "Deep Learning for Computer Vision" (Adrian Rosebrock); "Vision Transformers" (Aleksandr Tokarev).
  • Статьи: arXiv‑preprint «An Image is Worth 16×16 Words: Transformers for Image Recognition at Scale», Facebook AI «Detectron2».
  • Курсы: Coursera «Computer Vision with TensorFlow», Fast.ai «Practical Deep Learning for Coders».
  • Рекомендованные репо: pytorch/vision, facebookresearch/detectron2, tensorflow/models.

Что дальше?

  • Выберите подходящую библиотеку в зависимости от объёма данных и доступных ресурсов.
  • Начните с transfer learning на небольшом наборе, затем экспериментируйте с более сложными архитектурами (ViT, Detectron2).
  • Не забывайте про auгментацию и проверку на валидации — это ключ к высокой обобщающей способности.