Проблема

Делаем в свободное время робототехнический проект, нужно сделать прототип , который требует обучения модели сегментации на специфичных данных, а также должен мочь масштабироваться. Типы объектов я озвучить не могу, но далее в качестве примера мы будем работать с баночками red bull.

Классический подход для решения задачи под ключ для уникальных типов классов — это дни и даже недели ручной работы для получения качественного результата:

  • Сбор и запись данных

  • Удаление дубликатов вручную

  • Ручная разметка тысяч изображений (Это и деньги, и время)

  • Валидация качества данных (Это тоже и деньги, и время)

  • Подготовка датасета для обучения

Для маленькой команды, стартапа, ...

У нас нет на это времени. Прототипируем быстро!
У нас нет на это времени. Прототипируем быстро!

Огромным боттлнэком для нас тут является разметка данных.

А что если весь этот процесс можно автоматизировать и сократить с недель до нескольких минут? Именно такую систему мы разработали буквально за пару дней для проекта.

Ограничения и вызовы

Важное уточнение: наша платформа работает на CPU, без NVIDIA GPU. Это накладывает серьезные ограничения:

  • Модели должны быть компактными (мы используем YOLO-like сеточку размера nano, small)

  • Качество данных становится критически важным — нельзя компенсировать недостаток данных размером модели

  • Нужна максимальная эффективность каждого этапа пайплайна

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

Решение: автоматизированный пайплайн

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

1. Сбор данных из ROS2 bag-файлов

Данные записываются в ROS2 bag-формате, затем извлекаются с помощью ros2_bag_exporter. Это стандартный подход для робототехнических проектов.

2. Умное удаление дубликатов

Компонент: dataset_aggregator.py

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

  • Извлекает эмбеддинги изображений с помощью ResNet50

  • Хранит их в Milvus Lite (легковесная векторная БД)

  • Сравнивает новые изображения с существующими по косинусному сходству

  • Добавляет только те изображения, которые семантически отличаются (порог настраивается, по умолчанию 0.95)

Это позволяет отфильтровать похожие кадры, которые не принесут нам пользу во время обучения. А хранение эмбеддингов в БД дает нам большую скорость обработку данных и сравнение кадров almost real-time.

3. Автоматическая преданотация с SAM3

Компонент: sam3_preannotator.py

Вот где начинается магия. Вместо ручной разметки мы используем SAM3 (Segment Anything Model 3) для автоматической генерации аннотаций:

  • SAM3 работает с текстовыми промптами для семантической сегментации

  • Система автоматически генерирует аннотации в формате COCO

  • Объединяет перекрывающиеся детекции одного класса

  • Валидирует аннотации для совместимости с CVAT

PS Кстати, доступ к модели можете получить тут

У них еще есть модификация sam3d-objects. Мы так же думаем ее использовать для генерации 3д моделей объектов для проекта.

Результат: 1000 изображений размечаются за 5 минут вместо нескольких дней ручной работы!

Преданотация не идеальна, но она кардинально ускоряет процесс проверки и правки в CVAT. Вместо создания аннотаций с нуля, мы лишь только корректируем уже готовые

4. Активное обучение для селективного отбора данных

Компонент: active_learning.py

Это ключевой компонент для эффективного обучения. Система автоматически отбирает наиболее информативные изображения:

  1. Запускает инференс обученной YOLO-модели на новых изображениях

  2. Запускает SAM3 на тех же изображениях

  3. Сравнивает результаты — если детекции сильно отличаются, это означает, что модель не уверена или ошибается

  4. Сохраняет такие изображения с аннотациями от SAM3 для дальнейшей выгрузки в CVAT

Логика проста: если модель и SAM3 дают разные результаты, значит, это случай, который поможет нашей модели улучшиться. Если результаты совпадают, skip. Тут мы предполагаем, что качество SAM3 плюс-минус равно GT, словно мы каждый кадр вручную размечали.

Дополнительно система:

  • Фильтрует дубликаты через эмбеддинги

  • Создает визуализации для анализа (опционально) c легендами для нашей модели и SAM3.

В качестве примера я приобрел 3 редбулла и буквально за час в итоге прошёл весь пайплайн
В качестве примера я приобрел 3 редбулла и буквально за час в итоге прошёл весь пайплайн
  • Генерирует готовый датасет в формате COCO для CVAT

5. Подготовка для обучения

Компонент: dataset_preparations.py

После проверки и правки аннотаций в CVAT, система:

  • Загружает COCO-датасет

  • Разделяет на train/val/test

  • Экспортирует в формат YOLO сегментации

  • Создает data.yaml

6. Обучение и оптимизация

Компоненты: train.py, export_openvino.py

  • Обучение YOLO с интеграцией ClearML для трекинга экспериментов и сравнения качества моделей.

  • Экспорт в OpenVINO с INT8 квантизацией для CPU-инференса

  • Автоматическая верификация экспортированной модели

🤙 Результаты

Что мы получили:

  • Время подготовки датасета: с дней или недель до нескольких минут

  • Качество данных: выше за счет умного отбора и удаления дубликатов

  • Эффективность обучения: активное обучение фокусируется на сложных случаях

  • Автоматизация: весь пайплайн работает практически без ручного вмешательства. За исключением валидации и корректировки разметки при необходимости.

Демка. Прикрутил к детекции fusion с глубиной (RGBD). Проект у нас решает задачи пикинга.
Демка. Прикрутил к детекции fusion с глубиной (RGBD). Проект у нас решает задачи пикинга.

Технический стек

  • YOLO11 — для детекции и сегментации

  • SAM3 — для автоматической преданотации

  • Milvus Lite — векторная БД для поиска дубликатов и хранения эмбеддингов изображений

  • OpenVINO — для оптимизированного CPU-инференса

  • CVAT — для финальной проверки и правки аннотаций

Будущие направления

Далее планируем:

  • Запустить это всё на роботе и отладить

  • Улучшение стратегии активного обучения

  • построение полноценного автоматизированного пайплайна

  • Интеграцию дополнительных метрик для отбора данных

  • Развивать проект для поддержки большего количества объектов

  • Попробовать в сторону model serve in the cloud

Хотелось бы узнать ваше мнение и опыт:

  1. Активное обучение: Использовали ли вы активное обучение в своих проектах? Какие стратегии отбора данных работали лучше всего?

  2. CPU-инференс: Как вы решаете задачу обучения и инференса на CPU? Какие чаще используете подходы к оптимизации? Или, может, пробовали model serving in cloud?

  3. Дистилляция: Применяли ли knowledge distillation для сжатия моделей? Какие техники показали лучшие результаты?

  4. Автоматизация разметки: Используете ли вы SAM/Grounding DINO/другие модели для преданотации? Как интегрируете их в пайплайн?

  5. Удаление дубликатов: Какие методы используете для дедупликации датасетов? Работали ли с векторными БД для этой задачи?

Буду рад обсуждению в комментариях! Если у вас есть идеи по улучшению пайплайна или интересные кейсы — делитесь.

P.S. Также буду рад видеть Вас в своем канале, где делюсь своими проектами и всякими штуками по AI. https://t.me/ilia_sevostianov