La chose la plus importante mais la plus gênante dans l'apprentissage automatique est l'annotation (création d'une étiquette d'enseignant). Pour la reconnaissance d'image, des outils d'annotation tels que VoTT sont disponibles, mais il est toujours difficile de cliquer avec la souris. Ce serait amusant si nous pouvions créer automatiquement des étiquettes dans une certaine mesure et ne corriger que les parties étranges.
En fait, il existe des fonctions dans le monde qui peuvent répondre à de telles demandes, comme la fonction d'apprentissage actif de VoTT. Introduction de la fonction d'apprentissage actif de VoTT --Qiita
Cependant, les modèles formés qui peuvent être utilisés sont fixes et certaines tâches peuvent ne pas être disponibles. Moi et d'autres veulent Annoter le signe Marufuku, mais ** le modèle existant de détection d'objets est rafraîchissant. Je veux dire, c'est pourquoi j'essaie d'apprendre le modèle moi-même. ** **
Donc, je vais vous montrer comment convertir une étiquette créée à l'aide de votre logique ou modèle préféré afin qu'elle puisse être lue par l'outil d'annotation. Par exemple, il est possible de lire les étiquettes suivantes créées avec OpenCV avec un outil d'annotation, de modifier uniquement les parties nécessaires et de les utiliser pour un apprentissage en profondeur.
OpenCV shape detection - PyImageSearch
VoTT 2.1.0 est sorti en mai 2020 lorsque j'ai écrit l'article, mais il me semblait difficile de charger les annotations que j'avais faites car c'était trop sophistiqué et la structure du projet était compliquée. Par conséquent, cette fois, nous le chargerons avec l'ancienne version 1.7.2.
Utilisez VoTT 1.7.2. Téléchargez et installez `` vott-win.exe ''. Release 1.7.2 · microsoft/VoTT
Créez un dossier dans un emplacement approprié et collectez les images (JPG ou PNG) que vous souhaitez annoter directement en dessous.
Ici, le chemin complet du dossier est C: \ foo \ bar \ myproj
.
Pour VoTT 1.7.2, le fichier de projet correspondant sera nommé 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():
#Charger un projet existant
f = open(projfile, "r+")
data = json.load(f)
else:
#Créer un nouveau projet
f = open(projfile, "w")
data = {
"frames": {},
"framerate": "1",
"inputTags": "mrfk", #Liste de balises (séparées par des virgules)
"suggestionType": "track",
"scd": False,
"visitedFrames": [],
"tag_colors": ["#0cc7ff"] #Couleur de la zone (facultatif)
}
with f:
for imgfile in imgdir.glob("*.*"):
if imgfile.suffix.lower() in [".jpg ", ".png "]:
if imgfile.name in data["frames"]:
#Ignorer s'il y a une entrée
continue
else:
#S'il n'y a pas d'entrée, créez-en une nouvelle
frame = []
data["frames"][imgfile.name] = frame
#Obtenir la taille de l'image
img = Image.open(imgfile)
w, h = img.size
img.close()
#Listez les zones que vous avez détectées (provisoire)
points = [ #Listez les sommets dans l'ordre dans lequel ils sont connectés par les côtés
{"x": 0.0, "y": 0.0},
{"x": w, "y": 0.0},
{"x": w, "y": h},
{"x": 0.0, "y": h}
]
box = { #Rectangle externe
"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"], #Liste de balises à donner à la zone
})
frame.append(region)
#Sauvegarder le projet
f.seek(0)
json.dump(data, f)
Si vous exécutez ce qui suit à partir de l'invite de commande, la balise mrfk
sera ajoutée à toute la zone de chaque image.
python make_vott_project.py C:\foo\bar\myproj
Lancez VoTT 1.7.2, cliquez sur l'icône d'image et sélectionnez le dossier C: \ foo \ bar \ myproj
.
** Veuillez noter que le nom du fichier du projet est automatiquement déterminé à partir du nom du dossier. ** **
L'écran suivant est OK avec Continuer tel quel
Une étiquette est attachée à l'image entière. Vous pouvez changer l'image avec les boutons de 2 triangles pointant vers la gauche et de 2 triangles pointant vers la droite.
Si vous souhaitez modifier l'étiquette, sélectionnez Manipulation des régions en haut à gauche, puis faites glisser et déposez les quatre coins de la zone.
Vous pouvez écraser et enregistrer en sélectionnant Fichier → Enregistrer dans le menu. Vous devez lire le fichier json mis à jour et créer les données d'entraînement de manière appropriée.
#Listez les zones que vous avez détectées (provisoire)
Dans la partie de, entrez le résultat de la détection en `` points ''. Spécifiez les coordonnées de chaque sommet de la zone dans l'ordre dans lequel ils sont connectés par les côtés.
Par exemple, si vous souhaitez utiliser le code du didacticiel suivant OpenCV shape detection - PyImageSearch
frame = []
# loop over the contours
for c in cnts:
(Abréviation)
points = [{"x": p[0], "y": p[1]} for p in c]
(Abréviation)
frame.append(region)
Vous pouvez faire comme ça.
Si vous souhaitez spécifier une zone complexe qui n'est pas un rectangle
region.update({
"width": w,
"height": h,
"box": box,
"points": points,
"type": "rect",
"tags": ["mrfk"], #Liste de balises à donner à la zone
})
Cette partie
region.update({
"width": w,
"height": h,
"box": box,
"points": points,
"type": "polygon", #Changer ici
"tags": ["mrfk"], #Liste de balises à donner à la zone
})
Changez simplement pour. De cette façon, lorsque vous déplacez un sommet, l'autre ne bougera pas. Vous pouvez créer une forme non rectangulaire comme indiqué ci-dessous.
Tout d'abord, spécifiez le nom sous forme de chaîne séparée par des virgules à la place de `ʻinputTags`` ci-dessous.
data = {
"frames": {},
"framerate": "1",
"inputTags": "mrfk,chst,wide", #Liste de balises (séparées par des virgules)
"suggestionType": "track",
"scd": False,
"visitedFrames": [],
"tag_colors": ["#0cc7ff"] #Couleur de la zone (facultatif)
}
Pour les `` balises '' dans chaque zone, spécifiez une liste de balises (une liste de Python, pas une chaîne séparée par des virgules).
region.update({
"width": w,
"height": h,
"box": box,
"points": points,
"type": "rect",
"tags": ["mrfk", "chst"], #Liste de balises à donner à la zone
})
Comme vous pouvez le voir, il se reflète en bas à gauche de la fenêtre et dans l'info-bulle de l'image.
Si vous souhaitez subdiviser davantage la classe de résultat de détection d'objet existante, vous pouvez augmenter uniquement les `ʻinputTags`` et éditer la classe (tag) de chaque zone avec VoTT.
Si vous souhaitez changer la couleur de la zone ou la couleur du texte de la liste des balises en bas à gauche, vous pouvez spécifier la liste des couleurs dans tag_colors
ci-dessous.
data = {
"frames": {},
"framerate": "1",
"inputTags": "mrfk,chst,wide", #Liste de balises (séparées par des virgules)
"suggestionType": "track",
"scd": False,
"visitedFrames": [],
"tag_colors": ["#ff4040", "#ffff40", "#008000"] #Couleur de la zone (facultatif)
}
Vous pourrez mettre votre couleur préférée comme suit. (L'image est après l'édition de l'annotation par moi-même)
Recommended Posts