Проблема
Делаем в свободное время робототехнический проект, нужно сделать прототип , который требует обучения модели сегментации на специфичных данных, а также должен мочь масштабироваться. Типы объектов я озвучить не могу, но далее в качестве примера мы будем работать с баночками 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
Это ключевой компонент для эффективного обучения. Система автоматически отбирает наиболее информативные изображения:
Запускает инференс обученной YOLO-модели на новых изображениях
Запускает SAM3 на тех же изображениях
Сравнивает результаты — если детекции сильно отличаются, это означает, что модель не уверена или ошибается
Сохраняет такие изображения с аннотациями от SAM3 для дальнейшей выгрузки в CVAT
Логика проста: если модель и SAM3 дают разные результаты, значит, это случай, который поможет нашей модели улучшиться. Если результаты совпадают, skip. Тут мы предполагаем, что качество SAM3 плюс-минус равно GT, словно мы каждый кадр вручную размечали.
Дополнительно система:
Фильтрует дубликаты через эмбеддинги
Создает визуализации для анализа (опционально) c легендами для нашей модели и SAM3.

Генерирует готовый датасет в формате 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-инференса
Автоматическая верификация экспортированной модели
🤙 Результаты
Что мы получили:
Время подготовки датасета: с дней или недель до нескольких минут
Качество данных: выше за счет умного отбора и удаления дубликатов
Эффективность обучения: активное обучение фокусируется на сложных случаях
Автоматизация: весь пайплайн работает практически без ручного вмешательства. За исключением валидации и корректировки разметки при необходимости.

Технический стек
YOLO11 — для детекции и сегментации
SAM3 — для автоматической преданотации
Milvus Lite — векторная БД для поиска дубликатов и хранения эмбеддингов изображений
OpenVINO — для оптимизированного CPU-инференса
CVAT — для финальной проверки и правки аннотаций
Будущие направления
Далее планируем:
Запустить это всё на роботе и отладить
Улучшение стратегии активного обучения
построение полноценного автоматизированного пайплайна
Интеграцию дополнительных метрик для отбора данных
Развивать проект для поддержки большего количества объектов
Попробовать в сторону model serve in the cloud
Хотелось бы узнать ваше мнение и опыт:
Активное обучение: Использовали ли вы активное обучение в своих проектах? Какие стратегии отбора данных работали лучше всего?
CPU-инференс: Как вы решаете задачу обучения и инференса на CPU? Какие чаще используете подходы к оптимизации? Или, может, пробовали model serving in cloud?
Дистилляция: Применяли ли knowledge distillation для сжатия моделей? Какие техники показали лучшие результаты?
Автоматизация разметки: Используете ли вы SAM/Grounding DINO/другие модели для преданотации? Как интегрируете их в пайплайн?
Удаление дубликатов: Какие методы используете для дедупликации датасетов? Работали ли с векторными БД для этой задачи?
Буду рад обсуждению в комментариях! Если у вас есть идеи по улучшению пайплайна или интересные кейсы — делитесь.
P.S. Также буду рад видеть Вас в своем канале, где делюсь своими проектами и всякими штуками по AI. https://t.me/ilia_sevostianov
