Вопрос или проблема
Кто-нибудь знает хороший способ конвертировать файлы 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:
-
Подготовка рабочего окружения:
- Убедитесь, что на вашем компьютере установлены Python и необходимые библиотеки. Для выполнения данной задачи вам потребуются библиотеки
Pillow
для работы с изображениями иxml.etree.ElementTree
для обработки .xml файлов. - Установите необходимые библиотеки, если они еще не установлены:
pip install Pillow
- Убедитесь, что на вашем компьютере установлены Python и необходимые библиотеки. Для выполнения данной задачи вам потребуются библиотеки
-
Загрузка аннотаций:
- Загружайте аннотации из каталога VOC2012. Обычно они хранятся в папке
Annotations
внутри директории набора данных.
- Загружайте аннотации из каталога VOC2012. Обычно они хранятся в папке
-
Создание маски сегментации:
- Для каждого .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, и так далее.
- Для каждого .xml файла вы должны извлечь информацию о классах и их координатах. Пример структуры XML может выглядеть так:
-
Скрипт для конвертации:
- Вот пример кода на 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'))
- Вот пример кода на Python для конвертации:
-
Проверка полученных масок:
- После выполнения скрипта проверьте полученные файлы .png в папке
SegmentationClass
. Убедитесь, что они правильно отображают классы.
- После выполнения скрипта проверьте полученные файлы .png в папке
Заключение:
Конвертация аннотаций VOC2012 из .xml в .png для сегментации — это важный процесс, позволяющий подготовить данные для обучающих моделей компьютерного зрения. Используя приведенный выше пример кода, вы можете легко выполнить эту задачу и адаптировать его под свои нужды. Не забудьте добавлять новые классы в class_map
, если это необходимо для вашего проекта.