[PYTHON] [Bilderkennung] Lesen des Ergebnisses der automatischen Annotation mit VoTT

Einführung

Die wichtigste, aber problematische Sache beim maschinellen Lernen ist die Annotation (Erstellen eines Lehrerlabels). Für die Bilderkennung stehen Anmerkungswerkzeuge wie VoTT zur Verfügung, aber das Klicken mit der Maus ist immer noch mühsam. Es würde Spaß machen, wenn wir Etiketten bis zu einem gewissen Grad automatisch erstellen und nur die seltsamen Teile reparieren könnten.

Aktive Lernfunktion (VoTT)

Tatsächlich gibt es Funktionen auf der Welt, die solche Anforderungen erfüllen können, wie beispielsweise die Active Learning-Funktion von VoTT. Einführung der aktiven Lernfunktion von VoTT - Qiita

Die trainierten Modelle, die verwendet werden können, sind jedoch festgelegt, und einige Aufgaben sind möglicherweise nicht verfügbar. Ich und andere möchten das Marufuku-Zeichen mit Anmerkungen versehen, aber ** das vorhandene Modell für die Objekterkennung wird aktualisiert. Ich meine, deshalb versuche ich, das Modell selbst zu lernen. ** ** **

Daher zeige ich Ihnen, wie Sie ein mit Ihrer bevorzugten Logik oder Ihrem bevorzugten Modell erstelltes Etikett konvertieren, damit es vom Anmerkungswerkzeug gelesen werden kann. Beispielsweise ist es möglich, die folgenden mit OpenCV mit einem Anmerkungswerkzeug erstellten Beschriftungen zu lesen, nur die erforderlichen Teile zu ändern und sie für vertiefendes Lernen zu verwenden.

image.png OpenCV shape detection - PyImageSearch

Überprüfungsumgebung

VoTT 2.1.0 wurde im Mai 2020 veröffentlicht, als ich den Artikel schrieb, aber es schien schwierig zu sein, die von mir erstellten Anmerkungen zu laden, da sie zu komplex und die Struktur des Projekts kompliziert waren. Daher werden wir es dieses Mal mit der älteren Version 1.7.2 laden.

Verfahren

VoTT-Installation

Verwenden Sie VoTT 1.7.2. Laden Sie vott-win.exe herunter und installieren Sie es. Release 1.7.2 · microsoft/VoTT

Datenaufbereitung

Erstellen Sie einen Ordner an einem geeigneten Ort und sammeln Sie die Bilder (JPG oder PNG), die Sie kommentieren möchten, direkt darunter. Hier lautet der vollständige Pfad des Ordners "C: \ foo \ bar \ myproj". Für VoTT 1.7.2 heißt die entsprechende Projektdatei "C: \ foo \ bar \ myproj.json".

Automatische Anmerkungsergebnisse erstellen

make_vott_project.py


import sys
import json
import hashlib
import urllib
from pathlib import Path
from PIL import Image # pillow 7.1.2

imgdir = Path(sys.argv[1]).resolve()
projfile = imgdir.with_suffix(".json")

if projfile.exists():
    #Laden Sie ein vorhandenes Projekt
    f = open(projfile, "r+")
    data = json.load(f)
else:
    #Erstellen Sie ein neues Projekt
    f = open(projfile, "w")
    data = {
        "frames": {},
        "framerate": "1",
        "inputTags": "mrfk", #Tag-Liste (durch Kommas getrennt)
        "suggestionType": "track",
        "scd": False,
        "visitedFrames": [],
        "tag_colors": ["#0cc7ff"] #Bereichsfarbe (optional)
    }

with f:
    for imgfile in imgdir.glob("*.*"):
        if imgfile.suffix.lower() in [".jpg ", ".png "]:
            if imgfile.name in data["frames"]:
                #Überspringen, wenn ein Eintrag vorhanden ist
                continue
            else:
                #Wenn kein Eintrag vorhanden ist, erstellen Sie einen neuen
                frame = []
                data["frames"][imgfile.name] = frame

            #Bildgröße abrufen
            img = Image.open(imgfile)
            w, h = img.size
            img.close()

            #Listen Sie die Bereiche auf, die Sie erkannt haben (vorläufig)
            points = [ #Listen Sie die Eckpunkte in der Reihenfolge auf, in der sie durch Seiten verbunden sind
                {"x": 0.0, "y": 0.0},
                {"x": w,   "y": 0.0},
                {"x": w,   "y": h},
                {"x": 0.0, "y": h}
            ]
            box = {  #Externes Rechteck
                "x1": min(p["x"] for p in points),
                "y1": min(p["y"] for p in points),
                "x2": max(p["x"] for p in points),
                "y2": max(p["y"] for p in points)
            }
            region = box.copy()
            region.update({
                "width": w,
                "height": h,
                "box": box,
                "points": points,
                "type": "rect",
                "tags": ["mrfk"], #Tag-Liste, die dem Bereich gegeben werden soll
            })
            frame.append(region)

    #Projekt speichern
    f.seek(0)
    json.dump(data, f)

Wenn Sie an der Eingabeaufforderung Folgendes ausführen, wird das Tag "mrfk" zum gesamten Bereich jedes Bildes hinzugefügt.

python make_vott_project.py C:\foo\bar\myproj

So bearbeiten Sie mit VoTT

Starten Sie VoTT 1.7.2, klicken Sie auf das Bildsymbol und wählen Sie den Ordner C: \ foo \ bar \ myproj. ** Bitte beachten Sie, dass der Name der Projektdatei automatisch aus dem Ordnernamen ermittelt wird. ** ** ** image.png

Der folgende Bildschirm ist in Ordnung, wenn Sie fortfahren image.png

Ein Etikett wird an das gesamte Bild angehängt. Sie können das Bild mit den Schaltflächen von 2 nach links zeigenden Dreiecken und 2 nach rechts zeigenden Dreiecken wechseln. image.png

Wenn Sie die Beschriftung ändern möchten, wählen Sie oben links Regions Manipulation aus und ziehen Sie die vier Ecken des Bereichs per Drag & Drop. image.png

Sie können überschreiben und speichern, indem Sie im Menü Datei → Speichern auswählen. Sie sollten die aktualisierte JSON-Datei lesen und die entsprechenden Trainingsdaten erstellen.

Anpassen

Laden Sie eine extern erstellte Anmerkung wie OpenCV

#Listen Sie die Bereiche auf, die Sie erkannt haben (vorläufig)

Geben Sie im Teil von das Erkennungsergebnis in "Punkte" ein. Geben Sie die Koordinaten jedes Scheitelpunkts des Bereichs in der Reihenfolge an, in der sie durch die Seiten verbunden sind.

Zum Beispiel, wenn Sie den Code aus dem folgenden Tutorial verwenden möchten OpenCV shape detection - PyImageSearch

frame = []
# loop over the contours
for c in cnts:
    (Abkürzung)
    points = [{"x": p[0], "y": p[1]} for p in c]
    (Abkürzung)
    frame.append(region)

Sie können es so machen.

Geben Sie den Bereich des Polygons an

Wenn Sie einen komplexen Bereich angeben möchten, der kein Rechteck ist

            region.update({
                "width": w,
                "height": h,
                "box": box,
                "points": points,
                "type": "rect",
                "tags": ["mrfk"], #Tag-Liste, die dem Bereich gegeben werden soll
            })

Dieser Teil

            region.update({
                "width": w,
                "height": h,
                "box": box,
                "points": points,
                "type": "polygon", #Hier ändern
                "tags": ["mrfk"], #Tag-Liste, die dem Bereich gegeben werden soll
            })

Wechseln Sie einfach zu. Auf diese Weise bewegt sich der andere nicht, wenn Sie einen Scheitelpunkt verschieben. Sie können eine nicht rechteckige Form erstellen, wie unten gezeigt. image.png

Machen Sie mehrere Tags

Geben Sie zunächst den Namen als durch Kommas getrennte Zeichenfolge anstelle von "inputTags" an.

    data = {
        "frames": {},
        "framerate": "1",
        "inputTags": "mrfk,chst,wide", #Tag-Liste (durch Kommas getrennt)
        "suggestionType": "track",
        "scd": False,
        "visitedFrames": [],
        "tag_colors": ["#0cc7ff"] #Bereichsfarbe (optional)
    }

Geben Sie für "Tags" in jedem Bereich eine Liste von Tags an (eine Liste von Python, keine durch Kommas getrennte Zeichenfolge).

            region.update({
                "width": w,
                "height": h,
                "box": box,
                "points": points,
                "type": "rect",
                "tags": ["mrfk", "chst"], #Tag-Liste, die dem Bereich gegeben werden soll
            })

Wie Sie sehen können, wird dies unten links im Fenster und im Tooltip im Bild angezeigt. image.png

Wenn Sie die vorhandene Objekterkennungsergebnisklasse weiter unterteilen möchten, können Sie nur "inputTags" erhöhen und die Klasse (Tag) jedes Bereichs mit VoTT bearbeiten.

Ändern Sie die Farbe des Tags

Wenn Sie die Farbe des Bereichs oder die Textfarbe der Tag-Liste unten links ändern möchten, können Sie die Liste der Farben in "tag_colors" unten angeben.

    data = {
        "frames": {},
        "framerate": "1",
        "inputTags": "mrfk,chst,wide", #Tag-Liste (durch Kommas getrennt)
        "suggestionType": "track",
        "scd": False,
        "visitedFrames": [],
        "tag_colors": ["#ff4040", "#ffff40", "#008000"] #Bereichsfarbe (optional)
    }

Sie können Ihre Lieblingsfarbe wie folgt ausgeben. (Das Bild ist nach dem Bearbeiten der Anmerkung von mir) image.png

Recommended Posts

[Bilderkennung] Lesen des Ergebnisses der automatischen Annotation mit VoTT
So schneiden Sie den unteren rechten Teil des Bildes mit Python OpenCV
Ich habe versucht, die Entropie des Bildes mit Python zu finden
So aktivieren Sie das Lesen / Schreiben von net.Conn mit golang, um mit dem Kontext abzubrechen
Lesen des SNLI-Datensatzes
So erhalten Sie die ID von Type2Tag NXP NTAG213 mit nfcpy
So erstellen Sie einen Befehl zum Lesen der Einstellungsdatei mit Pyramide
Berücksichtigen Sie die Verarbeitungsgeschwindigkeit, um den Bildpuffer mit numpy.ndarray zu verschieben
[Linux] Deaktivieren der automatischen Aktualisierung der Datei /etc/resolv.conf (AmazonLinux2)
So geben Sie das Ausgabeergebnis des Linux-Befehls man in eine Datei aus
So überwachen Sie den Ausführungsstatus von sqlldr mit dem Befehl pv
So überprüfen Sie die Version von Django
Wie man Problemdaten mit Paiza liest
Versuchen Sie, die Höhendaten des National Land Research Institute mit Python abzubilden
[Einführung in Python] So sortieren Sie den Inhalt einer Liste effizient mit Listensortierung
Lesen Sie das Diagrammbild mit OpenCV und ermitteln Sie die Koordinaten des Endpunkts des Diagramms
Ich möchte das automatische Löschen des tmp-Bereichs in RHEL7 stoppen
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python
So berechnen Sie die Volatilität einer Marke
Lesen einer CSV-Datei mit Python 2/3
So finden Sie den Bereich des Boronoi-Diagramms
Ich habe versucht, Bilder mit CIFAR-10 mit Keras-Learning- zu erkennen.
Schneiden Sie das Bild mit Pythonista auf abgerundete Ecken
So codieren Sie eine Drohne mithilfe der Bilderkennung
Ich habe versucht, Bilder von CIFAR-10 mit Keras-Bilderkennung zu erkennen.
[Python] Wie man Excel-Dateien mit Pandas liest
So beschneiden Sie ein Bild mit Python + OpenCV
So testen Sie den Friends-of-Friends-Algorithmus mit pyfof
Ich habe versucht, die Trapezform des Bildes zu korrigieren
So lesen Sie ein Array mit Pythons ConfigParser
So legen Sie Attribute mit Mock of Python fest
So implementieren Sie "named_scope" von RubyOnRails mit Django
So zeigen Sie im gesamten Fenster an, wenn Sie das Hintergrundbild mit tkinter einstellen
Checkliste, wie Sie vermeiden können, die Elemente des Numpy-Arrays mit for zu drehen
Hinweis: So erhalten Sie den letzten Tag des Monats mit Python (hinzugefügt am ersten Tag des Monats)
Wie man Kaldi mit JUST Corpus trainiert
So erhalten Sie mit Python eine Liste der Dateien im selben Verzeichnis
[Einführung in Python] So erhalten Sie den Datenindex mit der for-Anweisung
Lesen von Originaldaten oder externen Daten im Internet mit scikit-learn anstelle eines angehängten Datensatzes wie Iris
Der Hintergrund der Zeichen im Textbild ist überbelichtet, um das Lesen zu erleichtern.
Wie identifiziere ich das Element mit der geringsten Anzahl von Zeichen in einer Python-Liste?
Erste Schritte mit Visual Studio Online ~ Das Ende der Ära der Umgebungskonstruktion ~
Ein Memo darüber, wie man das schwierige Problem der Erfassung von FX mit AI überwinden kann
So zählen Sie die Anzahl der Vorkommen jedes Elements in der Liste in Python mit der Gewichtung
So ändern Sie das generierte Bild von GAN in ein qualitativ hochwertiges Bild nach Ihren Wünschen
Beim 15. Offline-Echtzeitversuch habe ich versucht, das Problem des Schreibens mit Python zu lösen
Lesen Sie die Python-Markdown-Quelle: So erstellen Sie einen Parser
Wie man die Portnummer des xinetd-Dienstes kennt
Extrahieren Sie die Tabelle der Bilddateien mit OneDrive & Python
So löschen Sie die angegebene Zeichenfolge mit dem Befehl sed! !! !!
So ermitteln Sie die Anzahl der Stellen in Python
So kratzen Sie Bilddaten von Flickr mit Python
Ich möchte das Ausführungsergebnis von strace erfassen
Fügen Sie mit Matplotlib Informationen am unteren Rand der Abbildung hinzu
[Einführung in Python] Wie iteriere ich mit der Bereichsfunktion?
So erstellen Sie ein Untermenü mit dem Plug-In [Blender]