Компьютерное зрение: устройства, 3D-зрение и диффузионные модели

Курс охватывает полный цикл построения систем компьютерного зрения: от работы с датчиками и получения данных до 3D-реконструкции и современных генеративных подходов. Упор делается на практические пайплайны, интеграцию с девайсами и применение диффузионных моделей для анализа и синтеза изображений.

1. Основы CV и подготовка данных: камеры, датасеты, аугментации

Основы CV и подготовка данных: камеры, датасеты, аугментации

Компьютерное зрение (computer vision, CV) почти всегда упирается в две вещи: как устроен источник данных (камера/датчик) и как вы подготовили данные. Эта статья задаёт фундамент для всего курса: дальше мы будем опираться на эти понятия, когда перейдём к 3D-зрению (геометрия, глубина, реконструкция) и к диффузионным моделям (генерация данных, синтетические датасеты, устойчивость к сдвигам домена).

Что такое задача CV и где в ней данные

Типовой пайплайн CV выглядит так:

  • Сбор данных с устройства (камера, глубинный датчик, стереопара, видео).
  • Калибровка и контроль качества (резкость, экспозиция, геометрия).
  • Разметка (классы, боксы, маски, ключевые точки, глубина).
  • Разделение на train/val/test без утечек.
  • Аугментации и нормализация.
  • Обучение и оценка.
  • Анализ ошибок и до-сбор данных.
  • Ключевая идея: модель учится не “видеть мир”, а обобщать паттерны из вашего датасета. Поэтому источники данных, домен (условия съёмки) и разметка часто важнее выбора архитектуры.

    Устройства и камеры: какие бывают и чем отличаются

    RGB-камеры

    RGB-камера даёт 2D-изображение в цветовых каналах. В CV это базовый источник данных для задач:

  • классификации;
  • детекции объектов;
  • сегментации;
  • трекинга.
  • Практические параметры RGB-камеры, которые напрямую влияют на данные:

  • разрешение: компромисс между детализацией и скоростью;
  • частота кадров: критична для трекинга и видеоаналитики;
  • выдержка и усиление (ISO): влияют на шум и смаз;
  • баланс белого: меняет цветовой домен;
  • компрессия (H.264/H.265/JPEG): даёт артефакты, которые модель может “выучить”.
  • Глубинные датчики

    Глубина делает CV ближе к 3D и робототехнике. Самые распространённые подходы:

  • Active stereo / structured light: проектор + камера(ы) (часто в помещении).
  • Time-of-Flight (ToF): измеряет время пролёта света (удобно, но чувствительно к отражениям).
  • Стереозрение: две RGB-камеры, глубина вычисляется по смещению (диспаратности).
  • Глубина обычно приходит как depth map (изображение, где значение пикселя — расстояние). В следующих статьях мы будем подробно разбирать, как из этого строятся 3D-точки и сцены.

    Видеокамеры и “временной” аспект

    Видео — это не просто набор кадров. В нём есть:

  • зависимость между кадрами;
  • motion blur;
  • rolling shutter;
  • трекинг и идентичность объектов.
  • Для датасетов по видео особенно важно правильно делать разбиение (например, не смешивать кадры одного и того же ролика между train и test).

    Дополнительные сенсоры (когда это важно)

  • IMU (акселерометр/гироскоп): помогает стабилизации и одометрии.
  • GPS: привязка к карте.
  • Event camera: работает по изменениям яркости, полезна при высокой скорости и сложном освещении.
  • Модель камеры: что нужно знать практику

    Искажения и калибровка

    Даже “обычная” камера почти всегда даёт геометрические искажения (особенно на широком угле): прямые линии изгибаются, масштаб меняется по полю кадра. Для задач 3D и метрических измерений это критично.

    Калибровка камеры — процесс оценки параметров, которые описывают геометрию камеры:

  • внутренние параметры (intrinsics): фокусные расстояния, оптический центр, иногда коэффициенты искажений;
  • внешние параметры (extrinsics): положение и ориентация камеры относительно мира.
  • Одна из стандартных форм записи проекции 3D-точки на изображение:

    Пояснение всех частей:

  • — 3D-точка в однородных координатах (последняя 1 нужна для удобного учёта сдвига).
  • — поворот и сдвиг , которые переводят точку из координат мира в координаты камеры.
  • — матрица внутренних параметров камеры (содержит фокусные и оптический центр).
  • — координаты пикселя на изображении в однородном виде.
  • — масштабный множитель, связанный с глубиной (упрощённо: насколько точка “далеко”).
  • Если вы делаете чисто 2D-задачи (например, классификацию), калибровка может быть не обязательна. Но как только появляется 3D, стерео, метрика или сшивка кадров — калибровка становится базовым навыком.

    !Иллюстрация того, как 3D-точка проецируется в пиксель с учётом параметров камеры

    Rolling shutter

    У многих камер кадр считывается построчно. Тогда при быстром движении вертикальные линии “косеют”, а геометрия объектов искажается. Это важно:

  • для детекции/трекинга на быстром движении;
  • для визуальной одометрии;
  • для сравнения с синтетическими данными (где rolling shutter часто отсутствует).
  • Датасеты: что это такое “по-взрослому”

    Типы разметки

    Одна и та же картинка может быть размечена разными способами:

  • класс изображения (classification);
  • bounding boxes (detection);
  • маски (semantic/instance segmentation);
  • ключевые точки (pose estimation, face landmarks);
  • depth/normal (для 3D);
  • оптика/треки (для видео).
  • Чем богаче разметка, тем дороже датасет в производстве и тем выше требования к качеству.

    Форматы разметки

    Популярные форматы, с которыми вы почти наверняка столкнётесь:

  • COCO (JSON): универсальный формат для детекции и сегментации.
  • Pascal VOC (XML): классический формат для детекции.
  • YOLO (TXT): компактная разметка боксов (нормированные координаты).
  • Реальный риск на практике: неверные соглашения о координатах (например, xywh против x1y1x2y2), перепутанные оси, разные системы координат у глубины.

    Известные публичные датасеты (ориентиры)

    Ниже — примеры датасетов, на которые полезно ориентироваться по структуре и качеству:

  • ImageNet — классификация.
  • COCO Dataset — детекция/сегментация.
  • KITTI Vision Benchmark Suite — авто/дороги, стерео и 3D.
  • NYU Depth Dataset V2 — RGB-D в помещениях.
  • Важно: публичные датасеты полезны для обучения и бенчмарков, но в прикладных проектах почти всегда возникает сдвиг домена (другая камера, освещение, фон, культура объектов, сезонность).

    Качество данных: чеклист перед обучением

    Дубликаты и утечки

    Утечка (data leakage) — это когда в train и test попадает “почти одно и то же”, из-за чего метрики завышены.

    Типичные сценарии:

  • соседние кадры одного видео оказались в разных сплитах;
  • один и тот же объект/сцена сняты серией похожих фото и разделены неправильно;
  • аугментации сделаны до разбиения (и копии попали в разные части).
  • !Пояснение, почему видео и серии кадров нужно делить по группам

    Баланс классов и “хвосты”

    Если один класс встречается в 100 раз чаще другого, модель может научиться игнорировать редкий класс, сохраняя “неплохую” общую точность. На практике это лечится комбинацией:

  • до-сбором данных для редких классов;
  • взвешиванием потерь;
  • умным семплированием;
  • аугментациями.
  • Проверка разметки

    Минимальные проверки, которые окупаются почти всегда:

  • случайная выборка из 200–500 примеров с визуализацией разметки;
  • статистика по размерам боксов/масок;
  • поиск невозможных значений (отрицательные координаты, пустые маски);
  • согласованность классов (одинаковые объекты размечены одинаково).
  • Domain shift

    Domain shift — отличие распределения данных между обучением и реальным применением.

    Примеры:

  • обучали на дневных фото, применяем ночью;
  • обучали на одной камере, применяем на другой (другая цветопередача, шум, оптика);
  • обучали в одной стране, применяем в другой (другая визуальная среда).
  • Это одна из причин, почему в CV так важны аугментации и хорошо собранный test-набор.

    Аугментации: зачем они нужны и как не навредить

    Аугментации — это преобразования данных на этапе обучения, которые имитируют вариативность мира и помогают модели обобщать.

    Главный принцип: аугментации должны сохранять правильность разметки.

    Базовые типы аугментаций

  • Геометрические (меняют положение/форму): поворот, масштаб, кроп, сдвиг, отражение.
  • Фотометрические (меняют “вид”): яркость/контраст, цветовой сдвиг, шум, размытие.
  • Искажения: перспектива, barrel/pincushion, JPEG-артефакты.
  • Окклюзии: вырезы, маскирование частей объекта (например, Cutout/CoarseDropout).
  • Миксы: MixUp, CutMix (особенно в классификации).
  • !Наглядные примеры распространённых аугментаций

    Аугментации и тип задачи

    Несколько практических правил:

  • Для детекции/сегментации геометрические аугментации требуют синхронного изменения разметки (боксов/масок). Не все библиотеки делают это корректно “из коробки”.
  • Для распознавания текста (OCR) сильные повороты и перспективы могут разрушать смысл.
  • Для задач, где важен цвет (например, классификация зрелости фруктов), агрессивные изменения оттенка могут быть вредны.
  • Для 3D/глубины нельзя бездумно применять фотометрические аугментации к depth map, а геометрические нужно применять согласованно к RGB и depth.
  • Где и как применять аугментации

  • Аугментации делаются только на train.
  • На val/test применяют только детерминированные преобразования приведения к формату модели (например, resize, нормализация).
  • Если вы используете случайный crop, подумайте о сохранении объекта в кадре (иначе появятся “пустые” примеры).
  • Инструменты

  • OpenCV — базовые операции с изображениями, чтение видео, калибровка.
  • Albumentations — сильная библиотека аугментаций для CV, хорошо работает с bbox/масками.
  • Torchvision transforms — стандартные преобразования для PyTorch.
  • Пример аугментаций для детекции с Albumentations (важно: bbox трансформируются вместе с картинкой):

    Разбиение train/val/test: правила, которые экономят недели

    Стандартное разбиение

    Часто начинают с 70/20/10 или 80/10/10. Но пропорции менее важны, чем правильная логика разделения.

    Group split вместо случайного сплита

    Если данные приходят “группами” (видео, сцены, объекты, серии одного устройства), делите по группам:

  • все кадры одного видео — только в одном сплите;
  • все фото одной сцены/локации — только в одном сплите;
  • если есть идентификатор объекта (например, один и тот же товар) — держите его в одном сплите.
  • Так метрика будет ближе к реальности.

    “Честный” test

    Test-набор:

  • не должен использоваться для подбора гиперпараметров;
  • должен отражать реальные условия (включая редкие, но важные кейсы);
  • должен быть стабильным, чтобы сравнивать эксперименты.
  • Практическая мини-инструкция: сбор данных с камеры

    Если вы работаете с реальной камерой, зафиксируйте протокол:

  • Зафиксируйте настройки: разрешение, FPS, выдержка/ISO (по возможности).
  • Сохраняйте сырые кадры (если можно) или минимально сжатые.
  • Логируйте метаданные: время, устройство, сцена, освещение.
  • Делайте контрольную выборку для проверки резкости и экспозиции.
  • Пример чтения камеры в OpenCV:

    Что дальше по курсу

    В следующем блоке мы будем расширять “2D-мышление” до 3D:

  • как из стерео и глубины получить 3D-точки;
  • почему калибровка и синхронизация сенсоров важны;
  • как устроены представления 3D (point clouds, mesh, voxel).
  • Позже, когда перейдём к диффузионным моделям, эти знания понадобятся для:

  • построения датасетов для генерации;
  • контроля качества данных и разметки;
  • понимания, как синтетика помогает закрывать редкие кейсы, и где она ломается из-за domain shift.
  • 2. Работа с девайсами: калибровка камер, синхронизация, потоковое видео

    Работа с девайсами: калибровка камер, синхронизация, потоковое видео

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

    Эта статья закладывает основу для следующих блоков курса:

  • для 3D-зрения нам нужна метрическая геометрия и синхронность (иначе глубина и реконструкция “плывут”);
  • для диффузионных моделей важно понимать, какие артефакты даёт реальный пайплайн (компрессия, шум, rolling shutter), чтобы генерировать данные, похожие на реальность, и контролировать domain shift.
  • !Где “ломается” качество данных между камерой и моделью

    Калибровка камеры

    Калибровка отвечает на вопрос: как 3D-точки мира проецируются в пиксели изображения конкретной камеры. Даже если вы решаете 2D-задачу, калибровка помогает:

  • корректно выпрямлять широкоугольные искажения;
  • согласовывать несколько камер между собой;
  • совмещать RGB и depth (в RGB-D системах);
  • получать метрические измерения и переходить к 3D.
  • Внутренние параметры и дисторсия

    Внутренние параметры (intrinsics) описывают оптику и матрицу:

  • фокусные расстояния в пикселях , ;
  • оптический центр (главная точка) , ;
  • модель и коэффициенты искажений (дисторсии).
  • Часто intrinsics записывают матрицей:

    Пояснение элементов:

  • , показывают, насколько “сильно” камера масштабирует мир по горизонтали и вертикали в координаты пикселей;
  • , это точка на изображении, куда попадает оптическая ось камеры (обычно близко к центру кадра);
  • последняя строка нужна для записи преобразований в однородных координатах.
  • Дисторсия бывает:

  • радиальная: прямые линии “раздуваются” или “втягиваются” к краям (barrel/pincushion);
  • тангенциальная: появляется из-за небольшого перекоса линзы относительно матрицы.
  • На практике важное правило: если вы сравниваете результаты разных моделей или собираете датасет, фиксируйте, в каком виде вы сохраняете изображения:

  • “сырые” с дисторсией;
  • уже выпрямленные (undistorted).
  • Смешивать эти режимы внутри одного датасета почти всегда плохо.

    Внешние параметры: поза камеры

    Внешние параметры (extrinsics) описывают положение камеры в мире или относительно другой камеры:

  • поворот ;
  • сдвиг .
  • Их смысл практический: extrinsics позволяют переводить точки между системами координат (например, из системы координат левой камеры в систему правой), что критично для стерео, мультикамер, SLAM.

    Практическая калибровка по шахматной доске

    Самый популярный прикладной сценарий: калибровка по шахматной доске или Charuco.

    Рекомендации по съёмке калибровочных кадров:

  • снимайте 20–60 кадров (лучше больше для широкого угла);
  • закрывайте паттерном разные области кадра, включая углы;
  • меняйте наклон и расстояние, но избегайте сильного размытия;
  • фиксируйте разрешение: intrinsics зависят от него.
  • Инструменты:

  • Документация OpenCV по калибровке камеры
  • Функции OpenCV calib3d
  • Типовые ошибки калибровки:

  • калибровали на одном разрешении, а используете другое;
  • калибровали при автофокусе, а потом фокус изменился (для некоторых систем это меняет intrinsics);
  • калибровали без учёта реальной модели объектива (особенно fish-eye).
  • Стереокалибровка и глубина

    Для стереопары важно иметь:

  • intrinsics каждой камеры;
  • extrinsics между камерами;
  • ректификацию (приведение изображений так, чтобы соответствующие точки лежали на одной горизонтали).
  • Глубина в стерео часто выражается через диспаратность:

    Пояснение:

  • это глубина (расстояние до точки вдоль оси камеры);
  • это фокусное расстояние в пикселях (часто берут );
  • это базовая линия, расстояние между центрами камер (в метрах);
  • это диспаратность, смещение одной и той же точки между левым и правым изображением (в пикселях).
  • Практический вывод из формулы:

  • чем больше и , тем точнее глубина на дальних расстояниях;
  • чем меньше (то есть чем дальше объект), тем сильнее растёт ошибка в ;
  • любые ошибки в калибровке напрямую превращаются в ошибку глубины.
  • !Интуиция формулы глубины через диспаратность

    Выравнивание RGB и depth в RGB-D системах

    У RGB-D устройств есть две ключевые проблемы:

  • depth-камера и RGB-камера обычно физически разнесены и смотрят под немного разными углами;
  • их “кадры” могут приходить не одновременно.
  • Поэтому в пайплайне вам нужны:

  • extrinsics между RGB и depth;
  • правила проекции depth в систему координат RGB (или наоборот);
  • синхронизация по времени (об этом далее).
  • Если вы используете конкретный SDK, лучше опираться на его калибровочные данные и функции выравнивания, чем писать всё вручную. Пример источника для понимания класса устройств: Intel RealSense SDK.

    Синхронизация: время важнее, чем кажется

    Синхронизация отвечает на вопрос: какие измерения относятся к одному и тому же моменту времени. Это критично для:

  • стерео (кадры должны быть одновременно, иначе диспаратность становится ошибочной);
  • визуально-инерциальных систем (камера + IMU);
  • мультисенсорных систем (камера + лидар + GPS);
  • трекинга в видео (иначе скорость и траектории искажаются).
  • Что именно нужно синхронизировать

    Синхронизация бывает двух типов:

  • кадровая: “какой кадр соответствует какому”;
  • временная: “в какой момент времени был сделан кадр”.
  • В реальных системах вам нужно уметь:

  • хранить timestamp каждого кадра;
  • понимать источник времени (системные часы, монотонные часы, аппаратные метки сенсора);
  • работать с дрейфом часов между устройствами.
  • Аппаратная синхронизация

    Аппаратная синхронизация обычно надёжнее:

  • внешний триггер (один сигнал запускает экспозицию у всех камер);
  • shared clock (общий генератор времени);
  • wired sync в индустриальных камерах.
  • Плюсы:

  • минимальная и стабильная рассинхронизация;
  • предсказуемая задержка.
  • Минусы:

  • нужна поддержка железом;
  • усложнение сборки и интеграции.
  • Программная синхронизация

    Если аппаратной синхронизации нет, используют программную:

  • сопоставляют кадры по ближайшим timestamp;
  • допускают окно, например “считаем кадры синхронными, если разница меньше 10 мс”;
  • иногда применяют интерполяцию для IMU.
  • Практические риски:

  • кадры могут приходить с джиттером (неровные интервалы);
  • могут быть пропуски кадров;
  • может быть разная задержка в разных потоках.
  • Если вы работаете в робототехнике, полезный ориентир для механики синхронизации сообщений: ROS 2 message_filters.

    !Как программная синхронизация сопоставляет кадры по времени

    Drift, latency и порядок кадров

    Три разных явления, которые часто путают:

  • latency (задержка): кадр сделан в момент , а в программу пришёл в момент ;
  • jitter (джиттер): меняется от кадра к кадру;
  • drift (дрейф): часы двух устройств со временем “расходятся”, даже если стартовали синхронно.
  • Если у вас есть аппаратные timestamp сенсора, используйте их как первичный источник истины. Если нет, старайтесь хотя бы:

  • использовать монотонные часы ОС;
  • логировать время получения кадра и номер кадра;
  • детектировать пропуски и дубликаты.
  • Потоковое видео: захват, кодеки, задержка

    Потоковое видео в CV встречается в трёх режимах:

  • локальная камера (USB, MIPI, CSI);
  • видеофайл (офлайн обработка);
  • сетевой поток (RTSP/HTTP, камеры наблюдения).
  • У каждого режима есть общие проблемы: компрессия, пропуски кадров, буферизация, несоответствие заявленного FPS фактическому.

    Основные понятия: FPS, экспозиция, GOP

  • FPS определяет частоту кадров, но не гарантирует отсутствие пропусков.
  • Выдержка (exposure) влияет на motion blur: иногда лучше повысить ISO, чем получить смаз.
  • GOP (группа кадров в видеокодеке) влияет на:
  • - задержку при декодировании; - качество при движении; - устойчивость к потере пакетов.

    Практический вывод: если ваша задача чувствительна к задержке (роботы, интерактивные системы), важны не только FPS и разрешение, но и настройки кодека и буферов.

    Почему компрессия меняет поведение модели

    Кодеки H.264/H.265 и даже JPEG добавляют артефакты:

  • блочность;
  • размытие мелких деталей;
  • “шлейфы” на движении;
  • скачки качества между I-кадрами и P/B-кадрами.
  • Модель может начать опираться на эти артефакты, если они систематические (например, в train всё с одной камеры и одним bitrate). Это напрямую связано с темой domain shift из предыдущей статьи.

    Для практики видеопайплайна полезны:

  • FFmpeg
  • Документация GStreamer
  • Захват с камеры и обработка в реальном времени

    Базовый захват через OpenCV удобен для прототипов, но в продакшене часто переходят к GStreamer или нативным SDK.

    Минимальные практики, которые экономят время:

  • всегда логируйте: FPS, разрешение, формат, битрейт (если сеть), время кадра;
  • детектируйте пропуски: сравнивайте номера кадров или разницу timestamp;
  • отделяйте поток захвата от потока инференса очередью ограниченного размера, чтобы не накапливать бесконечную задержку.
  • Пример чтения видеопотока в OpenCV (важно: в реальности проверяйте, что источник возвращает актуальные кадры, а не буфер):

    Справка по API: OpenCV VideoCapture.

    Буферизация и “живость” кадра

    Частая проблема: вы смотрите “не в реальность”, а в буфер.

    Симптомы:

  • инференс показывает события с задержкой в секунды;
  • кадры приходят рывками;
  • при нагрузке задержка растёт бесконечно.
  • Типовые меры:

  • ограничивать размер очереди кадров и выбрасывать старые;
  • снижать разрешение или FPS;
  • ускорять декодирование (аппаратный декодер);
  • уменьшать буферы в сетевом пайплайне (аккуратно, чтобы не получить разрывы).
  • Чеклист: что зафиксировать в проекте

    Чтобы ваш датасет и онлайн-система были воспроизводимыми, зафиксируйте в явном виде:

  • модель камеры и режим (разрешение, FPS, экспозиция, автофокус/ручной фокус);
  • используете ли вы undistort, и какими параметрами;
  • intrinsics/extrinsics и версию калибровки;
  • стратегию синхронизации (hardware или software), окно по времени;
  • формат видео, кодек, битрейт, источник (файл/RTSP/USB);
  • политику обработки пропусков (пропускаем кадры, интерполируем, стопаем поток);
  • протокол логирования (timestamp, frame id, устройство, сцена).
  • Что дальше по курсу

    Следующий логический шаг после девайсового слоя это 3D-представления и преобразования: как из калиброванных и синхронизированных данных строить point cloud, оценивать позу камеры и реконструировать сцену. На этом фоне позже будет проще понять, как диффузионные модели могут генерировать синтетические данные под вашу камеру и почему без учёта оптики, компрессии и синхронизации синтетика часто не переносится в реальный мир.

    3. Классические и нейросетевые методы: детекция, сегментация, трекинг

    Классические и нейросетевые методы: детекция, сегментация, трекинг

    Эта статья соединяет два предыдущих блока курса с практическими алгоритмами:

  • из статьи про подготовку данных нам нужны понимание типов разметки, сплитов и аугментаций;
  • из статьи про девайсы нам нужны калибровка (когда появляется геометрия), синхронизация (когда появляется видео и несколько сенсоров) и понимание артефактов потока (компрессия, пропуски кадров, задержка).
  • Дальше по курсу мы перейдём к 3D-зрению и диффузионным моделям. И там, и там детекция/сегментация/трекинг остаются базовыми строительными блоками: 3D-пайплайны часто начинаются с 2D-детекции, а диффузионные модели часто используются для синтетических данных именно под эти задачи.

    Три ключевые задачи и чем они отличаются

    Компьютерное зрение в прикладных системах часто сводится к трём вопросам:

  • Где объект? Это детекция.
  • Какие пиксели принадлежат чему? Это сегментация.
  • Это тот же объект, что был секунду назад? Это трекинг.
  • !Сравнение выходов: детекция, сегментация и трекинг

    Короткое сравнение (что модель должна выдать и какая разметка нужна):

    | Задача | Выход | Какая разметка нужна | Типичные метрики | |---|---|---|---| | Детекция | bounding box + класс (+ score) | боксы и классы | precision/recall, mAP | | Семантическая сегментация | класс для каждого пикселя | маска классов | IoU по классам, mIoU | | Instance-сегментация | маска каждого экземпляра + класс | маски экземпляров | AP по маскам | | Трекинг (MOT) | траектории + ID | боксы/маски + идентичности | MOTA, IDF1, HOTA |

    Термины сегментации:

  • семантическая сегментация: все объекты одного класса сливаются в одну область (все пиксели “машина”);
  • instance-сегментация: каждая отдельная машина имеет свою отдельную маску;
  • паноптическая сегментация: объединяет оба подхода (и “stuff” вроде дороги/неба, и отдельные “things” вроде машин).
  • Классические методы: когда они работают и почему всё ещё полезны

    Классические методы не требуют больших датасетов и часто хорошо работают в узких, контролируемых условиях. В реальной разработке они полезны как:

  • быстрый baseline;
  • компонент пайплайна (например, стабилизация, постобработка масок);
  • решение на edge-устройствах при очень малых ресурсах;
  • инструмент диагностики качества данных (например, детектор движения показывает, что камера “мылит” или поток рвётся).
  • Ниже перечислены наиболее практичные “классические” семейства.

    Классическая детекция

  • сопоставление шаблонов (template matching): ищем похожий патч в кадре; работает при малом изменении масштаба/поворота и стабильном освещении;
  • Haar-cascade: исторически популярно для лиц, быстро, но чувствительно к домену и часто даёт ложные срабатывания.
  • - Реализация и примеры есть в OpenCV
  • HOG + SVM: извлекаем признаки (градиенты), обучаем классификатор; был стандартом для pedestrian detection до эпохи deep learning.
  • - Описание HOG и примеры доступны в OpenCV

    Практическая граница применимости: если фон сложный, много ракурсов и масштабов, разные камеры и компрессия, классические детекторы быстро “сыпятся”.

    Классическая сегментация

  • пороговая сегментация (thresholding): полезна, когда объект хорошо отделим по яркости/цвету;
  • поиск границ + заливка: если границы контрастные и не шумные;
  • watershed: разделение “слипшихся” объектов при хорошей подготовке;
  • GrabCut: интерактивная сегментация объекта (по прямоугольнику и уточнениям), иногда используется в туллинге.
  • - Пример GrabCut в OpenCV

    Ключевой урок для данных: если простая пороговая сегментация внезапно работает “слишком хорошо”, значит домен крайне стабилен, и ваша нейросеть может переобучиться на тривиальные сигналы (например, постоянный фон).

    Классический трекинг

    Нужно различать два сценария:

  • SOT (single object tracking): трекаем один выбранный объект.
  • MOT (multi-object tracking): трекаем много объектов и сохраняем ID.
  • Классические инструменты:

  • оптический поток: оценивает смещение пикселей между кадрами; часто используется для оценки движения камеры или грубого движения объектов.
  • - Реализации (Lucas-Kanade, Farneback) есть в OpenCV
  • KLT-трекинг ключевых точек: трекинг “фич” по кадрам (часто как часть визуальной одометрии);
  • Kalman filter: сглаживание и предсказание положения объекта по времени (например, bbox-центр и скорость);
  • сопоставление объектов между кадрами: например, по расстоянию и/или по “стоимости” матчинга (часто решается как задача назначения).
  • Ограничение классики: без “внешней памяти” о том, как объект выглядит, ID легко путаются при пересечениях, окклюзиях и похожих объектах.

    Нейросетевые методы: как устроены современные решения

    Нейросетевые методы доминируют в открытом мире: разнообразные ракурсы, освещение, фоны, разные камеры.

    Важно: “нейросеть решает задачу” почти всегда означает “нейросеть + инженерный пайплайн”, где есть пред- и постобработка, трекинг-логика, фильтры, правила.

    Нейросетевые детекторы

    Два основных семейства:

  • двухстадийные (two-stage): сначала предлагают регионы, потом уточняют и классифицируют. Обычно точнее, часто медленнее.
  • - Классический пример: Faster R-CNN (референсная реализация есть в Detectron2)
  • одностадийные (one-stage): сразу предсказывают боксы и классы на сетке признаков. Обычно быстрее.
  • - Практический стандарт: YOLO-семейство (например, Ultralytics YOLO)

    Ещё один важный класс:

  • детекторы на трансформерах: по-другому формулируют задачу детекции и уменьшают зависимость от эвристик вроде NMS.
  • - Базовая работа: DETR (arXiv)

    Что важно понимать практику про выход детектора:

  • модель возвращает много кандидатов с score;
  • затем применяется подавление немаксимумов (NMS) или аналогичный механизм, чтобы убрать дубликаты боксов;
  • пороги score и NMS часто сильнее влияют на поведение системы, чем кажется, особенно в видео.
  • Нейросетевые сегментаторы

    На практике чаще всего встречаются:

  • U-Net: очень популярна в медицине и промышленности; сильна, когда данных не очень много.
  • - Обзорный референс: U-Net (arXiv)
  • DeepLab: семейство моделей с хорошим качеством на сложных сценах.
  • - Пример: DeepLabv3 (arXiv)
  • Mask R-CNN: instance-сегментация, тесно связана с детекцией.
  • - Работа: Mask R-CNN (arXiv)

    Отдельно стоит класс foundation-подходов:

  • Segment Anything: модель, которая умеет сегментировать “почти всё” при правильном запросе (prompt) и может выступать ускорителем разметки.
  • - Проект и код: Segment Anything (GitHub)

    Практическая связка с данными из первой статьи:

  • для сегментации качество разметки масок критичнее, чем для детекции боксов;
  • аугментации должны одинаково применяться к изображению и маске;
  • “тихие” ошибки разметки (не тот класс на части пикселей) заметно ухудшают границы и мелкие детали.
  • Нейросетевой трекинг

    В реальных системах наиболее распространённый подход к MOT:

  • tracking-by-detection: на каждом кадре детектируем объекты, затем связываем детекции между кадрами и поддерживаем ID.
  • !Типовой пайплайн многoобъектного трекинга

    Две “оси”, которые определяют качество трекинга:

  • модель движения: помогает “пережить” шум детектора и короткие пропуски;
  • модель внешнего вида (re-identification, re-id): помогает не перепутать похожие объекты и восстанавливать ID после окклюзии.
  • Популярные и практически полезные трекеры:

  • SORT: простой и быстрый трекер на базе Калмана и матчинга по IoU.
  • - Работа: SORT (arXiv)
  • DeepSORT: добавляет re-id признаки для более стабильных ID.
  • - Работа: DeepSORT (arXiv)
  • ByteTrack: улучшает ассоциацию, активно использует низкоуверенные детекции.
  • - Работа: ByteTrack (arXiv)

    Связь с девайсами из предыдущей статьи:

  • при низком FPS и высоком motion blur трекинг усложняется, потому что объект между кадрами успевает сильно сместиться;
  • при пропусках кадров модель движения становится важнее;
  • при большой задержке и буферизации система может выдавать “правильные” ID, но слишком поздно для управления роботом или интерактива.
  • Метрики и интерпретация качества

    IoU: базовая мера перекрытия

    Во многих задачах (детекция, трекинг-ассоциация, оценка качества) используется IoU (Intersection over Union). Она показывает, насколько предсказанный бокс/маска совпадает с эталоном:

    Расшифровка обозначений:

  • это область предсказания (например, площадь предсказанного bounding box);
  • это область разметки (ground truth);
  • это пересечение областей (общая часть);
  • это объединение областей (вся покрытая площадь);
  • означает “размер области” (для бокса это площадь, для маски это число пикселей).
  • Интерпретация:

  • означает полное совпадение;
  • означает, что пересечения нет.
  • Метрики детекции

    На практике чаще всего смотрят:

  • precision: доля правильных среди найденных;
  • recall: доля найденных среди всех существующих;
  • AP/mAP: суммарная метрика по кривой precision-recall, часто на нескольких порогах IoU.
  • Если вы работаете с COCO-подобной оценкой, полезно ориентироваться на официальное описание метрик: COCO detection evaluation.

    Метрики трекинга

    Для MOT важно не только “попал ли бокс”, но и “сохранился ли ID”. Поэтому используются метрики, которые учитывают:

  • пропуски (объект есть, а трека нет);
  • ложные треки;
  • переключения ID (ID switch).
  • На практике часто встречаются MOTA и IDF1, а также более новые сводные метрики. Полезный ориентир по бенчмарку и метрикам: MOTChallenge.

    Практические рекомендации: как сделать систему устойчивой

    Как выбор девайса и потока влияет на качество моделей

    Ключевые эффекты из предыдущей статьи про поток:

  • компрессия меняет текстуры и границы, и модель может начать зависеть от артефактов конкретного кодека;
  • rolling shutter и motion blur ухудшают геометрию объектов и качество трекинга;
  • несоответствие FPS реальности меняет динамику: трекер “думает”, что время между кадрами одно, а оно другое;
  • буферизация делает “неживой” кадр и ломает интерактивные сценарии.
  • Минимальный практический вывод:

  • логируйте timestamp кадра, FPS, пропуски;
  • отделяйте захват кадра от инференса очередью ограниченного размера;
  • держите тестовый набор, который отражает ваш кодек, ваш битрейт, вашу камеру.
  • Что важнее всего в данных для каждой задачи

  • детекция: разнообразие ракурсов и масштабов, честные негативы, стабильные правила разметки боксов;
  • сегментация: точность границ и согласованность масок важнее “количества ради количества”;
  • трекинг: сплиты должны быть сделаны по видео/сценам, иначе вы получаете утечку и переоценку качества.
  • Минимальный скелет пайплайна для видео: детектор + трекер

    Ниже упрощённая структура, чтобы связать воедино устройство, поток и алгоритмы. Это не “готовый продакшен”, а каркас логики.

    Что в этом каркасе обычно “решает” качество:

  • настройка порогов score и NMS;
  • политика работы с пропусками кадров;
  • использование re-id в сценах с окклюзиями;
  • соответствие данных обучения вашему видеопотоку (камера, кодек, освещение).
  • Что дальше по курсу

    В следующих материалах мы начнём расширять 2D-результаты до 3D:

  • как из калиброванных камер и (возможно) глубины перейти к 3D-точкам и сценам;
  • как детекции и сегментации помогают 3D-реконструкции и пониманию сцены.
  • А позже, в блоке про диффузионные модели, мы вернёмся к этим задачам уже с точки зрения генерации:

  • как синтезировать данные для детекции/сегментации под конкретную камеру и её артефакты;
  • как закрывать редкие случаи (плохое освещение, необычные ракурсы) без бесконечного ручного сбора данных.
  • 4. 3D-зрение: стерео, depth-камеры, SLAM и 3D-реконструкция

    3D-зрение: стерео, depth-камеры, SLAM и 3D-реконструкция

    В предыдущих статьях курса мы разобрали, как качество данных зависит от камеры и пайплайна (калибровка, синхронизация, поток), а также как решаются базовые 2D-задачи (детекция, сегментация, трекинг). Теперь делаем следующий шаг: переходим от картинок к геометрии.

    3D-зрение отвечает на вопросы, которые 2D-методы не закрывают напрямую:

  • где объект находится в метрах, а не в пикселях;
  • как устроена сцена целиком;
  • как перемещалась камера в пространстве.
  • Эта статья вводит практический минимум по стерео, depth-камерам, SLAM и 3D-реконструкции. Позже эти знания понадобятся и для блока про диффузионные модели: синтетика часто генерируется в 3D-движке, а затем рендерится под конкретную камеру, и без понимания геометрии сложно контролировать реализм и перенос в реальный мир.

    От 2D к 3D: какие данные бывают и что из них можно восстановить

    В 3D-пайплайнах чаще всего встречаются три типа входных данных:

  • стереопара (две RGB-камеры с известным взаимным положением);
  • RGB-D (RGB + карта глубины от depth-сенсора);
  • монокулярное видео (одна камера, глубину и движение нужно оценивать косвенно).
  • Главная идея: 3D получается только если у вас есть геометрическое ограничение.

  • В стерео геометрия появляется из-за двух точек зрения.
  • В depth-камере глубина измеряется сенсором.
  • В монокулярном видео геометрия появляется из движения камеры и устойчивых визуальных признаков.
  • !Сравнение источников 3D-информации и откуда берётся геометрия

    Базовая геометрия камеры: из пикселя в луч и обратно

    Чтобы работать с 3D, нужно уметь переходить между 2D и 3D. Это опирается на калибровку из статьи про девайсы.

    Проекция 3D-точки в пиксель

    Для калиброванной камеры 3D-точка в координатах камеры проецируется в пиксель так:

    Пояснение всех частей формулы:

  • это координаты точки в системе координат камеры.
  • это глубина: расстояние вдоль оптической оси камеры.
  • Деление и означает перспективу: дальние объекты выглядят меньше.
  • это координаты точки на изображении в пикселях.
  • это матрица внутренних параметров (intrinsics), которая переводит нормированные координаты в пиксели.
  • Символ означает равенство с точностью до масштаба в однородных координатах.
  • Практический вывод: без вы не получите метры из пикселей.

    Обратная задача: из пикселя в 3D-точку

    Один пиксель задаёт луч в 3D, но не задаёт конкретную точку на луче. Чтобы получить точку, нужна глубина.

    Если у нас есть глубина для пикселя , то 3D-точка в координатах камеры вычисляется так:

    Пояснение:

  • это фокусные расстояния в пикселях.
  • это координаты оптического центра.
  • и это сдвиг относительно центра.
  • это глубина (в метрах или миллиметрах, зависит от сенсора и формата).
  • Это базовая операция для построения point cloud из RGB-D.

    Стереозрение: диспаратность и триангуляция

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

    Диспаратность

    Диспаратность это сдвиг одной и той же точки между левым и правым изображением (в пикселях). Если точка на левом изображении имеет координату , а на правом , то:

    Интуиция:

  • ближние точки имеют большой сдвиг, значит большой ;
  • дальние точки имеют маленький сдвиг, значит маленький .
  • Глубина из диспаратности

    Для ректифицированного стерео глубина считается так:

    Пояснение:

  • это глубина до точки.
  • это фокусное расстояние в пикселях (часто используют ).
  • это база стереопары (расстояние между центрами камер) в метрах.
  • это диспаратность в пикселях.
  • Практические следствия (важны для инженерии):

  • при маленьком (дальние объекты) ошибка глубины резко растёт;
  • увеличение базы улучшает точность вдали, но ухудшает работу на близких расстояниях и усложняет поиск соответствий;
  • ошибки ректификации и синхронизации прямо превращаются в ошибку , а значит и .
  • !Интуитивная схема, откуда берётся глубина в стерео

    Поиск соответствий: что реально ломает стерео

    Стерео требует, чтобы алгоритм нашёл соответствующие пиксели на двух изображениях. Это плохо работает в случаях:

  • однотонные поверхности без текстуры;
  • повторяющиеся паттерны (решётки, окна, плитка);
  • бликующие и прозрачные объекты;
  • движение объектов и рассинхронизация камер;
  • сильная компрессия видео.
  • Если вы делаете систему “на девайсе”, возвращайтесь к статье про поток и синхронизацию: стерео почти всегда требует строгих таймстемпов и минимального джиттера.

    Практические инструменты

  • Для стереокалибровки, ректификации и базовых алгоритмов диспаратности: OpenCV calib3d
  • Depth-камеры и RGB-D: чем отличаются и где ловушки

    Depth-камера даёт карту глубины напрямую: значение в пикселе это расстояние до поверхности.

    Основные семейства depth-сенсоров:

  • stereo-based (активное стерео, иногда с подсветкой);
  • structured light (проекция паттерна и анализ деформации);
  • ToF (time-of-flight, измерение времени пролёта света).
  • Для практики важно не “как это устроено физически”, а какие ошибки это даёт в данных.

    Типичные артефакты depth

  • дыры (missing depth) на глянцевых, чёрных, прозрачных поверхностях;
  • шум, растущий с расстоянием;
  • смещение границ из-за разной оптики RGB и depth;
  • мультипути (особенно в ToF) в узких пространствах и около отражающих поверхностей.
  • Совмещение RGB и depth

    Почти всегда RGB-камера и depth-камера физически разнесены, поэтому нужно приводить данные к общей системе координат.

    На практике у вас есть два корректных подхода:

  • Проецировать depth в систему RGB, чтобы получить RGB-D в координатах RGB.
  • Проецировать RGB в систему depth, если дальнейшая обработка идёт в depth-разрешении.
  • Ключевой момент из статьи про девайсы: без extrinsics между RGB и depth выравнивание будет неверным.

    Инструменты и SDK:

  • Для примера реального RGB-D устройства и типовой модели данных: Intel RealSense SDK
  • 3D-представления: point cloud, mesh, voxel

    3D-данные можно хранить по-разному. Выбор представления влияет на скорость, качество и дальнейшие алгоритмы.

    Point cloud

    Point cloud это набор 3D-точек, иногда с цветом.

  • Плюсы: простой, естественный формат для RGB-D и LiDAR.
  • Минусы: нет явных поверхностей, сложнее получать “целостные” модели.
  • Mesh

    Mesh это вершины + полигоны (обычно треугольники), образующие поверхность.

  • Плюсы: удобен для визуализации, симуляции, 3D-печати.
  • Минусы: построение из шумных данных нетривиально.
  • Voxel и TSDF

    Voxel grid дискретизирует пространство на кубики.

    Практически важный вариант: TSDF (truncated signed distance function), где в каждом вокселе хранится приближённое расстояние до поверхности. На TSDF удобно делать слияние множества depth-кадров в единую модель.

    !Как одно и то же 3D можно представлять разными способами

    Практический инструмент для работы с этими форматами:

  • Библиотека для point cloud и 3D-геометрии: Open3D
  • Оценка позы камеры: что такое R и t на практике

    Почти в любой 3D-задаче нужно знать, где находилась камера при съёмке. Поза камеры обычно записывается как поворот и сдвиг .

  • отвечает за ориентацию камеры.
  • отвечает за положение камеры.
  • Они используются, чтобы переводить точки между системами координат:

    Пояснение:

  • это 3D-точка в координатах мира.
  • это та же точка в координатах камеры.
  • это матрица поворота.
  • это вектор сдвига.
  • Эта формула лежит в основе реконструкции, SLAM и совмещения нескольких сенсоров.

    SLAM: одновременная локализация и построение карты

    SLAM (simultaneous localization and mapping) это класс методов, которые одновременно:

  • оценивают траекторию камеры;
  • строят карту среды.
  • Зачем это нужно:

  • роботы и дроны (навигация);
  • AR (привязка виртуальных объектов к миру);
  • 3D-сканирование;
  • стабилизация и метрическая аналитика в видео.
  • Из чего состоит типичный визуальный SLAM

    Почти любой практический SLAM содержит следующие компоненты:

  • визуальные признаки (ключевые точки и дескрипторы) или прямые методы по яркостям пикселей;
  • сопоставление наблюдений между кадрами;
  • оценка движения камеры между кадрами;
  • оптимизация (сглаживание ошибок по множеству кадров);
  • замыкание циклов (loop closure), чтобы исправлять накопившийся дрейф.
  • !Высокоуровневая структура SLAM и где появляется карта

    Дрейф и замыкание циклов

    Если камера долго движется, маленькие ошибки в оценке движения накапливаются, и траектория “уплывает”. Это дрейф.

    Loop closure пытается распознать, что камера вернулась в уже виденное место, и использовать это как сильное ограничение, чтобы подтянуть всю траекторию и карту.

    Visual SLAM vs Visual-Inertial SLAM

    Если у вас есть IMU (гироскоп и акселерометр), вы можете стабилизировать оценку движения.

  • Visual SLAM хорошо работает при достаточном количестве текстуры и не слишком резких движениях.
  • Visual-Inertial SLAM устойчивее к быстрому вращению и временному ухудшению визуального сигнала.
  • Это напрямую связано со статьёй про синхронизацию: камера и IMU требуют точного сопоставления по времени.

    Практические реализации

  • Современная реализация визуального и визуально-инерциального SLAM: ORB-SLAM3
  • 3D-реконструкция: от набора кадров к модели сцены

    3D-реконструкция это построение 3D-модели сцены по множеству изображений.

    Есть два распространённых сценария:

  • offline-реконструкция по набору фото (часто это SfM + MVS);
  • online-реконструкция по RGB-D/стерео в реальном времени (часто это SLAM + fusion).
  • SfM и MVS: классический offline-пайплайн

    SfM (structure-from-motion) и MVS (multi-view stereo) часто идут вместе:

  • SfM оценивает позы камер и разреженную структуру.
  • MVS уплотняет реконструкцию до плотной поверхности.
  • Практический инструмент, который часто используется в индустрии и исследованиях:

  • Полный пайплайн реконструкции: COLMAP
  • Что важно для данных (связь с первой статьёй про датасеты):

  • не должно быть сильного motion blur;
  • должны быть перекрытия между кадрами;
  • желательно фиксировать экспозицию/баланс белого, чтобы упростить сопоставление;
  • избегайте “идеально одинаковых” кадров: они не добавляют геометрии, но увеличивают объём.
  • Online-fusion для RGB-D

    Если у вас RGB-D поток и поза камеры (из SLAM или внешней системы), вы можете сливать глубины в единый объём (например, TSDF), а затем извлекать поверхность.

    Типовые проблемы на практике:

  • ошибка позы даёт “двойные стены” и раздвоение поверхности;
  • depth-артефакты дают дыры и шум;
  • неправильные intrinsics/extrinsics ломают геометрию по краям.
  • Как 2D-детекция и сегментация помогают 3D

    Связь с предыдущей статьёй (детекция/сегментация/трекинг) очень практическая: 3D-пайплайны часто используют 2D-модели как подсказки.

    Примеры:

  • маски позволяют строить 3D только по нужным объектам и не засорять карту фоном;
  • детекции помогают искать соответствия только в области объекта;
  • трекинг ID помогает поддерживать “объектную карту”, а не просто геометрию.
  • В то же время есть риск: если 2D-модель ошибается систематически, 3D-часть начнёт “цементировать” эти ошибки в карте.

    Мини-чеклист качества для 3D-проектов

    Перед тем как “чинить алгоритм”, проверьте фундамент:

  • калибровка выполнена на том же разрешении и с теми же настройками фокуса;
  • выравнивание RGB-depth проверено визуально на границах объектов;
  • синхронизация подтверждена таймстемпами и тестом на быстрых движениях;
  • логирование сохраняет intrinsics/extrinsics, FPS, timestamp, пропуски кадров;
  • данные содержат достаточный параллакс (иначе реконструкция вырождена).
  • Что дальше по курсу

    Следующий логический шаг после 3D-зрения это переход к генеративным моделям, которые помогают в CV не только “рисовать картинки”, но и закрывать дефицит данных:

  • как диффузионные модели генерируют реалистичные изображения и разметку;
  • как делать синтетические датасеты под конкретную камеру, включая дисторсию, шум, компрессию и даже domain shift;
  • как проверять, что синтетика действительно улучшает 2D и 3D метрики, а не создаёт иллюзию качества.
  • 5. Диффузионные модели в CV: генерация, восстановление и условные задачи

    Диффузионные модели в CV: генерация, восстановление и условные задачи

    Диффузионные модели стали одним из самых практичных классов генеративных моделей в компьютерном зрении: они умеют не только генерировать изображения, но и решать задачи восстановления (denoising, super-resolution, inpainting) и условного синтеза (по тексту, по маске, по глубине, по позе).

    Эта статья связывает предыдущие блоки курса с генеративной частью:

  • из темы данных и аугментаций нам важны качество датасета, доменный сдвиг и проверка разметки;
  • из темы девайсов нам важны артефакты реального пайплайна (шум, компрессия, rolling shutter), которые влияют на перенос синтетики в реальный мир;
  • из темы 3D-зрения нам важны представления глубины, позы и реконструкции, потому что современные диффузионные модели можно условно “привязывать” к геометрии.
  • !Диаграмма прямого и обратного процесса в диффузионных моделях

    Зачем диффузия в компьютерном зрении

    Диффузионные модели полезны в CV в трёх типовых сценариях:

  • Генерация данных: синтетические изображения для расширения датасета, закрытия редких случаев, балансировки классов.
  • Восстановление и улучшение: удаление шума, восстановление деталей, повышение разрешения, заполнение пропусков.
  • Условные задачи: генерация “по запросу” с контролем структуры (маски, контуры, глубина, поза, референс-изображение).
  • Практический фокус курса: не “рисовать красивые картинки”, а строить управляемый генеративный модуль, который помогает вашим 2D и 3D пайплайнам и учитывает реальные свойства камеры.

    Идея диффузии простыми словами

    Диффузионная модель обучается решать задачу: если к изображению добавить немного шума, научись этот шум предсказывать (или убирать). Повторяя это много раз, можно:

  • в прямом процессе превратить реальное изображение в почти чистый шум;
  • в обратном процессе стартовать с шума и шаг за шагом восстановить изображение.
  • Классический базис: DDPM (Denoising Diffusion Probabilistic Models)

  • статья: Denoising Diffusion Probabilistic Models
  • Прямой процесс: как “портится” изображение

    В большинстве реализаций используется гауссовский шум и фиксированное расписание (schedule), которое задаёт, сколько шума добавлять на каждом шаге.

    Обычно прямой шаг записывают как:

    Разберём каждую часть:

  • — изображение на предыдущем шаге диффузии.
  • — изображение на текущем шаге (более зашумлённое).
  • — число от 0 до 1, которое задаёт долю “сохранённого сигнала” на шаге .
  • — единичная матрица (означает независимый шум по пикселям/каналам в выбранном представлении).
  • — нормальное распределение со средним и ковариацией .
  • Интуиция формулы:

  • среднее означает, что часть исходного изображения сохраняется;
  • дисперсия означает, что остальное “добавляется шумом”.
  • Важно: это не шум камеры. Это искусственный шум в тренировочной задаче, который делает обучение стабильным и превращает генерацию в контролируемый обратный процесс.

    Обратный процесс: что реально учит сеть

    Модель учится аппроксимировать обратный шаг : по текущему зашумлённому изображению предсказать, как выглядел предыдущий шаг.

    На практике часто обучают сеть предсказывать не сам , а шум (epsilon-prediction). Типовая обучающая цель:

    Пояснение:

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

    Архитектура: почему часто U-Net

    На изображениях диффузионные модели часто используют U-Net, потому что он сочетает:

  • локальные детали (через свёртки и skip connections);
  • глобальный контекст (через downsampling и широкий receptive field).
  • Для условной генерации (например, по тексту) внутрь U-Net добавляют механизмы внимания (attention), чтобы связывать части изображения с условием.

    Если вы хотите быстро прототипировать, индустриальный стандарт по инструментам:

  • библиотека: Hugging Face Diffusers
  • Почему Latent Diffusion ускорил практику

    Диффузию можно делать не в пикселях, а в латентном пространстве автоэнкодера (VAE). Это сильно ускоряет обучение и генерацию, потому что модель работает с более компактным представлением.

    Ключевая идея:

  • VAE кодирует изображение в латент .
  • Диффузия происходит в пространстве .
  • VAE декодирует обратно в изображение.
  • Классический источник:

  • статья: High-Resolution Image Synthesis with Latent Diffusion Models
  • Практический компромисс:

  • плюс: скорость и требования к памяти становятся существенно лучше;
  • минус: качество мелких деталей и текст может ограничиваться возможностями VAE.
  • Условная генерация: как “управлять” результатом

    Условная диффузия отвечает на вопрос: как получить изображение, которое соответствует заданному условию (текст, маска, глубина, другая картинка).

    Текстовое условие

    Самый известный сценарий — text-to-image: текст преобразуется текстовым энкодером в эмбеддинги, а диффузионная U-Net использует их через cross-attention.

    Практические ограничения для CV-задач:

  • текст плохо задаёт точную геометрию и пиксельную структуру;
  • могут появляться “правдоподобные” артефакты, опасные для датасетов (модель уверенно дорисовывает то, чего не было).
  • Classifier-free guidance

    Часто используют classifier-free guidance: модель обучают и с условием, и без условия, а при генерации комбинируют два предсказания, усиливая следование условию.

    Источник:

  • статья: Classifier-Free Diffusion Guidance
  • Инженерный смысл параметра guidance:

  • больше guidance — сильнее “слушаем условие”, но выше риск артефактов и потери разнообразия;
  • меньше guidance — больше разнообразия, но слабее соответствие запросу.
  • Условия из CV: маски, контуры, глубина, поза

    Для прикладного CV часто важнее не текст, а структурные подсказки:

  • inpainting: есть маска области, которую нужно заполнить;
  • outpainting: расширяем кадр за границы;
  • super-resolution: условие — низкое разрешение;
  • depth-to-image: условие — карта глубины;
  • pose-to-image: условие — скелет/ключевые точки;
  • edge-to-image: условие — контуры.
  • Отдельно выделяют подходы, где условие подключают через отдельную ветку, чтобы “не ломать” базовую модель. Самый известный представитель:

  • статья: ControlNet: Adding Conditional Control to Text-to-Image Diffusion Models
  • !Схема, как структурное условие влияет на денойзинг

    Диффузия как восстановление, а не только генерация

    В CV-проектах диффузионные модели часто выгоднее воспринимать как универсальный решатель обратных задач.

    Denoising и моделирование шума камеры

    Классическое “удаление шума” в диффузии отличается от традиционного:

  • диффузия умеет восстанавливать детали, но может их галлюцинировать;
  • качество зависит от того, видел ли модель похожий домен.
  • Связь с темой девайсов:

  • если ваша камера даёт специфический шум, компрессию, rolling shutter, то модель, обученная на “чистых” данных, может восстановить “не ту реальность”;
  • для надёжности в прикладных системах полезно добавлять в обучение артефакты вашего видеопайплайна (как аугментации) или дообучать на данных с реального устройства.
  • Inpainting и разметка

    Inpainting полезен не только для “красивых картинок”, но и для данных:

  • удаление приватных зон (лица, номера) с последующим заполнением;
  • генерация окклюзий как аугментация для трекинга;
  • исправление мелких дефектов в синтетическом рендере.
  • Риск: если inpainting применяется к обучающим данным, можно незаметно создать утечку сигналов или исказить распределение текстур.

    Super-resolution и видео

    Super-resolution через диффузию часто даёт сильную визуальную детализацию, но для CV-метрик это неоднозначно:

  • может улучшить читаемость мелких объектов;
  • может добавить несуществующие границы, ухудшая детекцию/сегментацию при строгой оценке.
  • Для видео важно учитывать консистентность по времени: покадровый SR может “мерцать”.

    Синтетические датасеты: как делать это правильно

    Диффузионные модели можно использовать для генерации данных, но в прикладном CV важен не объём, а контроль распределения.

    Минимально жизнеспособный процесс:

  • Определите целевые сценарии, которые плохо покрыты реальными данными (ночь, дождь, редкие ракурсы, редкие классы).
  • Выберите форму контроля: текст, маски, глубина, контуры, референс-изображения.
  • Сгенерируйте данные пакетами и сохраните метаданные генерации (seed, prompt, параметры guidance, модель/версия).
  • Проведите фильтрацию качества:
  • - автоматическую (детектор “мусора”, CLIP-подобная семантическая проверка, дедупликация); - ручную выборку (визуальный аудит, как в статье про проверку разметки).
  • Смешивайте синтетику с реальными данными и оценивайте на честном test-наборе из вашего домена.
  • Практическая связь с domain shift из первой статьи:

  • синтетика полезна, когда закрывает “дыры” распределения;
  • синтетика вредна, если создаёт новый домен, который модель выучит вместо реального.
  • Связь с 3D: условие геометрией и генерация под камеру

    Из блока 3D-зрения нам важны два типа сигналов:

  • глубина (depth map) и нормали (surface normals) как компактное описание геометрии;
  • поза камеры и траектория как способ задать согласованность между кадрами.
  • Практические сценарии:

  • генерация данных “под вашу камеру”:
  • - рендерим или восстанавливаем геометрию сцены; - получаем depth/normal; - используем depth-to-image или ControlNet-подобный контроль; - добавляем артефакты вашего девайса (дисторсия, компрессия, шум), как обсуждалось в статьях про устройства.
  • генерация “с фиксацией структуры”:
  • - вы сохраняете геометрию (глубина/контуры), но меняете текстуры, освещение, фон; - это особенно полезно, когда вам нужна инвариантность к стилю при сохранении формы.

    Ключевое правило: если ваша цель — улучшить метрики детекции/сегментации/3D-реконструкции, контролируйте не только “красоту”, но и согласованность (границы объектов, масштаб, перспектива, оптика).

    Как оценивать качество диффузионной модели в CV-задаче

    Генеративные метрики (FID и аналоги) не всегда отвечают на вопрос “стало ли лучше для CV”. Поэтому полезно разделять оценку:

  • визуальная правдоподобность: насколько изображения выглядят реалистично;
  • структурная корректность: границы, геометрия, отсутствие невозможных объектов;
  • польза для downstream-задачи: метрики детекции/сегментации/трекинга/3D на честном test.
  • Практическая схема оценки:

  • обучите baseline-модель на реальных данных;
  • добавьте синтетику и переобучите;
  • сравните метрики на test, который отражает вашу камеру, кодек и условия съёмки (из статей про девайсы и сплиты);
  • отдельно проверьте, не ухудшились ли редкие, но критичные сценарии.
  • Типовые ошибки в прикладном использовании диффузии

  • Дедупликация игнорируется: синтетика может непреднамеренно повторять обучающие примеры или создавать множество очень похожих картинок.
  • Синтетика заменяет реальность: если доля синтетики слишком высока, модель начинает адаптироваться к “стилю генератора”.
  • Неправильная привязка к девайсу: синтетика “чистая”, а реальный поток сжат, шумный, с rolling shutter.
  • Слабый контроль структуры: для CV важнее точная форма и границы, чем художественный стиль.
  • Отсутствие протокола: без логирования параметров генерации невозможно воспроизвести датасет и откатиться.
  • Что дальше по курсу

    Диффузионные модели логично завершают курс, потому что связывают все предыдущие темы:

  • данные и аугментации — через синтетические датасеты и контроль domain shift;
  • девайсы — через моделирование артефактов камеры и видеопотока;
  • 2D-задачи — через генерацию и восстановление под детекцию/сегментацию/трекинг;
  • 3D-зрение — через условие геометрией (depth/normal/pose) и генерацию под конкретную камеру.
  • Следующий шаг в практике — выбрать одну прикладную задачу (например, улучшение детекции в плохом освещении) и построить контролируемый генеративный контур: генерация → фильтрация → обучение → проверка на честном test.