Генерация синтетических данных для Computer Vision
Реальная разметка 10 000 изображений с полигональными масками стоит месяцы работы аннотаторов и немалые деньги. При этом мирового нет: у клиента 400 размеченных фото дефектов на конвейере, а модель YOLOv8 с таким объёмом выдаёт [email protected] = 0.51. Синтетические данные — не замена реальным, но инструмент, который закрывает этот разрыв без найма армии разметчиков.
Когда синтетика реально помогает, а когда нет
Три сценария, где синтетика даёт измеримый прирост:
Дисбаланс классов. На производственной линии редкий дефект встречается раз в 5 000 единиц. Recall по этому классу — 0.23. Генерация 2 000 синтетических экземпляров через copy-paste аугментацию на реальных фонах поднимает recall до 0.71 без изменения архитектуры.
Privacy-ограничения. Медицинские снимки, документы, лица — там реальные данные либо нельзя использовать вне защищённого контура, либо их объём клинически мал. GAN или диффузионная генерация с соблюдением распределения — рабочий выход.
Новая задача без исторических данных. Склад ещё не построен, робот ещё не куплен, а модель нужна к запуску. Рендеринг 3D-сцен в Blender/NVIDIA Omniverse даёт первую обученную модель заранее.
Синтетика не помогает, если domain gap слишком велик — модель, обученная на рендере, ложится на реальных фото без domain adaptation.
Основные методы и инструменты
3D-рендеринг
NVIDIA Omniverse Replicator — наиболее зрелый инструмент для CV-синтетики. Позволяет генерировать изображения с автоматической разметкой: bounding boxes, маски сегментации, depth maps, normal maps — всё из одного пайплайна. Рандомизация материалов, освещения, положения камеры встроена.
import omni.replicator.core as rep
with rep.new_layer():
# Рандомизация положения объекта
cube = rep.create.cube(semantics=[("class", "defect")])
with rep.trigger.on_frame(num_frames=5000):
with cube:
rep.modify.pose(
position=rep.distribution.uniform((-50, 0, -50), (50, 0, 50)),
rotation=rep.distribution.uniform((0, -180, 0), (0, 180, 0))
)
rep.randomizer.lights()
Blender + Python scripting — более гибкий вариант для кастомных сцен. Достаточно базового знания Blender API и скрипта для batch-рендера.
GAN и диффузионные модели
Stable Diffusion с ControlNet — генерация фотореалистичных изображений по маскам или скелетам. Для CV-задач актуально: задаёшь маску дефекта, получаешь вариации текстуры и освещения на этой маске.
StyleGAN3 — хорошо работает для лиц и медицинских изображений с контролируемой вариативностью. FID (Fréchet Inception Distance) < 10 достигается на датасетах от 10 000 реальных образцов.
Pix2Pix / CycleGAN — domain transfer: из синтетики в реалистичное изображение. Помогает закрыть domain gap без повторной разметки.
Copy-paste аугментация
Самый дешёвый метод для детекции — вырезать реальный объект и вставить на разные фоны. Библиотека albumentations с CopyPasteAugmentation или кастомный скрипт. При корректном смешении (Gaussian blur на краях, согласование освещения) прирост mAP — 5–15% без единой новой разметки.
Кейс: детекция дефектов стекла
Клиент — производитель автомобильных стёкол. Исходный датасет: 380 изображений с 6 классами дефектов (царапины, сколы, пузыри, включения, трещины, мутность). YOLOv8m на этих данных: [email protected]:0.95 = 0.38, по классу «включение» — recall 0.19.
Что сделали:
- Отрендерили 8 000 синтетических изображений в Blender с рандомизацией положения, угла съёмки, освещения (3 типа источников).
- Добавили copy-paste для редких классов (включение, пузырь) — ещё 3 000 примеров.
- Domain adaptation: CycleGAN для перевода рендера в стиль реальных фото с линии.
- Финальный датасет: 380 реальных + 11 000 синтетических. Разбивка 80/10/10 только из реальных данных в val/test.
Результат: [email protected]:0.95 = 0.67, recall по «включению» — 0.74. Время разметки — 0 дополнительных часов.
Валидация синтетических данных
Главная ошибка — смешивать синтетику в val/test сет. Оценка модели должна проводиться только на реальных данных. Иначе метрики выглядят красиво, а в production модель не работает.
Metrics для оценки качества синтетики:
- FID — близость распределений синтетики и реальных данных (< 30 — приемлемо)
- KID (Kernel Inception Distance) — более устойчив на малых выборках
- Перенос через модель: обучи на синтетике, протестируй на реальных — это единственный честный тест
Сроки
| Метод | Подготовка | Генерация 10k изображений |
|---|---|---|
| Copy-paste аугментация | 1–2 дня | часы |
| Blender 3D-рендеринг | 1–3 недели (3D-модели) | 1–3 дня |
| NVIDIA Omniverse | 2–4 недели | 1–5 дней |
| Stable Diffusion / GAN | 1–4 недели (fine-tuning) | часы–дни |
Стоимость зависит от метода, сложности сцен и объёма требуемых данных.







