Введение

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

Процесс разметки данных может быть организован как:

  1. Самостоятельная разметка данных внутри компании;

  2. Аутсорсинг;

  3. Краудсорсинг.

Процесс разметки может быть:

  1. Ручным;

  2. Автоматическим.

Более подробно про эти подходы можно прочитать в статье Разметка данных в машинном обучении: процесс, разновидности и рекомендации.

В данной статье мы остановимся на подходе с автоматической разметкой. На текущий момент данный тип разметки является одним из самых быстрых, но он имеет существенный недостаток - точность. Поэтому есть смысл использовать его совместно с другими типами разметки - это сэкономит время и затраченные ресурсы. Автоматическую разметку можно делать несколькими способами, один из наиболее удобных - это использование данного функционала в 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 ноутбука.

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

  1. Запуск Docker контейнера с предустановленными зависимостями;

  2. Установка классов и порогов детектирования;

  3. Детектирование объектов;

  4. Сохранение разметки в формате YOLO;

  5. Создание архива для загрузки разметки в 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. Далее требуется установить нужные настройки, ниже перечислены основные из них:

  1. SOURCE_IMAGE_PATH - путь до набора данных, который требуется разметить;

  2. SOURCE_DIRECTORY_PATH - путь, по которому сохранится подготовленная разметка;

  3. CLASSES - имена классов и минимальный порог их распознавания;

  4. 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 часов.

Ниже приведены примеры детектирования объектов разных классов:

1. мотоцикл, автомобиль, автобус, грузовик, номерной знак, лобовое стекло, человек, дорожный знак, велосипед;2. ветряная мельница, строительный кран;3. человек, стол, стул, зонт;4. человек, информационный стенд, скамейка, уличный фонарь, урна;
1. мотоцикл, автомобиль, автобус, грузовик, номерной знак, лобовое стекло, человек, дорожный знак, велосипед;
2. ветряная мельница, строительный кран;
3. человек, стол, стул, зонт;
4. человек, информационный стенд, скамейка, уличный фонарь, урна;
5. человек, рыба; 6. стол, стул; 7. зебра, антилопа; 8. человек, лодка, пальма.
5. человек, рыба; 6. стол, стул; 7. зебра, антилопа; 8. человек, лодка, пальма.

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

Загрузка данных в CVAT

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

Для загрузки подготовленной разметки в CVAT требуется выполнить несколько шагов:

  1. Создание проекта и задачи на разметку;

  2. Загрузка подготовленной разметки.

При создании проекта необходимо указать все классы, которые требуется разметить:

Пример созданного проекта
Пример созданного проекта

При создании задачи на разметку важно, чтобы формат разметки был установлен в значение YOLO:

Указание формата данных
Указание формата данных

Пример созданной задачи:

Задача в CVAT
Задача в CVAT

Для загрузки разметки требуется выполнить следующие шаги Actions - Upload annotations - YOLO 1.1:

Загрузка разметки в CVAT
Загрузка разметки в CVAT

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

Отображение разметки в CVAT
Отображение разметки в CVAT

Заключение

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

Комментарии (0)