Zephyrnet-logo

Annotatiebeheersing: naadloze Detectron-integratie met LabelImg

Datum:

Introductie

Het labelen van de afbeelding, of het annoteren van de foto, in het grote geheel van computer vision was een uitdaging. Onze verkenning duikt in het teamwerk van LabelImg en Detectron, een krachtig duo dat nauwkeurige annotatie combineert met efficiënte modelbouw. ​​LabelImg, dat gemakkelijk te gebruiken en nauwkeurig is, leidt tot zorgvuldige annotatie en legt een solide basis voor duidelijke objectdetectie.

Terwijl we LabelImg verkennen en beter worden in het tekenen van selectiekaders, stappen we naadloos over op Detectron. Dit robuuste raamwerk organiseert onze gemarkeerde gegevens, waardoor het nuttig is bij het trainen van geavanceerde modellen. LabelImg en Detectron maken objectdetectie samen gemakkelijk voor iedereen, of u nu een beginner of een expert bent. Kom langs, waar elke gemarkeerde afbeelding ons helpt de volledige kracht van visuele informatie te ontsluiten.

Detectron-integratie met LabelImg

leerdoelen

  • Aan de slag met LabelImg.
  • Omgevingsinstellingen en LabelImg-installatie.
  • LabelImg en de functionaliteit ervan begrijpen.
  • VOC- of Pascal-gegevens converteren naar COCO-formaat voor objectdetectie.

Dit artikel is gepubliceerd als onderdeel van het Data Science-blogathon.

Inhoudsopgave

Flowchart

Stroomdiagram van naadloze Detectron-integratie met LabelImg

Uw omgeving instellen

1. Creëer een virtuele omgeving:

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

Met deze opdracht wordt een virtuele omgeving met de naam “venv” gemaakt met behulp van Python versie 3.8.

2. Activeer de virtuele omgeving: 

conda activate venv

Activeer de virtuele omgeving om de installatie van LabelImg te isoleren.

LabelImg installeren en gebruiken

1. Installeer LabelImg:

pip install labelImg

Installeer LabelImg binnen de geactiveerde virtuele omgeving.

2. Start LabelImg:

labelImg
Start LabelImg

Probleemoplossing: als u fouten tegenkomt bij het uitvoeren van het script

Als u fouten tegenkomt tijdens het uitvoeren van het script, heb ik voor uw gemak een zip-archief gemaakt met de virtuele omgeving (venv).

1. Download het zip-archief:

  • Download het venv.zip-archief van de Link

2. Maak een LabelImg-map:

  • Maak een nieuwe map met de naam LabelImg op uw lokale computer.

3. Pak de venv-map uit:

  • Pak de inhoud van het venv.zip-archief uit in de map LabelImg.

4. Activeer de virtuele omgeving:

  • Open uw opdrachtprompt of terminal.
  • Navigeer naar de LabelImg-map.
  • Voer de volgende opdracht uit om de virtuele omgeving te activeren:
conda activate ./venv

Dit proces zorgt ervoor dat u over een vooraf geconfigureerde virtuele omgeving beschikt die klaar is voor gebruik met LabelImg. Het meegeleverde zip-archief omvat de noodzakelijke afhankelijkheden, waardoor een soepelere ervaring mogelijk is zonder dat u zich zorgen hoeft te maken over een mogelijke installatie.

Ga nu verder met de eerdere stappen voor het installeren en gebruiken van LabelImg binnen deze geactiveerde virtuele omgeving.

Annotatieworkflow met LabelImg

1. Annoteer afbeeldingen in PascalVOC-indeling:

  • Bouw en start LabelImg.
  • Klik op 'Standaard opgeslagen annotatiemap wijzigen' in Menu/Bestand.
Stappen voor het uitvoeren van een annotatieworkflow met LabelImg
  • Klik op 'Open Dir' om de afbeeldingsmap te selecteren.
Stappen voor het uitvoeren van een annotatieworkflow met LabelImg
Stappen voor het uitvoeren van een annotatieworkflow met LabelImg
  • Gebruik 'Create RectBox' om objecten in de afbeelding te annoteren.
Stappen voor het uitvoeren van een annotatieworkflow met LabelImg
Stappen voor het uitvoeren van een annotatieworkflow met LabelImg
Stappen voor het uitvoeren van een annotatieworkflow met LabelImg
  • Sla de annotaties op in de opgegeven map.
Stappen voor het uitvoeren van een annotatieworkflow met LabelImg

binnen de .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>

Deze XML-structuur volgt het Pascal VOC-annotatieformaat, dat vaak wordt gebruikt voor datasets voor objectdetectie. Dit formaat biedt een gestandaardiseerde weergave van geannoteerde gegevens voor het trainen van computer vision-modellen. Als u extra afbeeldingen met annotaties heeft, kunt u vergelijkbare XML-bestanden blijven genereren voor elk geannoteerd object in de respectievelijke afbeeldingen.

Pascal VOC-annotaties converteren naar COCO-formaat: een Python-script

Objectdetectiemodellen vereisen vaak annotaties in specifieke formaten om effectief te kunnen trainen en evalueren. Hoewel Pascal VOC een veelgebruikt formaat is, geven specifieke raamwerken zoals Detectron de voorkeur aan COCO-annotaties. Om deze kloof te overbruggen, introduceren we een veelzijdige Python script, voc2coco.py, ontworpen om Pascal VOC-annotaties naadloos naar het COCO-formaat te converteren.

#!/usr/bin/python

# pip install lxml

import sys
import os
import json
import xml.etree.ElementTree as ET
import glob

START_BOUNDING_BOX_ID = 1
PRE_DEFINE_CATEGORIES = None
# If necessary, pre-define category and its id
#  PRE_DEFINE_CATEGORIES = {"aeroplane": 1, "bicycle": 2, "bird": 3, "boat": 4,
#  "bottle":5, "bus": 6, "car": 7, "cat": 8, "chair": 9,
#  "cow": 10, "diningtable": 11, "dog": 12, "horse": 13,
#  "motorbike": 14, "person": 15, "pottedplant": 16,
#  "sheep": 17, "sofa": 18, "train": 19, "tvmonitor": 20}


def get(root, name):
    vars = root.findall(name)
    return vars


def get_and_check(root, name, length):
    vars = root.findall(name)
    if len(vars) == 0:
        raise ValueError("Can not find %s in %s." % (name, root.tag))
    if length > 0 and len(vars) != length:
        raise ValueError(
            "The size of %s is supposed to be %d, but is %d."
            % (name, length, len(vars))
        )
    if length == 1:
        vars = vars[0]
    return vars


def get_filename_as_int(filename):
    try:
        filename = filename.replace("", "/")
        filename = os.path.splitext(os.path.basename(filename))[0]
        return str(filename)
    except:
        raise ValueError("Filename %s is supposed to be an integer." % (filename))


def get_categories(xml_files):
    """Generate category name to id mapping from a list of xml files.
    
    Arguments:
        xml_files {list} -- A list of xml file paths.
    
    Returns:
        dict -- category name to id mapping.
    """
    classes_names = []
    for xml_file in xml_files:
        tree = ET.parse(xml_file)
        root = tree.getroot()
        for member in root.findall("object"):
            classes_names.append(member[0].text)
    classes_names = list(set(classes_names))
    classes_names.sort()
    return {name: i for i, name in enumerate(classes_names)}


def convert(xml_files, json_file):
    json_dict = {"images": [], "type": "instances", "annotations": [], "categories": []}
    if PRE_DEFINE_CATEGORIES is not None:
        categories = PRE_DEFINE_CATEGORIES
    else:
        categories = get_categories(xml_files)
    bnd_id = START_BOUNDING_BOX_ID
    for xml_file in xml_files:
        tree = ET.parse(xml_file)
        root = tree.getroot()
        path = get(root, "path")
        if len(path) == 1:
            filename = os.path.basename(path[0].text)
        elif len(path) == 0:
            filename = get_and_check(root, "filename", 1).text
        else:
            raise ValueError("%d paths found in %s" % (len(path), xml_file))
        ## The filename must be a number
        image_id = get_filename_as_int(filename)
        size = get_and_check(root, "size", 1)
        width = int(get_and_check(size, "width", 1).text)
        height = int(get_and_check(size, "height", 1).text)
        image = {
            "file_name": filename,
            "height": height,
            "width": width,
            "id": image_id,
        }
        json_dict["images"].append(image)
        ## Currently we do not support segmentation.
        #  segmented = get_and_check(root, 'segmented', 1).text
        #  assert segmented == '0'
        for obj in get(root, "object"):
            category = get_and_check(obj, "name", 1).text
            if category not in categories:
                new_id = len(categories)
                categories[category] = new_id
            category_id = categories[category]
            bndbox = get_and_check(obj, "bndbox", 1)
            xmin = int(get_and_check(bndbox, "xmin", 1).text) - 1
            ymin = int(get_and_check(bndbox, "ymin", 1).text) - 1
            xmax = int(get_and_check(bndbox, "xmax", 1).text)
            ymax = int(get_and_check(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": "none", "id": cid, "name": cate}
        json_dict["categories"].append(cat)

    #os.makedirs(os.path.dirname(json_file), exist_ok=True)
    json_fp = open(json_file, "w")
    json_str = json.dumps(json_dict)
    json_fp.write(json_str)
    json_fp.close()


if __name__ == "__main__":
    import argparse

    parser = argparse.ArgumentParser(
        description="Convert Pascal VOC annotation to COCO format."
    )
    parser.add_argument("xml_dir", help="Directory path to xml files.", type=str)
    parser.add_argument("json_file", help="Output COCO format json file.", type=str)
    args = parser.parse_args()
    xml_files = glob.glob(os.path.join(args.xml_dir, "*.xml"))

    # If you want to do train/test split, you can pass a subset of xml files to convert function.
    print("Number of xml files: {}".format(len(xml_files)))
    convert(xml_files, args.json_file)
    print("Success: {}".format(args.json_file))

Scriptoverzicht

Het voc2coco.py-script vereenvoudigt het conversieproces door gebruik te maken van de lxml-bibliotheek. Laten we, voordat we in het gebruik duiken, de belangrijkste componenten ervan verkennen:

1. Afhankelijkheden:

  • Zorg ervoor dat de lxml-bibliotheek is geïnstalleerd met behulp van pip install lxml.

2. Configuratie:

  • Definieer eventueel categorieën vooraf met behulp van de PRE_DEFINE_CATEGORIES variabele. Verwijder de opmerkingen en pas deze sectie aan op basis van uw dataset.

3. FunctionioGet

  • get, get_and_check, get_filename_as_int: Helperfuncties voor XML-parsering.
  • get_categories: Genereert een categorienaam naar ID-toewijzing uit een lijst met XML-bestanden.
  • converteren: De hoofdconversiefunctie verwerkt XML-bestanden en genereert JSON in COCO-formaat.

Hoe te gebruiken

Het uitvoeren van het script is eenvoudig, voer het uit vanaf de opdrachtregel, geef het pad naar uw Pascal VOC XML-bestanden op en specificeer het gewenste uitvoerpad voor het JSON-bestand in COCO-formaat. Hier is een voorbeeld:

python voc2coco.py /path/to/xml/files /path/to/output/output.json

Output:

Het script voert een goed gestructureerd JSON-bestand in COCO-indeling uit met essentiële informatie over afbeeldingen, annotaties en categorieën.

Uitvoer van JSON-bestand in COCO-indeling
Uitvoer van JSON-bestand in COCO-indeling

Conclusie

Ter afsluiting van onze reis door objectdetectie met LabelImg en Detectron is het van cruciaal belang om de verscheidenheid aan annotatiehulpmiddelen voor liefhebbers en professionals te herkennen. LabelImg biedt als open source-edelsteen veelzijdigheid en toegankelijkheid, waardoor het een eerste keuze is.

Naast gratis tools komen betaalde oplossingen zoals VGG Image Annotator (VIA), RectLabel en Labelbox tussenbeide voor complexe taken en grote projecten. Deze platforms bieden geavanceerde functies en schaalbaarheid, zij het met een financiële investering, waardoor efficiëntie wordt gegarandeerd bij inspanningen waarbij veel op het spel staat.

Onze verkenning legt de nadruk op het kiezen van de juiste annotatietool op basis van projectspecificaties, budget en verfijningsniveau. Of u nu vasthoudt aan de openheid van LabelImg of investeert in betaalde tools, de sleutel is afstemming op de schaal en doelstellingen van uw project. In het evoluerende veld van computer vision blijven annotatiehulpmiddelen zich diversifiëren, waardoor ze opties bieden voor projecten van elke omvang en complexiteit.

Key Takeaways

  • De intuïtieve interface en geavanceerde functies van LabelImg maken het tot een veelzijdige open-source tool voor nauwkeurige beeldannotatie, ideaal voor degenen die zich bezighouden met objectdetectie.
  • Betaalde tools zoals VIA, RectLabel en Labelbox zijn geschikt voor complexe annotatietaken en grootschalige projecten en bieden geavanceerde functies en schaalbaarheid.
  • De cruciale conclusie is het kiezen van de juiste annotatietool op basis van projectbehoeften, budget en gewenste verfijning, waardoor efficiëntie en succes bij objectdetectie-inspanningen wordt gegarandeerd.

Hulpbronnen voor verder leren:

1. LabelImg-documentatie:

  • Verken de officiële documentatie voor LabelImg om diepgaande inzichten te krijgen in de kenmerken en functionaliteiten ervan.
  • LabelImg-documentatie

2. Detectron Framework-documentatie:

  • Duik in de documentatie van Detectron, het krachtige raamwerk voor objectdetectie, om de mogelijkheden en het gebruik ervan te begrijpen.
  • Detectron-documentatie

3. VGG Image Annotator (VIA)-gids:

  • Als u geïnteresseerd bent in het verkennen van VIA, de VGG Image Annotator, raadpleeg dan de uitgebreide handleiding voor gedetailleerde instructies.
  • VIA-gebruikershandleiding

4.RectLabel-documentatie:

  • Lees meer over RectLabel, een betaalde annotatietool, door de officiële documentatie te raadplegen voor richtlijnen over gebruik en functies.
  • RectLabel-documentatie

5.Labelbox-leercentrum:

  • Ontdek educatieve bronnen en tutorials in het Labelbox Learning Center om uw begrip van dit annotatieplatform te vergroten.
  • Labelbox-leercentrum

Veelgestelde Vragen / FAQ

Vraag 1: Wat is LabelImg en waarin verschilt het van andere annotatietools?

A: LabelImg is een open-source hulpmiddel voor het annoteren van afbeeldingen voor objectdetectietaken. De gebruiksvriendelijke interface en veelzijdigheid onderscheiden het. In tegenstelling tot sommige tools maakt LabelImg nauwkeurige annotatie van het selectiekader mogelijk, waardoor het een voorkeurskeuze is voor mensen die nog niet bekend zijn met objectdetectie.

Vraag 2: Zijn er alternatieve betaalde annotatietools, en hoe verhouden deze zich tot gratis opties?

A: Ja, verschillende betaalde annotatietools, zoals VGG Image Annotator (VIA), RectLabel en Labelbox, bieden geavanceerde functies en schaalbaarheid. Hoewel gratis tools zoals LabelImg uitstekend geschikt zijn voor basistaken, zijn betaalde oplossingen op maat gemaakt voor complexere projecten, waardoor ze samenwerkingsfuncties en verbeterde efficiëntie bieden.

Vraag 3: Wat is de betekenis van het converteren van annotaties naar het Pascal VOC-formaat?

A: Het converteren van annotaties naar het Pascal VOC-formaat is cruciaal voor compatibiliteit met frameworks zoals Detectron. Het zorgt voor consistente klassenlabeling en naadloze integratie in de trainingspijplijn, waardoor het creëren van nauwkeurige objectdetectiemodellen wordt vergemakkelijkt.

Vraag 4: Hoe draagt ​​Detectron bij aan efficiënte modeltraining in objectdetectie?

A: Detectron is een robuust raamwerk voor objectdetectie dat het modeltrainingsproces stroomlijnt. Het speelt een cruciale rol bij het verwerken van geannoteerde gegevens, het voorbereiden ervan op training en het optimaliseren van de algehele efficiëntie van objectdetectiemodellen.

Vraag 5: Kan ik betaalde annotatietools gebruiken voor kleinschalige projecten, of zijn deze vooral bedoeld voor taken op ondernemingsniveau?

A: Hoewel betaalde annotatietools vaak worden geassocieerd met taken op ondernemingsniveau, kunnen ze ook kleinschalige projecten ten goede komen. De beslissing hangt af van de specifieke vereisten, budgetbeperkingen en het gewenste niveau van verfijning voor annotatietaken.

De in dit artikel getoonde media zijn geen eigendom van Analytics Vidhya en worden naar goeddunken van de auteur gebruikt. 

spot_img

Laatste intelligentie

spot_img