Введение
В задачах машинного обучения значительную часть времени занимает процесс подготовки данных. К этапу подготовки относятся: сбор, фильтрация, разметка и предобработка данных.В данной статье я буду рассматривать процесс автоматической разметки данных для задач компьютерного зрения.
Процесс разметки данных может быть организован как:
Самостоятельная разметка данных внутри компании;
Аутсорсинг;
Краудсорсинг.
Процесс разметки может быть:
Ручным;
Автоматическим.
Более подробно про эти подходы можно прочитать в статье Разметка данных в машинном обучении: процесс, разновидности и рекомендации.
В данной статье мы остановимся на подходе с автоматической разметкой. На текущий момент данный тип разметки является одним из самых быстрых, но он имеет существенный недостаток - точность. Поэтому есть смысл использовать его совместно с другими типами разметки - это сэкономит время и затраченные ресурсы. Автоматическую разметку можно делать несколькими способами, один из наиболее удобных - это использование данного функционала в CVAT. CVAT предоставляет возможность использовать готовые модели для разметки ваших данных. Но готовые модели не всегда содержат классы, которые необходимы для решения вашей задачи.
09.03.2023 была представлена модель Grounding DINO. Данная модель позволяет детектировать объекты на изображениях по текстовому описанию. Согласно аннотации к статье Grounding DINO, модель достигает значения 52,5 AP на бенчмарке "Zero-Shot Object Detection on MS-COCO". Далее мы рассмотрим как использовать эту модель для автоматической разметки данных.
Вдохновением для данной работы послужила статья Grounding DINO:SOTA Zero-Shot Object Detection и туториал в формате jupyter ноутбука.
В моем проекте реализованы:
Запуск Docker контейнера с предустановленными зависимостями;
Установка классов и порогов детектирования;
Детектирование объектов;
Сохранение разметки в формате YOLO;
Создание архива для загрузки разметки в CVAT.
Установка и запуск
Для запуска потребуется видеокарта nvidia с объемом памяти более 3 Гб. Для запуска проекта необходимо установить docker с поддержкой nvidia.
Для работы требуется загрузить проект с GItHub:
git clone https://github.com/DenisN03/automated-dataset-annotation
Реализованы два варианта запуска проекта - как докер контейнер и как сервис.
Для запуска через docker контейнер необходимо выполнить сборку:
docker build -t automated-dataset-annotation:v1 .
И запустить контейнер:
docker run --name automated-dataset-annotation \
--gpus all \
--ipc=host \
--network=host -it --rm \
-e JUPYTER_TOKEN='automated-dataset-annotation' \
-v $(pwd)/data:/app/data \
-v $(pwd)/notebooks:/app/notebooks \
-v $(pwd)/src:/app/src \
automated-dataset-annotation:v1
Параметр JUPYTER_TOKEN устанавливает постоянное значение токена для входа в jupyter lab. Флаги -v монтируют папки с данными, с ноутбуком и с питоновскими скриптами в запущенный контейнер.
Второй вариант запуска, на мой взгляд, более удобный:
docker-compose up -d --build
В результате запустится jupyter lab, доступный по ссылке:
http://localhost:8888/?token=automated-dataset-annotation
Использование
Перед началом работы необходимо расположить нужные данные в директории data. Далее требуется установить нужные настройки, ниже перечислены основные из них:
SOURCE_IMAGE_PATH - путь до набора данных, который требуется разметить;
SOURCE_DIRECTORY_PATH - путь, по которому сохранится подготовленная разметка;
CLASSES - имена классов и минимальный порог их распознавания;
BOX_TRESHOLD и TEXT_TRESHOLD - пороги для нейронной сети Grounding DINO, их можно оставить без изменений.
Далее необходимо выполнить все ячейки ноутбука. В разделе "Отрисовка детекций" можно увидеть результат работы нейронной сети. Если результат вас не устроит, то можно изменить пороги в значении CLASSES и повторить обработку.
Раздел "Создание архива для загрузки в CVAT" подготавливает детекции в формате, пригодном для загрузки в CVAT.
Скорость обработки одного изображения будет зависеть от количества классов и мощности видеокарты, на которой вы работаете. Ниже приведена таблица с тестированием скорости на изображениях с разрешением 2448 x 2048.
№ |
Видеокарта |
Количество классов |
Время на обработку одного изображения, с |
1. |
RTX 2060 Mobile |
1 |
0,42 |
2. |
RTX 2060 Mobile |
5 |
1,76 |
3. |
RTX 2060 Mobile |
10 |
3,79 |
4. |
RTX 4090 |
1 |
0,16 |
5. |
RTX 4090 |
5 |
0,56 |
6. |
RTX 4090 |
10 |
1,09 |
На обработку набора данных, состоящего из 32 тысяч изображений с разрешением 2448x2048 и 1920х1080, при детектировании 10 классов на видеокарте RTX 4090 потребовалось 11 часов.
Ниже приведены примеры детектирования объектов разных классов:
Видно, что модель справляется с детектированием большинства объектов. При этом стоит отметить, что модель может ошибаться - выдавать ложные детекции и пропускать нужные. Поэтому для дальнейшего использования данных требуется дополнительная проверка и корректировка разметки.
Загрузка данных в CVAT
CVAT - это интерактивный инструмент аннотирования видео и изображений для компьютерного зрения. Его используют десятки тысяч пользователей и компаний по всему миру. Инструмент имеет облачную и серверную версии. Инструкция по установке серверной версии доступна в официальной документации.
Для загрузки подготовленной разметки в CVAT требуется выполнить несколько шагов:
Создание проекта и задачи на разметку;
Загрузка подготовленной разметки.
При создании проекта необходимо указать все классы, которые требуется разметить:
При создании задачи на разметку важно, чтобы формат разметки был установлен в значение YOLO:
Пример созданной задачи:
Для загрузки разметки требуется выполнить следующие шаги Actions - Upload annotations - YOLO 1.1:
Разметка появится в выбранной задаче:
Заключение
Подходы с автоматической разметкой данных способны выдавать хороший результат. Этого результата может быть достаточно для решения не очень сложных задач, а также для ускорения процесса ручной разметки.