Cet article est un compte rendu de recherches gratuites pendant les vacances d'été par Alafor Engineer. J'ai mis au défi de classer les images de guitare en utilisant CNN. Il n'y a pas beaucoup d'histoires techniquement nouvelles, mais il semble peu probable qu'il y ait un cas de guitare comme sujet, donc je publierai les résultats d'une manière ou d'une autre.
C'est un ordinateur personnel à la maison.
Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz
Memory: 32GB
Geforce GTX 1080 (Founders Edition)
Ubuntu 16.04
Python 3.5.3
Keras(backend: Tensorflow)
L'ensemble de données a été extrait d'une recherche sur le Web et modifié manuellement dans diverses étiquettes. Il existe 13 types d'étiquettes ci-dessous.
La raison pour laquelle les étiquettes sont biaisées vers le modèle solide Fender / Gibson est qu'il est arrivé qu'il était facile de se procurer des images étiquetées, donc il n'y a pas de signification profonde.
Cette fois, 250 images pour chaque classe seront préparées, 50 sélectionnées au hasard parmi elles seront utilisées comme échantillons de vérification et les 200 autres seront utilisées comme échantillons d'apprentissage.
Keras a 50 couches de ResNet comme préréglage (?), J'ai donc décidé de l'utiliser pour le moment.
Puisqu'il s'agit d'un modèle de classification de 1000 classes tel quel, la couche entièrement connectée est excisée (include_top = False
) et la couche entièrement connectée pour la classification souhaitée est jointe. La partie commune est un minimum, entièrement connecté 1 couche + Softmax.
resnet = ResNet50(include_top=False, input_shape=(224, 224, 3), weights="imagenet")
h = Flatten()(resnet.output)
model_output = Dense(len(classes), activation="softmax")(h)
model = Model(resnet.input, model_output)
Ici, si vous définissez weights =" imagenet "
, le résultat de l'entraînement utilisant ImageNet sera défini comme valeur initiale du poids. En commençant à apprendre à partir de cet état, cela devient un réglage fin, c'est-à-dire un apprentissage par transfert. À propos, cette fois, nous ne gelerons pas les couches entraînées, mais mettrons à jour les poids de toutes les couches pendant l'entraînement.
Avec weights = None
, les poids sont initialisés avec des nombres aléatoires. En d'autres termes, vous apprendrez à partir de zéro sans transitions.
Cette fois, j'ai expérimenté avec et sans métastases.
Puisqu'il y a relativement peu d'images échantillons, il est nécessaire de gonfler les données pour la formation. Cette fois, nous implémentons l'augmentation des données à l'aide de ImageDataGenerator de Keras.
train_gen = ImageDataGenerator(
rotation_range=45.,
width_shift_range=0.2,
height_shift_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
vertical_flip=True)
train_flow = train_gen.flow_from_directory(
directory="./image/train",
batch_size=32,
target_size=(224, 224),
classes=[_["key"] for _ in classes]
)
Il est très facile de gonfler les données d'entraînement par conversion Affin. ~~ De plus, le chargement du fichier image + Augmentation est une belle spécification qui fonctionne en parallèle et asynchrone avec l'apprentissage. Personnellement, je pensais que cela valait la peine d'utiliser Keras. ~~ </ font>
** Ajouts / corrections: ** Dans Keras, le prétraitement des données s'exécute en parallèle et de manière asynchrone avec l'apprentissage [fonction du moteur d'apprentissage Keras (à l'aide de OrderedEnqueuer / GeneratorEnqueuer dans fit_generator)](https://github.com/fchollet/keras/ blob / 135efd66d00166ca6df32f218d086f98cc300f1e /keras/engine/training.py#L1834-L2096), qui n'était pas une fonction fournie par ImageDataGenerator. C'était une expression trompeuse en raison de mon malentendu, je vais donc la corriger.
Pour l'optimisation, Momentum + SGD a été adopté à la suite de l'article original de ResNet.
optimizer = SGD(decay=1e-6, momentum=0.9, nesterov=True)
J'ai aussi essayé Adam etc., mais comme on le dit dans la rue, Momentum + SGD était excellent pour ResNet.
Cette fois, nous vérifierons l'exactitude de la vérification pour chaque étape, avec 1000 mini-lots d'apprentissage de 32 échantillons en une seule étape. La formation est interrompue lorsque la précision de la vérification a convergé. (Arrêt anticipé)
es_cb = EarlyStopping(patience=20)
Voyons le résultat.
Premièrement, dans le cas de l'apprentissage par transfert. La transition de la précision est comme ça.
Le bleu est la courbe d'apprentissage et l'orange la courbe de vérification.
La précision de vérification flotte, mais en 36 étapes, la précision d'apprentissage est de 99,9% et la précision de vérification est de 100%. Après cela, la précision augmentera ou diminuera, mais pour le moment, nous utiliserons cet instantané de la 36e étape comme livrable. À propos, il a fallu environ 5 heures pour effectuer 36 étapes.
Par contre, lorsqu'il n'y a pas de transfert.
Par rapport à l'apprentissage par transfert, la progression de l'apprentissage est lente et la précision n'est pas bonne. Le meilleur score est une précision d'apprentissage de 99% et une précision de vérification de 84%. On peut constater qu'il existe un écart important de précision entre la formation et la vérification, et que les performances de généralisation du modèle sont faibles.
L'effet de l'apprentissage par transfert est énorme.
J'ai pris une photo de ma guitare et j'ai essayé de deviner. J'ai utilisé le modèle avec transfert.
Jazzmaster
LesPaul
** Akogi **
Cela semble fonctionner correctement.
Qu'en est-il d'une guitare qui ne figure pas dans les données d'entraînement?
Duo Sonic
C'est un résultat convaincant car il s'agit du même modèle étudiant que Mustang.
** Guitare mystérieuse avec haut-parleur intégré (fabriquée par Crews, modèle inconnu) **
Cela ne ressemble pas à Jaguar. Alors c'est difficile de dire à quoi ça ressemble, mais j'ai l'impression que Les Paul et Telecaster sont encore plus proches. Il semble que la manière de comprendre les caractéristiques soit un peu différente de celle des humains.
Enfin, jouons un peu avec.
Si vous griffonnez un peu sur Jazzmaster avec l'outil de peinture, ...
Pour une raison quelconque, Flying V. Hmm. .. Je me demande où j'ai regardé et où j'ai pensé.
J'ai essayé la reconnaissance d'image avec Deep Learning pour la première fois, et c'était plus précis que prévu. Il existe de nombreux cas où le marquage et la classification des produits sont incorrects sur le site de la CE et le site de vente aux enchères d'instruments de musique, donc je pense que vous devriez le vérifier à cause de cela.
Il a également été confirmé que l'apprentissage par transfert à partir d'un modèle général de classification d'images est efficace pour la classification d'images d'un domaine spécifique.
D'autre part, nous avons pu confirmer le problème du Deep Learning qu'il est difficile de corriger les erreurs de classification car nous ne connaissons pas les critères de base et de jugement de la sortie. Ce modèle montre l'instabilité que si l'entrée idéale (image sans bruit) peut être classée avec une grande précision, le jugement change considérablement avec une petite quantité de bruit. En ajoutant intentionnellement du bruit à l'entrée pendant l'entraînement, il semble qu'un modèle plus robuste puisse être généré, alors j'aimerais l'essayer si j'ai le temps. (⇒ Je l'ai essayé.) Il semble y avoir une technique appelée Grad-CAM qui estime le point d'intérêt du modèle, alors j'aimerais l'essayer ensemble et voir les changements.
J'ai utilisé ResNet-50 comme modèle cette fois, mais j'ai le sentiment (d'une manière ou d'une autre) qu'un modèle plus léger peut faire ce genre de tâche de classification, j'ai donc utilisé un réseau peu profond en réseau pour réduire le modèle par distillation. Je veux aussi contester.
Recommended Posts