[PYTHON] [Détection d'anomalies] Détecter la distorsion de l'image par apprentissage à distance

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.

image.png

De la conclusion

Prise en compte de l'image

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.

ダウンロード.png

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.

Génération automatique de "données de distorsion"

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

image.png

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]

S'applique aux lieux significatifs

Cependant, il est inutile de faire pivoter une partie de ** l'image d'arrière-plan **.

image.png

Par conséquent, nous avons implémenté un algorithme qui détecte automatiquement un objet.

image.png

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.

image.png

J'ai une image déformée.

Procédure de cette méthode

Expérience

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.

conditions

Résultats AUC

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.

image.png

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.

image.png

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.

image.png

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.

Visualisation des résultats

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.

ダウンロード (1).png

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.

image.png

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.

Expérience (édition supplémentaire)

Enfin, changeons le modèle de base (MobileNetV2 → EfficentNetB0).

conditions

Les conditions sont presque les mêmes que dans l'expérience précédente. Les différences sont les suivantes.

Résultats AUC

image.png

Dans Screw, l'ASC est inférieure à 0,5 même en classe 2.

image.png

Avec Grid, le résultat est similaire à MobileNet V2. Après tout, ** class3 donne un meilleur score. ** **

image.png

Avec Transistor, le résultat est similaire à MobileNet V2. Après tout, vous obtiendrez un meilleur score si vous utilisez class3.

Résumé des résultats expérimentaux

Comparons les résultats jusqu'à présent par la valeur médiane.

image.png

À 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ération (Pourquoi l'ASC de Screw a-t-elle diminué?)

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

image.png

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.

Résumé

Recommended Posts

[Détection d'anomalies] Détecter la distorsion de l'image par apprentissage à distance
Apprentissage profond appris par la mise en œuvre ~ Détection d'anomalies (apprentissage sans enseignant) ~
Détection d'objets par apprentissage profond pour comprendre en profondeur par Keras
[Détection d'anomalies] Essayez d'utiliser la dernière méthode d'apprentissage à distance
Détection de valeur anormale par apprentissage non supervisé: distance Maharanobis (implémentation)
Détection de valeur anormale par apprentissage non supervisé: distance de Maharanobis (théorie)
Reconnaissance d'image par apprentissage profond 1 théorie
J'ai essayé d'implémenter la détection d'anomalies par apprentissage de structure clairsemée
Apprentissage profond appris par l'implémentation 1 (édition de retour)
Implémentation du modèle de reconnaissance d'images d'apprentissage en profondeur 2
[AI] Apprentissage en profondeur pour le débruitage d'image
Modèle de reconnaissance d'image utilisant l'apprentissage profond en 2016
Produisez de belles vaches de mer par apprentissage profond
Détection d'anomalies à l'aide de MNIST par Autoencoder (PyTorch)
Détection d'anomalies des données ECG par profil matriciel
Alignement d'image: du SIFT au deep learning
[Apprentissage en profondeur] Détection de visage Nogisaka ~ Pour les débutants ~
Reconnaissance d'image en apprentissage profond 3 après la création du modèle
L'apprentissage en profondeur
Chainer et deep learning appris par approximation de fonction
Lire et mettre en œuvre l'apprentissage résiduel profond pour la reconnaissance d'image
99,78% de précision avec apprentissage en profondeur en reconnaissant les hiragana manuscrits
Interpolation d'images vidéo par apprentissage en profondeur, partie 1 [Python]
Apprentissage parallèle du deep learning par Keras et Kubernetes
Implémentation du modèle Deep Learning pour la reconnaissance d'images
Apprentissage profond appris par mise en œuvre (segmentation) ~ Mise en œuvre de SegNet ~