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
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
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.
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.
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.
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.
BOWImgDescriptorExtractor
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).
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.
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.