[PYTHON] [Reconnaissance d'image] Comment lire le résultat de l'annotation automatique avec VoTT

introduction

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.

Fonction d'apprentissage actif (VoTT)

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.

image.png OpenCV shape detection - PyImageSearch

Environnement de vérification

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.

procédure

Installation VoTT

Utilisez VoTT 1.7.2. Téléchargez et installez `` vott-win.exe ''. Release 1.7.2 · microsoft/VoTT

Préparation des données

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.

Création de résultats d'annotations automatiques

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

Comment éditer avec VoTT

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. ** ** image.png

L'écran suivant est OK avec Continuer tel quel image.png

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. image.png

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. image.png

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.

Personnaliser

Charger une annotation créée en externe telle que OpenCV

#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.

Spécifiez l'aire du polygone

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. image.png

Créer plusieurs balises

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. image.png

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.

Changer la couleur de l'étiquette

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) image.png

Recommended Posts

[Reconnaissance d'image] Comment lire le résultat de l'annotation automatique avec VoTT
Comment couper la partie inférieure droite de l'image avec Python OpenCV
J'ai essayé de trouver l'entropie de l'image avec python
Comment activer la lecture / écriture de net.Conn avec Golang pour annuler avec le contexte
Comment lire l'ensemble de données SNLI
Comment obtenir l'ID de Type2Tag NXP NTAG213 avec nfcpy
Comment faire une commande pour lire le fichier de paramètres avec pyramide
Considérez la vitesse de traitement pour déplacer le tampon d'image avec numpy.ndarray
[Linux] Comment désactiver la mise à jour automatique du fichier /etc/resolv.conf (AmazonLinux2)
Comment afficher le résultat de sortie de la commande man Linux dans un fichier
Comment surveiller l'état d'exécution de sqlldr avec la commande pv
Comment vérifier la version de Django
Comment lire les données de problème avec Paiza
Essayez d'imaginer les données d'élévation du National Land Research Institute avec Python
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
Lisez l'image du graphique avec OpenCV et obtenez les coordonnées du point final du graphique
Je souhaite arrêter la suppression automatique de la zone tmp dans RHEL7
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python
Comment calculer la volatilité d'une marque
Comment lire un fichier CSV avec Python 2/3
Comment trouver la zone du diagramme de Boronoi
J'ai essayé la reconnaissance d'image de CIFAR-10 avec Keras-Learning-
Coupez l'image aux coins arrondis avec pythonista
Comment coder un drone en utilisant la reconnaissance d'image
J'ai essayé la reconnaissance d'image de CIFAR-10 avec la reconnaissance d'image Keras-
[Python] Comment lire des fichiers Excel avec des pandas
Comment recadrer une image avec Python + OpenCV
Comment essayer l'algorithme des amis d'amis avec pyfof
J'ai essayé de corriger la forme trapézoïdale de l'image
Comment lire un tableau avec ConfigParser de Python
Comment spécifier des attributs avec Mock of Python
Comment implémenter "named_scope" de RubyOnRails avec Django
Comment afficher dans toute la fenêtre lors de la définition de l'image d'arrière-plan avec tkinter
Liste de contrôle pour éviter de transformer les éléments de array of numpy avec for
Remarque: Comment obtenir le dernier jour du mois avec python (ajouté le premier jour du mois)
Comment entraîner Kaldi avec JUST Corpus
Comment obtenir une liste de fichiers dans le même répertoire avec python
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
Comment lire des données originales ou des données externes sur Internet avec scikit-learn au lieu d'un ensemble de données attaché tel que l'iris
L'arrière-plan des caractères de l'image texte est surexposé pour faciliter la lecture.
Comment identifier l'élément avec le plus petit nombre de caractères dans une liste Python?
Comment démarrer avec Visual Studio Online ~ La fin de l'ère de la construction d'environnement ~
Un mémo sur la façon de surmonter le problème difficile de la capture d'effets avec l'IA
Comment compter le nombre d'occurrences de chaque élément de la liste en Python avec poids
Comment changer l'image générée de GAN en une image de haute qualité à votre goût
Le 15e temps réel hors ligne, j'ai essayé de résoudre le problème de l'écriture avec python
Lire la source Python-Markdown: Comment créer un analyseur
Comment connaître le numéro de port du service xinetd
Extraire le tableau des fichiers image avec OneDrive et Python
Comment supprimer la chaîne de caractères spécifiée avec la commande sed! !! !!
Comment obtenir le nombre de chiffres en Python
Comment récupérer des données d'image de Flickr avec Python
Je veux grep le résultat de l'exécution de strace
Ajoutez des informations au bas de la figure avec Matplotlib
[Introduction à Python] Comment itérer avec la fonction range?
Comment créer un sous-menu avec le plug-in [Blender]