Недавно мне пришлось использовать YOLOv5 для обнаружения объектов. Для обучения модели ваш пользовательский набор данных должен быть в формате YOLO, а если нет, доступны онлайн-инструменты, которые преобразуют ваш пользовательский набор данных в требуемый формат. Точно так же, если ваш набор данных находится в формате COCO, вы можете использовать онлайн-инструменты для преобразования его из формата COCO (JSON) в формат YOLO. Но проблема, с которой я столкнулся, заключалась в том, что предоставленный мне набор данных не был в полном формате COCO, и когда я попробовал онлайн-инструмент для преобразования набора данных COCO в формат YOLO, он не сделал этого точно. Именно тогда я понял, что мне нужно создать свой собственный инструмент.

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

Оглавление

  • Что такое формат YOLO?
  • Текущий формат набора данных
  • Цель
  • Выполнение
  • Тестирование
  • Исход
  • Рекомендации

Что такое формат YOLO?

В формате YOLO каждое изображение в наборе данных имеет один текстовый файл. Если на изображении нет объектов, для этого изображения нет текстового файла. Внутри текстового файла каждая строка содержит следующую информацию:

(class_id, x_centre,  y_centre,  width,  height)

Предположим, у нас есть десять изображений в наборе данных, тогда должно быть десять текстовых файлов, если все десять изображений содержат какой-либо объект. Например, для файла zidane.txt, который я показал выше, в наборе данных должен быть zidane.jpg. Ниже приведена структура каталогов набора данных формата YOLO:

Текущий формат набора данных (например, COCO):

dataset_folder
→ images_folder
→ Ground_truth.json

В папке набора данных у нас есть подпапка с именем «images», в которой у нас есть все изображения, и файл JSON, содержащий аннотации для всех изображений в папке. Файл аннотации содержит информацию об изображении, включая идентификатор изображения, категорию, bbox и т. д. Но первые два элемента (x, y) ограничивающих рамок являются координатами верхнего левого угла коробки.

ЦЕЛЬ (формат YOLO):

Создание нового набора данных со следующими свойствами:

  • Оба файла изображения в папке images и соответствующий текстовый файл в папке labels должны иметь одинаковое имя файла.
    Например:
    изображения
    →0001.jpg
    ярлыки
    → 0001.txt
  • Каждый текстовый файл должен соответствовать всем свойствам текстового файла формата YOLO, а именно:
    1. Первый элемент каждой строки — это идентификатор класса, затем свойства ограничивающей рамки (x, y, ширина, высота).
    2. Свойства ограничивающей рамки должны быть нормализованы (0–1).
    3. (x, y) должны быть средними точками коробка.

Выполнение

Импорт

Настройка путей

  • Входной путь — это путь к набору данных, который мы хотим преобразовать в формат YOLO.
  • Выходной путь — это путь, по которому будет сохранен новый преобразованный набор данных.

Чтение файла аннотации JSON

Обработка изображений

Вспомогательные функции

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

  • Создайте пустой список для хранения аннотаций изображения: img_ann
  • Использование цикла for для обхода всех аннотаций в данных.
  • Использует условие if для проверки требуемого image_id .
  • Если идентификатор изображения совпадает, добавьте аннотации для этого изображения в список, который мы создали, например: img_ann
  • Я использую isFound в качестве флага, чтобы проверить, найдены ли аннотации изображения или нет. В случае не найдено, я возвращаю None.

data['images'] в наборе данных — это список словарей, содержащих информацию об изображении. Например:

В упомянутой выше функции get_img() я хочу извлечь относительную информацию об изображении, такую ​​как 'id' , 'height' и 'width', сопоставив имена файлов изображений. Если имя файла совпадает, он возвращает информацию об изображении в виде словаря.

Обработка ярлыков
Применение конверсии.
Следующие шаги мы собираемся выполнить для конверсии:

  • Извлечение информации об изображении, такой как image_id, image_width, image_height и т. д.
  • Получите аннотации к этому изображению, используя image_id.
  • Откройте текстовый файл для этого изображения по выходному пути, указанному пользователем.
  • Извлеките свойства ограничивающей рамки для каждого объекта на изображении.
  • Нахождение координат средней точки.
  • Применить нормализацию.
  • Точность настройки.
  • Запись обновленных аннотаций для этого изображения в текстовый файл.
  • После обработки всех аннотаций для текущего изображения закройте текстовый файл.
  • Повторите шаги для всех изображений.

Преобразование завершено
По указанному выходному пути будет создан новый набор данных (converted_dataset), содержащий изображения и метки в формате YOLO.

Тестирование
Перед обучением модели на новом преобразованном наборе данных мы должны проверить набор данных. Чтобы проверить, что новый преобразованный набор данных соответствует требованиям и правильно преобразован, я использую онлайн-инструмент Roboflow, и результаты некоторых образцов изображений приведены ниже:

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

Изображение:

Ярлыки:

Результаты:

Исход

Эта статья была пошаговым руководством о том, как вы можете создать свой собственный набор данных в формате YOLO для обучения модели обнаружения объектов. Я попытался преобразовать набор данных, используя простой код Python. Чтобы запустить код, вы можете скопировать блоки кода и вставить их в любой из понравившихся вам блокнотов, например Jupyter или Colab.

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

Ссылки