[PYTHON] Créer un identifiant Santa à partir d'une image du Père Noël

introduction

L'humanité de tous, Bonjour. Je suis Yaguchi, qui est en charge du logiciel pour Virtual YouTuber Hiro Rinkai.

Cette fois, j'expliquerai le contenu de la vidéo, "Santa Identifier".

v C'est un lien de vidéo YouTube. Veuillez le regarder si vous le souhaitez et vous abonner à la chaîne si vous l'aimez. v

[Hiro Rinkai] Puis-je devenir Père Noël avec un classificateur Père Noël?

Le code source est disponible sur github. C'est un code très court, alors jetez-y d'abord un œil.

https://github.com/hyaguchi947d/santa_recognition

Problème de réglage

Comme problème, je l'ai réglé pour "faire la distinction entre les illustrations du Père Noël et celles qui ne sont pas du Père Noël". Étant donné que nous finissons la vidéo une fois par semaine, nous n'avons qu'un jour pour créer, coder et valider l'ensemble de données. Concevez donc avec le minimum.

Ensemble de données d'image

C'est la partie la plus difficile. Parce que nous sommes une société commerciale et que la publication de vidéos est une activité de vente. En d'autres termes, n'utilisez rien d'autre que des données clairement identifiées comme disponibles dans le commerce.

Donc, tout d'abord, je l'ai fait avec 20 feuilles basées sur les règles de "Irasutoya". Puisque les données sont trop biaisées, nous les avons ajoutées à partir de "Pixabay" et de "Material Good". Au final, il y avait un total de 58 feuilles de 29 + 29.

De plus, les données positives et négatives ont été divisées en train: test = 22: 7. Dans ce cas également, les données de la source de distribution sont divisées afin qu'elles ne soient pas biaisées.

Veuillez noter que nous ne redistribuons ni ne lions les ensembles de données car ils enfreignent les règles.

Sur la méthode à adopter

J'avais décidé de supprimer le contenu de la vidéo en trois étapes, donc L'histogramme de couleur le plus simple au début, Le dernier est YOLO v3, que j'ai utilisé pour l'apprentissage en profondeur. C'est l'un des milieux, mais j'étais perdu avec HOG, mais j'ai choisi Bag of Visual Words. Afin de minimiser le contenu de l'écriture de code par vous-même Ce qui peut être implémenté avec OpenCV en une heure environ, Ou il y avait une condition qu'il pouvait être exploité sans le mettre en œuvre.

la mise en oeuvre

Histogramme des couleurs

Le problème posé est une simple classification à deux classes. Quoi qu'il en soit, tant que vous pouvez obtenir l'histogramme des couleurs Le reste peut être jugé par SVM.

Donc, je vais le faire rapidement avec OpenCV Python et scikit-learn.

Il existe un tutoriel sur la façon de prendre un histogramme de couleurs dans OpenCV. https://docs.opencv.org/master/dd/d0d/tutorial_py_2d_histogram.html

SVM propose également un didacticiel facile à comprendre sur scikit-learn. https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html

Ce que vous faites est très simple

def color_hist_from_file(imgfile):
    img = cv.imread(imgfile)
    hist = cv.calcHist([img], [0, 1, 2], None, [8, 8, 8], [0, 256, 0, 256, 0, 256])
    hist_1d = hist.flatten()[1:-1]  # remove bins with (0,0,0) and (255,255,255)
    n_hist_1d = hist_1d / np.linalg.norm(hist_1d)
    return n_hist_1d

Dans cette fonction, un histogramme (8 * 8 * 8 = 512 dimensions) qui divise chaque canal bgr en 8 est généré. Le vecteur de 510 dimensions sans le premier et le dernier bac (noir et blanc, car c'est la couleur d'arrière-plan) est normalisé et utilisé comme vecteur de classification.

L'apprentissage SVM est une liste d'exemples positifs et négatifs, Générez une liste d'étiquettes correspondant à chacun (1 et 0 cette fois).

trains = hist_train_p + hist_train_n
labels = [1] * len(hist_train_p) + [0] * len(hist_train_n)

clf = svm.SVC()
clf.fit(trains, labels)

Seulement ça.

Bag of Visual Words

Il n'y avait pas de tutoriel OpenCV décent.

Cependant, comme il s'agit d'un algorithme que j'ai implémenté par moi-même, le pire est en quelque sorte J'ai pensé, mais j'étais un peu inquiet et je pouvais utiliser celui d'OpenCV.

Cet article a été utile. https://hazm.at/mox/machine-learning/computer-vision/recipes/similar-image-retrieval.html

De plus, AKAZE est utilisé pour les points caractéristiques. En effet, SIFT et SURF sont protégés par des brevets. (Je pense que cette histoire se répétera dans trois mois, mais à ce moment-là.)

En tant que procédure, --Calculer les points clés et les descripteurs des points caractéristiques AKAZE de l'image de l'enseignant --Ajoutez des descripteurs à BOWKMeansTrainer et créez un dictionnaire.

YOLO v3

J'ai utilisé darknet. c'est tout.

Au fait, j'utilisais la VoTT pour générer des ensembles de données, Depuis qu'il est devenu v2, les données YOLO n'ont pas pu être générées, La V1 a eu du mal avec elle car elle était boguée (en quelque sorte une fuite d'une image annotée).

À propos des résultats expérimentaux

Histogramme des couleurs

En fait, si vous prenez juste un histogramme + faites SVM, Même si la luminosité est légèrement différente à la partie limite, elle entrera dans le bac adjacent, Dans certains cas, la similitude était extrêmement faible. Ou placez les bacs de sorte qu'ils se chevauchent un peu Les bacs adjacents sont proches les uns des autres et des mesures sont nécessaires, mais il n'y avait pas de temps.

Par conséquent, j'envoie une illustration de Santa Hiro, qui fait l'objet d'une identification. Quand j'ai écrit pour la première fois les vêtements du Père Noël en FF0000, je n'étais plus le Père Noël. J'ai ajusté un peu la couleur et l'ai changée en DD0000.

Bag of Visual Words

Au début je ne le faisais qu'en échelle de gris, J'ai créé trois BoVW séparément pour chaque canal RVB et je l'ai fait avec un canal concaténé. Les résultats sont pratiquement inchangés.

L'une des raisons pour lesquelles je me suis perdu avec HOG est Parce qu'il y avait beaucoup de graphiques vectoriels (Hiro Rinne c'est aussi des graphiques vectoriels) Je pensais que le bord aurait un avantage.

Comme indiqué dans la vidéo, Je pense que c'était simplement une question de style que je ne pouvais pas bien identifier.

YOLO v3

Comme l'a indiqué le responsable de la voix dans la vidéo, J'aurais aimé me séparer ici.

Au fait, au début, j'ai essayé d'identifier une seule classe de Père Noël, Avec cela, il est devenu un détecteur d'illustration humanoïde qui détecte également tous ceux qui ne sont pas le Père Noël. J'avais appris environ 30000 époques pendant 20 heures jusqu'à présent, mais je l'ai jeté une fois et J'ai fait 2 cours et j'ai recommencé à environ 20000 pendant 15 heures. (Expérimentalement, 20000 époques suffisent pour les performances de discrimination) Cependant, cela ne prend pas vraiment beaucoup de temps car j'attends juste.

Encore une fois, j'ai réalisé que les couleurs ne sortaient pas tellement.

en conclusion

Tant que nous l'introduisons dans le programme hebdomadaire Je n'ai pas eu le temps d'être d'accord avec ça, mais N'importe quel résultat, j'ai dû mettre une punch line comme divertissement Le script lui-même a été écrit de sorte qu'il puisse tomber dans n'importe quel résultat. Cependant, il n'est pas possible d'envoyer des choses inexactes ou bâclées, donc J'ai essayé de contenir suffisamment de contenu pour donner une conférence dans un délai de 10 minutes.

Comme prévu, il est difficile de fournir cette densité chaque semaine L'histoire de la technologie apt peut durer environ une fois par mois, Nous nous réjouissons de votre soutien continu à Hiro Rinkai.

Recommended Posts

Créer un identifiant Santa à partir d'une image du Père Noël
python / Créer un dict à partir d'une liste.
Créez un classificateur en cascade avec Google Colaboratory
Premier classificateur d'images
Faisons un jeu de squash
Faire une copie d'un fichier Google Drive à partir de Python
Tutoriel [PyTorch] (version japonaise) ④ ~ FORMATION D'UN CLASSIFICATEUR (classification d'images) ~
Générer une image verticale d'un roman à partir de données textuelles
Faire un décorateur de fonction
Texte extrait de l'image
Faire une matrice de distance
Je vais créer un mot de passe!
Faisons un service de vente au comptant 8 (édition de téléchargement d'image)
Comment prendre une image capturée à partir d'une vidéo (OpenCV)
Créer un bouton Nyan
Créez un jeu à la Tetris!
Créer un décodeur Base64
Récupérer une image d'une page Web et la redimensionner
Créer une animation gif à partir d'un fichier de numéro de série avec matplotlib
Essayez de créer un pod Kubernetes à partir d'une image GitLab Container Registry
Créer une instance GCE à partir d'une image Docker GCR à l'aide de terraform
Faisons un robot Discord.
Créer un backend Blueqat ~ Partie 1
Créer un backend Blueqat ~ Partie 2
Rendre MeCab disponible à partir de Python 3
Supprimer le cadre de l'image
[Tutoriel PyTorch ④] FORMATION D'UN CLASSIFICATEUR
[Django] Créer un menu déroulant
Créer un LINE BOT (chat)
Créer un bookmarklet en Python
Faites une loterie avec Python
Faire de Responder un démon (service)
Faire un feu avec kdeplot
L'image est Namekuji
Faire une impression de forage de calcul
Recherche par image de la pellicule en utilisant Pythonista3
Faisons un livre Kindle qui visualise des formules mathématiques à partir de fichiers TeX
Essayez d'extraire une chaîne de caractères d'une image avec Python3
Comment créer une bibliothèque .dylib à partir d'une bibliothèque .a avec OSX (El Capitan)
Faire une demande de Device Farm (appium python) à API Gateway
Je souhaite créer une liste de paramètres à partir du code CloudFormation (yaml)
J'ai essayé de couper une image fixe de la vidéo
Comment créer un ensemble de données d'image de visage utilisé dans l'apprentissage automatique (3: Génération d'images de visage à partir d'images candidates, partie 1)