Il existe de nombreuses recherches sur la détection d'anomalies d'image à l'aide de l'apprentissage en profondeur.
En tant qu'approche pour détecter les produits anormaux en utilisant uniquement des données normales pour les produits industriels, Jusqu'à présent, l '[Apprentissage par l'auto-apprentissage] de @ daisukelab (https://qiita.com/daisukelab/items/e0ff429bd58b2befbb1b) est le plus influent. dans cette étude En tant que problème, la précision de certaines images était lente et j'ai fait un essai et une erreur sur la façon de créer des données de classe anormales **. Il y a eu un commentaire.
Par conséquent, dans cet article, j'aimerais explorer ** diverses ** méthodes de génération automatique pour les images anormales.
Des recherches antérieures ont réussi à détecter de nombreux défauts dans une méthode très simple. De plus, le code fasi.ai de @ daisukelab est très propre et lisible. Si vous souhaitez détecter des anomalies dans les images, nous vous recommandons de la lire.
Dans des études précédentes, l'ASC était inférieure à 0,9 pour les quatre données de vis, transistor, grille et pilule de MVtech AD. En conséquence, c'était un contenu d'essais et d'erreurs.
Cette fois, je voudrais cibler des données autres que Pill. Les trois données autres que Pill sont les suivantes.
En regardant l'image anormale, il y a beaucoup de choses qui ** "déforment" plutôt que des rayures et de la saleté, et cette détection est Puisqu'il est difficile, on suppose que l'AUC est difficile à développer.
Par conséquent, nous rechercherons une méthode pour générer automatiquement des ** "données de distorsion" à partir de données normales ** et améliorer les performances de détection des anomalies.
Il semble y avoir différentes méthodes pour créer des données de distorsion, mais dans cet article, nous expliquerons comment faire pivoter une partie de l'image. Je l'ai adopté.
C'est facile à faire avec le générateur de données de Keras.
from keras.preprocessing.image import ImageDataGenerator
small_fig = fig[begin1:end1,begin2:end2]
datagen = ImageDataGenerator(
rotation_range=30,
width_shift_range=0.2,
height_shift_range=0.2,
horizontal_flip=False,
vertical_flip=False)
for d in datagen.flow(np.expand_dims(small_fig, axis=0), batch_size=1):
# datagen.Puisque le flux boucle à l'infini, il sort de la boucle
break
fig[begin1:end1,begin2:end2] = d[0]
Cependant, il est inutile de faire pivoter une partie de ** l'image d'arrière-plan **.
Par conséquent, nous avons implémenté un algorithme qui détecte automatiquement un objet.
Avec Screw etc., la direction et la position de l'éprouvette sont légèrement différentes dans les données d'entraînement. D'autre part, si les données d'apprentissage sont moyennées, une image dans laquelle l'éprouvette disparaît peut être obtenue. (2.Training data average)。
Après cela, la différence entre l'image moyenne et l'image cible est prise et binarisée (carte binaire). Ce faisant, la portée de l'éprouvette peut être détectée automatiquement. Lors de l'exécution de la détection automatique Si vous faites pivoter une partie de l'image, vous obtiendrez l'image suivante.
J'ai une image déformée.
Des expériences ont été menées à l'aide de MVtech AD. J'ai mis tout le code ici [https://github.com/shinmura0/AutoEncoder_vs_MetricLearning/blob/master/AnomalyDetection_self_supervised.ipynb). Il peut être exécuté dans Colab.
Dans les résultats expérimentaux, la classe 2 (deux classes, «normal» et «anormal avec une ligne») est la ligne de base, class3 (classe 2 + "anomalie déformée") est la méthode proposée.
Dans Screw, l'ASC diminue lorsque la méthode proposée (class3) est appliquée à class2. C'est parti. La raison de ce déclin sera discutée plus tard.
Dans Grid, comme prévu, la méthode proposée (classe3) est meilleure que la ligne de base (classe2). L'AUC a augmenté. Je pense que j'ai pu détecter la distorsion alors que je visais. Pièce anormale détectée Nous vérifierons que cela se fait par visualisation.
Dans Transistor, l'ASC augmentait lorsque la méthode proposée (class3) était appliquée comme dans Grid. Une amélioration de 0,1 ou plus peut être confirmée pour ArcFace.
Comme le montre Recherches précédentes, j'ai également essayé de visualiser la partie anormale par Grad-CAM. Cependant, il est basé sur "AdaCos". Par conséquent, il existe deux classes anormales, J'utilise Grad-CAM dans chaque classe.
Il y a d'abord les données Grid.
La visualisation de "Distorsion" s'adapte bien à toutes les données. Cependant, s'il y a plusieurs anomalies, il semble qu'une seule puisse être détectée.
Vient ensuite le transistor.
Dans Transistor, la visualisation de "Slight line" convient bien à la plupart des données. Le résultat est le contraire de Grid. Quelle classe d'anomalies doit être vue ici, en fonction du type de données Cela peut changer.
Enfin, changeons le modèle de base (MobileNetV2 → EfficentNetB0).
Les conditions sont presque les mêmes que dans l'expérience précédente. Les différences sont les suivantes.
Dans Screw, l'ASC est inférieure à 0,5 même en classe 2.
Avec Grid, le résultat est similaire à MobileNet V2. Après tout, ** class3 donne un meilleur score. ** **
Avec Transistor, le résultat est similaire à MobileNet V2. Après tout, vous obtiendrez un meilleur score si vous utilisez class3.
Comparons les résultats jusqu'à présent par la valeur médiane.
À l'exclusion de la vis, lorsque ** la méthode proposée (classe3) est appliquée à la ligne de base (classe2), l'ASC augmente ** Tu peux vérifier. En outre, en ce qui concerne les types d'enseignement à distance, il semble qu'il y ait une telle différence. Je ne peux pas le voir, mais ArcFace affiche un score relativement bon.
La différence d'AUC par le modèle CNN semble être bonne pour EfficientNet B0, qui a atteint une AUC de 0,9 ou plus. L'application d'EfficientNetB7 ou quelque chose peut augmenter l'AUC de manière plus significative (bien que dans l'image) La taille minimale semble être de 600 x 600. lourd. À propos, B0 est de 224 x 224. )
Considérez la cause de l'ASC inférieure de la vis.
En termes simples, en ajoutant la classe "Distorted Anomaly" ** La distorsion "Large" est considérée comme anormale Détectable **, mais ** les "petites" distorsions sont désormais reconnues comme presque normales ** Il semble que ce soit devenu.
Dans la classification en deux classes de la recherche précédente, en traçant une ligne fine, non seulement les rayures et la décoloration, mais aussi la pointe de la vis En traçant une ligne, j'ai pu simuler une "petite" distorsion. Cependant, la troisième classe Avec l'introduction, la tâche de CNN devient plus difficile.
Jusqu'à présent, dans la classification à deux classes, la "petite" distorsion était une classe de ligne plutôt mince. D'autre part, en raison de la classification en trois classes, ** l'extraction de quantité spéciale de CNN est spécialisée dans la détection de ligne et la détection de rotation, ** La "petite" distorsion semble être proche de la classe normale. En conséquence, la diminution de l'ASC Il est présumé qu'il a été invité.
La figure ci-dessus est un diagramme dans lequel Grad-CAM est appliqué à AdaCos (class3) formé par Screw. Toutes les images C'est une image anormale. Comme vous pouvez le voir, aucune petite distorsion à l'extrémité de la vis n'a été détectée.
De plus, si vous passez de MobileNetV2 à EfficientNetB0, l'AUC sera de 0,5 même si elle est class2. Le résultat était inférieur. En effet, EfficientNetB0 peut extraire des fonctionnalités plus clairement. Le résultat est que l'extraction de caractéristiques des «lignes fines» est trop réussie et que la «petite» distorsion se rapproche de la normale. Il semble que cela ait été fait.
Alors, n'est-il pas possible de simuler une "petite" distorsion en réduisant la plage de rotation partielle? Cependant, si la plage est rendue trop petite, elle ne peut pas être détectée par CNN et l'apprentissage ne se poursuivra pas du tout. Devenir.
Pour améliorer cela, augmentez la résolution de l'image ou alignez l'orientation du produit de test. Il est nécessaire de concevoir une image spéciale. Comme mentionné dans Études antérieures, Si des données anormales sont disponibles, vous pouvez également regarder de près l'image et l'analyser. Cela semble efficace.
Comme procédure recommandée, tout d'abord, classer en 2 classes par auto-apprentissage. ensuite, Si vous essayez 3 classifications et que l'AUC s'aggrave, analysez bien l'image. Ce sera un processus.
Recommended Posts