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.
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.
OpenCV shape detection - PyImageSearch
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.
Verwenden Sie VoTT 1.7.2. Laden Sie vott-win.exe
herunter und installieren Sie es.
Release 1.7.2 · microsoft/VoTT
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".
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
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. ** ** **
Der folgende Bildschirm ist in Ordnung, wenn Sie fortfahren
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.
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.
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.
#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.
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.
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.
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.
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)
Recommended Posts