Конвертация аннотаций VOC2012 .xml в сегментацию .png

Вопрос или проблема

Кто-нибудь знает хороший способ конвертировать файлы annotations из xml в файлы SegmentationClass (аннотации классов) в png?

Это скрипт на bash от Deeplab для предварительной обработки набора данных, который может помочь – https://github.com/tensorflow/models/blob/master/research/deeplab/datasets/download_and_convert_voc2012.sh

Некоторые люди сообщали о проблемах с чтением аннотаций, что описано здесь https://stackoverflow.com/questions/51676447/python-use-pil-to-load-png-file-gives-strange-results?noredirect=1#comment90316222_51676447

.

Ответ или решение

Конвертация аннотаций VOC2012 из формата .xml в .png для разбиения на классы (SegmentationClass) является важной задачей для многих проектов в области компьютерного зрения. Аннотации в формате .xml содержат разметку изображений, включая классы объектов и их положения, что является основой для создания масок сегментации.

Шаги по конвертации аннотаций VOC2012 XML в PNG:

  1. Подготовка рабочего окружения:

    • Убедитесь, что на вашем компьютере установлены Python и необходимые библиотеки. Для выполнения данной задачи вам потребуются библиотеки Pillow для работы с изображениями и xml.etree.ElementTree для обработки .xml файлов.
    • Установите необходимые библиотеки, если они еще не установлены:
      pip install Pillow
  2. Загрузка аннотаций:

    • Загружайте аннотации из каталога VOC2012. Обычно они хранятся в папке Annotations внутри директории набора данных.
  3. Создание маски сегментации:

    • Для каждого .xml файла вы должны извлечь информацию о классах и их координатах. Пример структуры XML может выглядеть так:
      <annotation>
       <object>
           <name>person</name>
           <bndbox>
               <xmin>50</xmin>
               <ymin>50</ymin>
               <xmax>100</xmax>
               <ymax>150</ymax>
           </bndbox>
       </object>
      </annotation>
    • Поддерживайте соответствие между классами и уникальными значениями в маске. Например, "человек" может быть представлен значением 1, "собака" – 2, и так далее.
  4. Скрипт для конвертации:

    • Вот пример кода на Python для конвертации:
      
      import os
      import xml.etree.ElementTree as ET
      from PIL import Image
      import numpy as np

    Определение путей к папкам

    annotation_path = ‘путь/к/Annotations’
    image_path = ‘путь/к/JPEGImages’
    output_path = ‘путь/к/SegmentationClass’

    Создание выходной папки, если она не существует

    os.makedirs(output_path, exist_ok=True)

    Словарь для классов

    class_map = {‘background’: 0, ‘person’: 1, ‘dog’: 2} # Добавьте остальные классы

    Пробегаем по всем XML файлам

    for xml_file in os.listdir(annotation_path):
    if xml_file.endswith(‘.xml’):

    Парсинг XML файла

       tree = ET.parse(os.path.join(annotation_path, xml_file))
       root = tree.getroot()
    
       # Получение имени изображения
       image_name = root.find('filename').text.replace('.jpg', '.png')
       img = Image.open(os.path.join(image_path, image_name))
       seg_map = np.zeros(img.size[::-1], dtype=np.uint8)  # Создаем пустую маску
    
       # Обработка объектов в аннотации
       for obj in root.findall('object'):
           class_name = obj.find('name').text
           class_id = class_map.get(class_name, 0)
    
           # Получаем координаты bounding box
           bbox = obj.find('bndbox')
           xmin = int(bbox.find('xmin').text)
           ymin = int(bbox.find('ymin').text)
           xmax = int(bbox.find('xmax').text)
           ymax = int(bbox.find('ymax').text)
    
           # Заполняем маску сегментации
           seg_map[ymin:ymax, xmin:xmax] = class_id
    
       # Сохраняем маску в PNG
       seg_image = Image.fromarray(seg_map)
       seg_image.save(os.path.join(output_path, os.path.splitext(xml_file)[0] + '.png'))
  5. Проверка полученных масок:

    • После выполнения скрипта проверьте полученные файлы .png в папке SegmentationClass. Убедитесь, что они правильно отображают классы.

Заключение:

Конвертация аннотаций VOC2012 из .xml в .png для сегментации — это важный процесс, позволяющий подготовить данные для обучающих моделей компьютерного зрения. Используя приведенный выше пример кода, вы можете легко выполнить эту задачу и адаптировать его под свои нужды. Не забудьте добавлять новые классы в class_map, если это необходимо для вашего проекта.

Оцените материал
Добавить комментарий

Капча загружается...