В освоении аннотации безшовная интеграция с LabelImg в Detectron

Плавная интеграция LabelImg в Detectron освоение аннотации без проблем

Введение

Отметка изображения, или аннотация фотографии, в большой картине компьютерного зрения была вызовом. Наше исследование погружается в командную работу LabelImg и Detectron, мощный дуэт, который объединяет точную аннотацию и эффективное построение моделей. LabelImg, простой в использовании и точный, лидирует в внимательной аннотации, ложа прочный фундамент для ясного обнаружения объектов.

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

Цели изучения

  • Начало работы с LabelImg.
  • Настройка окружения и установка LabelImg.
  • Понимание LabelImg и его функциональности.
  • Преобразование данных VOC или Pascal в формат COCO для обнаружения объектов.

Этот статья была опубликована в рамках Data Science Blogathon.

Схема

Настройка окружения

1. Создайте виртуальное окружение:

conda create -p ./venv python=3.8 -y

Эта команда создает виртуальное окружение с именем “venv” с использованием Python версии 3.8.

2. Активируйте виртуальное окружение:

conda activate venv

Активируйте виртуальное окружение, чтобы изолировать установку LabelImg.

Установка и использование LabelImg

1. Установите LabelImg:

pip install labelImg

Установите LabelImg в активированное виртуальное окружение.

2. Запустите LabelImg:

labelImg

Устранение неполадок: если у вас возникли ошибки при запуске скрипта

Если у вас возникли ошибки при запуске скрипта, я подготовил архив ZIP, содержащий виртуальное окружение (venv) для вашего удобства.

1. Скачайте архив ZIP:

2. Создайте папку LabelImg:

  • Создайте новую папку с именем LabelImg на вашем компьютере.

3. Извлеките папку venv:

  • Извлеките содержимое архива venv.zip в папку LabelImg.

4. Активируйте виртуальное окружение:

  • Откройте командную строку или терминал.
  • Перейдите в папку LabelImg.
  • Выполните следующую команду для активации виртуального окружения:
conda activate ./venv

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

Теперь продолжайте с предыдущими шагами для установки и использования LabelImg в активированном виртуальном окружении.

Рабочий процесс аннотации с LabelImg

1. Аннотируйте изображения в формате PascalVOC:

  • Создайте и запустите LabelImg.
  • Нажмите “Изменить папку для сохранения аннотаций” в меню “Файл”.
  • Щелкните “Открыть папку”, чтобы выбрать папку с изображениями.
  • Используйте “Создать прямоугольную рамку”, чтобы аннотировать объекты на изображении.
  • Сохраните аннотации в указанную папку.

внутри .xml

<annotation> <folder>train</folder>  <filename>0a8a68ee-f587-4dea-beec-79d02e7d3fa4___RS_Early.B 8461.JPG</filename> <path>/home/suyodhan/Documents/Blog /label/train/0a8a68ee-f587-4dea-beec-79d02e7d3fa4___RS_Early.B 8461.JPG</path>  <source>      <database>Unknown</database>    </source> <size>        <width>256</width>      <height>256</height>        <depth>3</depth>    </size>   <segmented>0</segmented>    <object>      <name>Potato___Early_blight</name>      <pose>Unspecified</pose>        <truncated>0</truncated>        <difficult>0</difficult>        <bndbox>          <xmin>12</xmin>         <ymin>18</ymin>         <xmax>252</xmax>            <ymax>250</ymax>        </bndbox> </object></annotation>

Эта структура XML следует формату аннотации Pascal VOC, который обычно используется для наборов данных по обнаружению объектов. Этот формат обеспечивает стандартизированное представление размеченных данных для обучения моделей компьютерного зрения. Если у вас есть дополнительные изображения с аннотациями, вы можете продолжать генерировать подобные XML-файлы для каждого размеченного объекта в соответствующих изображениях.

Преобразование аннотаций Pascal VOC в формат COCO: скрипт на Python

Модели обнаружения объектов часто требуют аннотаций в определенных форматах для эффективного обучения и оценки. В то время как Pascal VOC является широко используемым форматом, конкретные фреймворки, такие как Detectron, предпочитают аннотации COCO. Чтобы устранить эту разницу, мы представляем универсальный скрипт на языке Python, voc2coco.py, разработанный для безшовного преобразования аннотаций Pascal VOC в формат COCO.

#!/usr/bin/python# pip install lxmlimport sysimport osimport jsonimport xml.etree.ElementTree as ETimport globSTART_BOUNDING_BOX_ID = 1PRE_DEFINE_CATEGORIES = None# Если необходимо, предопределите категорию и ее идентификатор#  PRE_DEFINE_CATEGORIES = {"самолет": 1, "велосипед": 2, "птица": 3, "лодка": 4,#  "бутылка": 5, "автобус": 6, "автомобиль": 7, "кошка": 8, "стул": 9,#  "корова": 10, "обеденный стол": 11, "собака": 12, "лошадь": 13,#  "мотоцикл": 14, "человек": 15, "горшок с растением": 16,#  "овца": 17, "диван": 18, "поезд": 19, "телевизор": 20}def получить(root, name):    vars = root.findall(name)    return varsdef получить_и_проверить(root, имя, длина):    vars = root.findall(имя)    if len(vars) == 0:        raise ValueError("Не удается найти %s в %s." % (имя, root.tag))    if длина > 0 и len(vars) != длина:        raise ValueError(            "Размер %s должен быть %d, но он %d."            % (имя, длина, len(vars))        )    if длина == 1:        vars = vars[0]    return varsdef получить_имя_файла_как_целое_число(имя_файла):    try:        имя_файла = имя_файла.replace("\\", "/")        имя_файла = os.path.splitext(os.path.basename(имя_файла))[0]        return str(имя_файла)    except:        raise ValueError("Имя файла %s должно быть целым числом." % (имя_файла))def получить_категории(xml_файлы):    """Сгенерировать отображение имени категории на идентификатор из списка xml-файлов.        Аргументы:        xml_файлы {список} -- Список путей к xml-файлам.        Возвращает:        словарь -- отображение имени категории на идентификатор.    """    имена_классов = []    for xml_файл in xml_файлы:        tree = ET.parse(xml_файл)        root = tree.getroot()        for член in root.findall("object"):            имена_классов.append(член[0].text)    имена_классов = list(set(имена_классов))    имена_классов.sort()    return {имя: i for i, имя in enumerate(имена_классов)}def преобразовать(xml_файлы, json_файл):    json_dict = {"images": [], "type": "instances", "annotations": [], "categories": []}    if PRE_DEFINE_CATEGORIES is not None:        categories = PRE_DEFINE_CATEGORIES    else:        categories = получить_категории(xml_файлы)    bnd_id = START_BOUNDING_BOX_ID    for xml_файл in xml_файлы:        tree = ET.parse(xml_файл)        root = tree.getroot()        path = получить(root, "path")        if len(path) == 1:            filename = os.path.basename(path[0].text)        elif len(path) == 0:            filename = получить_и_проверить(root, "filename", 1).text        else:            raise ValueError("%d пути найдено в файле %s" % (len(path), xml_файл))        ## Имя файла должно быть числом        image_id = получить_имя_файла_как_целое_число(filename)        size = получить_и_проверить(root, "size", 1)        width = int(получить_и_проверить(size, "width", 1).text)        height = int(получить_и_проверить(size, "height", 1).text)        image = {            "file_name": filename,            "height": height,            "width": width,            "id": image_id,        }        json_dict["images"].append(image)        ## В настоящее время мы не поддерживаем сегментацию.        #  segmented = получить_и_проверить(root, 'segmented', 1).text        #  assert segmented == '0'        for obj in получить(root, "object"):            category = получить_и_проверить(obj, "name", 1).text            if category not in categories:                new_id = len(categories)                categories[category] = new_id            category_id = categories[category]            bndbox = получить_и_проверить(obj, "bndbox", 1)            xmin = int(получить_и_проверить(bndbox, "xmin", 1).text) - 1            ymin = int(получить_и_проверить(bndbox, "ymin", 1).text) - 1            xmax = int(получить_и_проверить(bndbox, "xmax", 1).text)            ymax = int(получить_и_проверить(bndbox, "ymax", 1).text)            assert xmax > xmin            assert ymax > ymin            o_width = abs(xmax - xmin)            o_height = abs(ymax - ymin)            ann = {                "area": o_width * o_height,                "iscrowd": 0,                "image_id": image_id,                "bbox": [xmin, ymin, o_width, o_height],                "category_id": category_id,                "id": bnd_id,                "ignore": 0,                "segmentation": [],            }            json_dict["annotations"].append(ann)            bnd_id = bnd_id + 1    for cate, cid in categories.items():        cat = {"supercategory": "нет", "id": cid, "name": cate}        json_dict["categories"].append(cat)    #os.makedirs(os.path.dirname(json_file), exist_ok=True)    json_fp = open(json_файл, "w")    json_str = json.dumps(json_dict)    json_fp.write(json_str)    json_fp.close()if __name__ == "__main__":    import argparse    parser = argparse.ArgumentParser(        description="Преобразование аннотации Pascal VOC в формат COCO."    )    parser.add_argument("xml_dir", help="Путь к директории с xml-файлами.", type=str)    parser.add_argument("json_file", help="Выходной файл формата COCO в формате json.", type=str)    args = parser.parse_args()    xml_files = glob.glob(os.path.join(args.xml_dir, "*.xml"))    # Если вы хотите выполнить разделение на тренировочный/тестовый наборы, вы можете передать подмножество xml-файлов в функцию преобразования.    print("Количество xml-файлов: {}".format(len(xml_files)))    преобразовать(xml_files, args.json_file)    print("Успех: {}".format(args.json_file))

Обзор скрипта

Скрипт voc2coco.py упрощает процесс конвертации, используя библиотеку lxml. Перед тем, как перейти к использованию, давайте изучим его основные компоненты:

1. Зависимости:

  • Убедитесь, что библиотека lxml установлена с помощью pip install lxml.

2. Конфигурация:

  • По желанию, можно предопределить категории, используя переменную PRE_DEFINE_CATEGORIES. Раскомментируйте и измените этот раздел в соответствии с вашим набором данных.

3. Функции:

  • get, get_and_check, get_filename_as_int: Вспомогательные функции для разбора XML.
  • get_categories: Создает соответствие имени категории и ID на основе списка XML файлов.
  • convert: Основная функция конвертации, обрабатывает XML файлы и генерирует JSON в формате COCO.

Как использовать

Выполнение скрипта простое – запустите его из командной строки, указав путь к вашим XML файлам формата Pascal VOC и желаемый путь к выходному файлу JSON формата COCO. Вот пример:

python voc2coco.py /путь/к/xml/файлам /путь/к/выходному/файлу/output.json

Вывод:

Скрипт создает структурированный файл JSON в формате COCO, содержащий необходимую информацию о изображениях, аннотациях и категориях.

Заключение

В заключение, завершая наше путешествие по обнаружению объектов с помощью LabelImg и Detectron, крайне важно понять многообразие инструментов для аннотации, которые предназначены для энтузиастов и профессионалов. LabelImg, как открытый ресурс, обладает гибкостью и доступностью, что делает его лучшим выбором.

Помимо бесплатных инструментов, платные решения, такие как VGG Image Annotator (VIA), RectLabel и Labelbox, предоставляют возможности для выполнения сложных задач и крупных проектов. Эти платформы предлагают продвинутые функции и масштабируемость, хотя и требуют финансовых вложений, обеспечивая эффективность в более сложных задачах.

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

Основные выводы

  • Интуитивный интерфейс и продвинутые функции LabelImg делают его универсальным инструментом с открытым исходным кодом для точной аннотации изображений, идеально подходящим для тех, кто занимается обнаружением объектов.
  • Платные инструменты, такие как VIA, RectLabel и Labelbox, предлагают возможности для выполнения сложных задач и крупномасштабных проектов, обладая продвинутыми функциями и масштабируемостью.
  • Главное заключение состоит в выборе подходящего инструмента для аннотации, основываясь на потребностях проекта, бюджете и желаемом уровне сложности, обеспечивая эффективность и успех в проектах по обнаружению объектов.

Ресурсы для дальнейшего изучения:

1. Документация LabelImg:

  • Исследуйте официальную документацию LabelImg, чтобы получить подробные сведения о его функциях и возможностях.
  • Документация LabelImg

2. Документация фреймворка Detectron:

  • Погрузитесь в документацию Detectron, мощного фреймворка для обнаружения объектов, чтобы понять его возможности и использование.
  • Документация Detectron

3. Руководство по использованию VGG Image Annotator (VIA):

  • Если вас интересует использование VIA, аннотатора изображений от VGG, обратитесь к подробному руководству для получения инструкций.
  • Руководство пользователя VIA

4. Документация RectLabel:

  • Узнайте больше о RectLabel, платном инструменте для аннотации, обратившись к его официальной документации, где указаны инструкции по использованию и возможности.
  • Документация RectLabel

5. Центр обучения Labelbox:

  • Откройте для себя образовательные ресурсы и учебники в Центре обучения Labelbox для улучшения понимания этой платформы для аннотации.
  • Центр обучения Labelbox

Часто задаваемые вопросы

Медиа, показанная в этой статье, не принадлежит Analytics Vidhya и используется по усмотрению автора.