Разработка пайплайна аугментации изображений для обучения CV-модели

Мы столкнулись с типичной задачей: датасет из 800 изображений стал датасетом из 24 000 — звучит красиво, но если аугментации неправильные, модель просто переобучится на артефакты самих трансформаций. Аугментации должны имитировать реальные изменения в production-данных, а не просто увеличивать колич

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    998
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1267
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    713
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1006

Мы столкнулись с типичной задачей: датасет из 800 изображений стал датасетом из 24 000 — звучит красиво, но если аугментации неправильные, модель просто переобучится на артефакты самих трансформаций. Аугментации должны имитировать реальные изменения в production-данных, а не просто увеличивать количество картинок. Наша практика подтверждает: правильно настроенный пайплайн поднимает accuracy на 5–12% без новой разметки и экономит бюджет. Например, в проекте по детекции дефектов на металле мы изначально применили фотометрические аугментации, но модель начала путать царапины с бликами. После замены на геометрические и добавления синтетики через Stable Diffusion recall вырос с 0.61 до 0.78 при precision выше 0.80. Экономия на разметке составила от $2,000 до $10,000. В среднем клиенты экономят от $5,000 до $15,000 на каждом проекте.

Как выбрать политику аугментации под конкретный домен?

Настройка аугментаций зависит от домена и задачи. Для outdoor нужны сильные изменения освещения и погоды. Для medical — только геометрические и осторожные фотометрические. Ниже — базовая политика на Albumentations, которую мы адаптируем под проект.

import albumentations as A from albumentations.pytorch import ToTensorV2 def build_augmentation_pipeline( task: str = 'detection', # 'classification' | 'detection' | 'segmentation' domain: str = 'outdoor' # 'outdoor' | 'indoor' | 'medical' | 'satellite' ) -> A.Compose: """ Политика аугментации зависит от домена. Outdoor — агрессивные изменения освещения и погоды. Medical — только геометрические, цветовые противопоказаны. """ geometric = [ A.HorizontalFlip(p=0.5), A.ShiftScaleRotate( shift_limit=0.05 if task == 'detection' else 0.1, scale_limit=0.1, rotate_limit=15, border_mode=0, # constant padding p=0.5 ), ] photometric_outdoor = [ A.RandomBrightnessContrast( brightness_limit=0.3, contrast_limit=0.3, p=0.6 ), A.HueSaturationValue( hue_shift_limit=15, sat_shift_limit=40, val_shift_limit=30, p=0.4 ), A.RandomFog(fog_coef_lower=0.1, fog_coef_upper=0.35, p=0.15), A.RandomRain( slant_lower=-10, slant_upper=10, drop_length=15, drop_width=1, drop_color=(200, 200, 200), blur_value=2, brightness_coefficient=0.85, p=0.1 ), A.RandomSunFlare( flare_roi=(0, 0, 1, 0.5), angle_lower=0, num_flare_circles_lower=3, num_flare_circles_upper=6, src_radius=200, p=0.08 ), ] photometric_medical = [ A.RandomGamma(gamma_limit=(80, 120), p=0.4), A.CLAHE(clip_limit=3.0, tile_grid_size=(8, 8), p=0.3), ] photometric = ( photometric_outdoor if domain == 'outdoor' else photometric_medical ) noise = [ A.GaussNoise(var_limit=(10, 50), p=0.3), A.ImageCompression(quality_lower=75, quality_upper=100, p=0.2), A.Blur(blur_limit=3, p=0.1), ] bbox_params = ( A.BboxParams( format='yolo', label_fields=['class_labels'], min_visibility=0.3 ) if task == 'detection' else None ) transforms = geometric + photometric + noise + [ A.Normalize( mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225) ), ToTensorV2() ] return A.Compose(transforms, bbox_params=bbox_params) 

Когда использовать MixUp и CutMix?

Простые аугментации не убирают переобучение при малом датасете. MixUp и CutMix создают новые примеры смешением двух изображений — это хорошая регуляризация. MixUp, предложенный в статье Zhang et al., 2018 MixUp: Beyond Empirical Risk Minimization, лучше для задач с глобальными признаками, CutMix — для локальных паттернов. При этом важно контролировать коэффициент lambda: для alpha=0.4 смешение получается умеренным, модель лучше обобщает.

import torch import numpy as np def mixup_batch( images: torch.Tensor, # (B, C, H, W) labels: torch.Tensor, # (B,) для классификации alpha: float = 0.4 ) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor, float]: lam = np.random.beta(alpha, alpha) batch_size = images.size(0) perm = torch.randperm(batch_size) mixed_images = lam * images + (1 - lam) * images[perm] labels_a = labels labels_b = labels[perm] return mixed_images, labels_a, labels_b, lam def cutmix_batch( images: torch.Tensor, labels: torch.Tensor, alpha: float = 1.0 ) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor, float]: lam = np.random.beta(alpha, alpha) batch_size, _, H, W = images.shape perm = torch.randperm(batch_size) cut_ratio = np.sqrt(1 - lam) cut_h = int(H * cut_ratio) cut_w = int(W * cut_ratio) cx = np.random.randint(W) cy = np.random.randint(H) x1 = max(cx - cut_w // 2, 0) y1 = max(cy - cut_h // 2, 0) x2 = min(cx + cut_w // 2, W) y2 = min(cy + cut_h // 2, H) mixed = images.clone() mixed[:, :, y1:y2, x1:x2] = images[perm, :, y1:y2, x1:x2] lam = 1 - (y2-y1) * (x2-x1) / (H * W) return mixed, labels, labels[perm], lam def mixup_criterion(criterion, pred, y_a, y_b, lam): return lam * criterion(pred, y_a) + (1 - lam) * criterion(pred, y_b) 

Синтетические данные с Stable Diffusion

Отметим: когда реальных данных менее 100 примеров на класс, синтетика через inpainting или ControlNet даёт прирост AP на 8–15%. Мы используем Stable Diffusion Inpainting для генерации дефектов на пустых фонах. Также применяем ControlNet для генерации по контуру, если нужна точная вставка объекта.

from diffusers import StableDiffusionInpaintPipeline import torch from PIL import Image pipe = StableDiffusionInpaintPipeline.from_pretrained( 'runwayml/stable-diffusion-inpainting', torch_dtype=torch.float16 ).to('cuda') def generate_synthetic_defect( background_image: Image.Image, mask_image: Image.Image, defect_type: str = 'surface crack' ) -> Image.Image: prompt = ( f'industrial {defect_type}, high resolution, ' f'realistic texture, macro photography' ) result = pipe( prompt=prompt, image=background_image, mask_image=mask_image, num_inference_steps=30, guidance_scale=7.5, strength=0.85 ).images[0] return result 

На практике: 80 реальных примеров трещин + 400 синтетических подняли recall с 0.61 до 0.78 при сохранении precision > 0.80. Экономия на разметке — значительная, часто достигает $10,000.

Сравнение стратегий аугментации

Стратегия Прирост accuracy Вычислительная стоимость Применимость
Базовые геометрические +3–7% Минимальная Всегда
Фотометрические +5–12% Минимальная Не для medical
MixUp / CutMix +4–10% Минимальная Классификация
Mosaic (YOLO) +7–15% Низкая Детекция мелких объектов
AutoAugment / RandAugment +5–12% Средняя Общий случай
Синтетика (SD/ControlNet) +8–20% Высокая Дефицит данных

Типичные ошибки при настройке аугментаций

  • Применение фотометрических аугментаций к медицинским снимкам — может уничтожить диагностические признаки.
  • Использование слишком агрессивных геометрических трансформаций для детекции — bbox могут выйти за границы изображения.
  • Отсутствие проверки аугментаций на валидационном наборе — иногда аугментации меняют распределение данных.
  • Пропуск нормализации после аугментаций — это ломает предобученные веса.
  • Неправильная нормализация после аугментаций — одна из частых причин падения метрик на валидации.

Что входит в наш пайплайн аугментации?

Мы предоставляем:

  • Анализ датасета и домена, выявление ключевых вариаций.
  • Выбор стратегии: геометрия, фотометрия, MixUp/CutMix, синтетика.
  • Реализация pipeline на Albumentations с учётом task (bbox, маски).
  • Интеграция в тренировочный цикл (PyTorch/TensorFlow).
  • Эксперименты: A/B тестирование комбинаций, фиксация метрик в Weights & Biases.
  • Генерация синтетических данных (опционально) через Stable Diffusion.
  • Деплой модели с финальным пайплайном (только inference-трансформации).
  • Документация и обучение команды.

Процесс работы

  1. Анализ датасета и домена: изучаем вариативность данных, типичные искажения в production.
  2. Выбор стратегии: геометрия, фотометрия, MixUp/CutMix или синтетика.
  3. Настройка pipeline на Albumentations с учётом task (bbox, маски).
  4. Интеграция в тренировочный цикл (PyTorch/TensorFlow).
  5. Эксперименты: тестируем разные комбинации, фиксируем метрики.
  6. Генерация синтетических данных (опционально) через Stable Diffusion.
  7. Деплой модели с финальным пайплайном (только inference-трансформации).

Сроки и стоимость

Этап Срок
Настройка pipeline аугментации для конкретной задачи 1–2 недели
Генерация синтетических данных (500–2000 примеров) 2–4 недели
Полный цикл: baseline → аугментации → синтетика → финальная модель 4–6 недель

Стоимость рассчитывается индивидуально. Мы гарантируем прозрачный процесс и фиксацию метрик на каждом этапе. Свяжитесь с нами для оценки вашего проекта — подберём оптимальную стратегию аугментации под ключ. Закажите аудит текущего пайплайна — получите конкретные рекомендации по улучшению. Получите консультацию сегодня.