Dans les processus de fabrication industrielle, l'assurance qualité est un sujet important. Par conséquent, les petits défauts survenant au cours de la production doivent être détectés de manière fiable. C'est l'objectif de la détection d'anomalies, qui consiste à détecter les modèles anormaux et défectueux qui diffèrent des échantillons normaux. Ce problème se heurte à un certain nombre de difficultés particulières :
Ces défis rendent la formation d'un classificateur traditionnel difficile et nécessitent des méthodes spéciales pour les résoudre.
Les méthodes non supervisées de détection et de localisation des anomalies peuvent être classées en deux catégories : les méthodes discriminatives et les méthodes génératives.
Les méthodes discriminatives tentent de modéliser la limite de décision entre les échantillons anormaux et les échantillons nominaux. En règle générale, ces méthodes extraient les données d'intégration d'une image et les comparent aux données d'intégration de référence des "bonnes" images. La distance est utilisée comme score d'anomalie. Ces méthodes donnent des résultats satisfaisants pour la détection des anomalies, mais manquent souvent d'interprétabilité, car on ne sait pas quelle partie de l'image est à l'origine de l'anomalie. SPADE est un exemple de méthode de ce type, qui exécute le regroupement K-nearest neighbor (K-NN) sur l'ensemble complet des vecteurs d'intégration au moment du test. Cela signifie que la complexité de l'inférence augmente linéairement avec la taille de l'ensemble d'apprentissage. Une vitesse d'inférence élevée est souvent importante dans la fabrication, ce qui réduit considérablement l'utilité de cette méthode.
Les méthodes génératives tentent de modéliser la distribution réelle de chaque classe, qui peut ensuite être échantillonnée, par exemple pour générer de nouvelles images. Les approches de détection des anomalies qui utilisent ces modèles reposent sur l'idée que les anomalies ne peuvent pas être générées puisqu'elles n'existent pas dans l'ensemble d'apprentissage. Les approches basées sur les autoencodeurs tentent de détecter les anomalies en comparant la sortie d'un autoencodeur à son entrée. Une erreur de reconstruction élevée devrait indiquer une région anormale. Les approches basées sur le GAN supposent que seuls des échantillons positifs peuvent être générés. Bien que ces méthodes génératives soient très intuitives et interprétables, leurs performances sont limitées par le fait qu'elles obtiennent parfois de bons résultats de reconstruction pour les images anormales également.
Cette section examine plus en détail trois méthodes de pointe. Deux approches discriminatives et une approche générative sont décrites. Ces méthodes ont été choisies parce qu'elles représentent l'état de l'art en matière de détection d'anomalies tout en disposant d'une mise en œuvre pratique.
Avant le PaDiM, plusieurs approches discriminatives ont été proposées, qui nécessitent l'entraînement de réseaux neuronaux profonds, ce qui peut être fastidieux, ou qui utilisent le K-NN sur un grand ensemble de données, ce qui réduit considérablement la vitesse d'inférence. Ces deux défis pourraient entraver le déploiement des algorithmes dans un environnement industriel. La modélisation de la distribution des patchs (PaDiM) vise à résoudre ces problèmes. Elle utilise un CNN pré-entraîné (ResNet, Wide-ResNet ou EfficientNet) pour l'extraction de l'encastrement sur la base de la classification ImageNet. L'image est divisée en parcelles et les encastrements sont extraits pour chaque parcelle. PaDiM utilise toutes les couches du CNN pré-entraîné. Cela permet de capturer à la fois les contextes globaux et les détails les plus fins. Comme il peut y avoir beaucoup d'informations redondantes, les encastrements sont sous-échantillonnés par sélection aléatoire. Il est intéressant de noter que cette méthode fonctionne aussi bien que les techniques de réduction de la dimensionnalité telles que l'ACP, tout en étant plus rapide. L'hypothèse est que tous les vecteurs d'intégration sont échantillonnés à partir d'une distribution gaussienne multivariée. Ils estiment la moyenne de l'échantillon et les paramètres de covariance de l'échantillon de cette distribution pour chaque parcelle. Il en résulte que chaque parcelle de l'ensemble des images d'apprentissage est décrite par une distribution gaussienne multivariée.
Le score d'anomalie pendant l'inférence est maintenant attribué sur la base de la distance de Mahalanobis entre l'intégration d'un patch de test et la distribution apprise pour l'emplacement de ce patch. Le score d'anomalie final est le maximum de la carte d'anomalie. Le résultat est un algorithme qui n'a pas le problème d'extensibilité des méthodes basées sur le KNN car il n'est pas nécessaire de trier un grand nombre de valeurs de distance pour obtenir le score d'anomalie d'un patch.
Comme PaDiM, PatchCore divise les images en parcelles. L'idée de PatchCore est que si un seul patch est anormal, l'image entière peut être classée comme anormale. PatchCore tente de résoudre les mêmes problèmes que PaDiM. L'objectif de PatchCore est triple :
Au cours de l'apprentissage, les encastrements sont extraits à l'aide d'un CNN pré-entraîné, sous-échantillonnés à l'aide d'un sous-échantillonnage par noyaux et stockés dans une banque de mémoire. Lors de l'inférence, une recherche du plus proche voisin est effectuée dans la banque de mémoire. Cette architecture est décrite dans l'image ci-dessous.
Jusqu'à présent, nous avons parlé des modèles discriminatifs. Le dernier modèle de cette comparaison est d'un type différent : il s'agit d'un modèle génératif. Un modèle génératif indique la probabilité d'occurrence d'un exemple donné. Par exemple, les modèles qui prédisent le mot suivant dans une séquence sont typiquement des modèles génératifs parce qu'ils peuvent attribuer une probabilité à une séquence de mots. Les types de réseaux génératifs utilisés pour la détection d'anomalies comprennent les autoencodeurs variationnels (VAE), les réseaux adversoriels génératifs (GAN) et les flux normalisés. CFlow-AD est basé sur le dernier type de réseaux, les flux normalisés.
CFlow-AD est basé sur un réseau de flux normalisé conditionnel. Les réseaux de flux normalisés peuvent être comparés aux VAE grâce à quelques propriétés mathématiques favorables. Pour une excellente explication des flux normalisés, voir ce blog. Comme pour les approches précédentes, on utilise un encodeur pré-entraîné sur ImageNet. Les vecteurs d'intégration sont ensuite codés à l'aide d'un codage positionnel conventionnel (PE) en vecteurs conditionnels, d'où le flux conditionnel. Le décodeur est un décodeur de flux normalisé qui estime la vraisemblance des caractéristiques codées. Les vraisemblances estimées à plusieurs échelles sont suréchantillonnées à la taille de l'entrée et additionnées pour produire la carte des anomalies. Ce processus est décrit ci-dessous.
Les implémentations officielles de toutes ces méthodes sont disponibles sur GitHub. Cependant, il existe une nouvelle bibliothèque Python open-source appelée Anomalib qui met en œuvre tous les algorithmes ci-dessus d'une manière facile d'accès. Anomalib contient un ensemble d'algorithmes de détection d'anomalies, dont un sous-ensemble a été présenté ci-dessus. La bibliothèque vise à fournir des composants permettant de concevoir des algorithmes personnalisés pour des besoins spécifiques, des traqueurs d'expériences, des visualisateurs et des optimiseurs d'hyperparamètres, tous destinés à la détection d'anomalies.
L'ensemble de données MVTec sur les défauts d'usine est un ensemble de données populaire pour la détection d'anomalies dans les processus de fabrication. Il contient plus de 5 000 images haute résolution réparties en dix catégories d'objets et cinq catégories de textures. Chaque catégorie comprend un ensemble d'images d'entraînement sans défaut et un ensemble d'images de test avec différents types de défauts ainsi que des images sans défaut. Les expériences ci-dessous seront menées sur les catégories d'objets Screw et de textures Carpet.
La mesure utilisée pour la comparaison est l'aire sous la courbe de la caractéristique d'exploitation du récepteur (AUROC), où le taux de vrais positifs est le pourcentage de pixels correctement classés comme anormaux.
Afin d'utiliser Anomalib, vous aurez besoin d'au moins Python 3.8+ et d'un clone du dépôt. Installez les exigences situées dans le dossier des exigences. Il est également possible d'installer la bibliothèque en utilisant pip install anomalib, cependant, en raison du développement actif de la bibliothèque, cela n'est pas recommandé avant la version v0.2.5. Les modèles sont situés dans anomalib\models\ModelName où chacun des modèles est implémenté et il y a un config.yaml qui l'accompagne. Ce fichier de configuration contient des informations sur le jeu de données (par défaut MVTec), les paramètres du modèle, et les paramètres de formation/test. Pour les expériences ci-dessous, les paramètres par défaut du modèle, de la formation et du test ont été utilisés. Par défaut, tous les modèles attendent le jeu de données MVTec dans datasets\MVTec. Vous pouvez télécharger l'ensemble de données ici.
Après avoir installé les conditions requises, configuré l'ensemble de données et modifié le fichier de configuration comme vous le souhaitez, vous pouvez entraîner un modèle spécifique à l'aide de :
python tools/train.py --model <ModelName>
The resulting weights and test images will be stored in results\<ModelName>. If you already have a trained model you can run inference on a new image using:
python tools/inference.py \ --model_config_path <path/to/model/config.yaml> \ --weight_path <path/to/weight/file> \ --image_path <path/to/image>
Cette section compare la mise en œuvre des trois modèles discutés précédemment et les compare aux résultats obtenus dans leurs articles respectifs. L'ensemble de données MVTec contient 10 classes d'objets et 5 classes de textures. La comparaison portera sur l'AUROC des trois modèles et sera exécutée sur la classe d'objets Screw (320 images d'entraînement) et la classe de textures Carpet (245 images d'entraînement). Tous les tests sont effectués sur un Google Colab avec un Nvidia K80, 2 threads, et 13Gb RAM. Les tableaux résultants sont présentés ci-dessous.
*L'article original du PaDiM n'a publié que des résultats moyens pour toutes les classes au niveau de l'image.
Comme prévu, les résultats de l'implémentation d'Anomalib sont très similaires aux implémentations des articles originaux. Deux exemples de résultats de PaDiM sont présentés ci-dessous.
Outre les résultats en termes de performances, la vitesse est également un facteur important lors du déploiement des modèles dans des scénarios réels. Le tableau ci-dessous contient à la fois le temps d'apprentissage et la vitesse d'inférence sur l'ensemble de test (Screws). Notez que ces résultats ont été obtenus en utilisant le fichier de configuration par défaut d'Anomalib et qu'ils pourraient être améliorés, par exemple, en modifiant l'épine dorsale du CNN, la taille du lot ou la taille du sous-échantillon.
Une différence significative peut être observée dans le temps d'apprentissage, ce qui peut s'expliquer en utilisant les descriptions de modèles ci-dessus. Tous les modèles utilisent un CNN pré-entraîné comme encodeur, après quoi PaDiM sélectionne au hasard un certain nombre de caractéristiques et crée les distributions gaussiennes multivariées. PatchCore a une fonctionnalité similaire, mais il utilise le sous-échantillonnage des noyaux, ce qui nécessite plus de temps d'apprentissage. CFlow-AD était un modèle génératif basé sur la normalisation des flux. Cela signifie que les décodeurs devront être adaptés à l'ensemble d'apprentissage, ce qui augmente considérablement le temps d'apprentissage.
Si l'on compare la vitesse d'inférence, PaDiM est à nouveau le plus rapide car, pour chaque patch, il suffit de calculer la distance de Mahalanobis par rapport à la distribution apprise. PatchCore dispose de plus d'informations dans la banque de mémoire et utilise les plus proches voisins, ce qui est plus lent. Pour CFlow, comme lors de l'apprentissage, l'utilisation du réseau génératif demande plus au GPU et a une vitesse d'inférence plus faible. Notez que cette comparaison de vitesse a été effectuée en utilisant le fichier de configuration par défaut, qui n'est peut-être pas la configuration idéale pour toutes les situations. L'article sur CFlow-AD, par exemple, indique qu'avec un encodeur plus léger (MobileNetV3L ou ResNet-18), ils ont obtenu 12 fps sur une GTX 1080.
Dans ce billet de blog, nous avons comparé trois méthodes de détection d'anomalies de pointe, PaDiM, PatchCore et CFlow-AD. Alors que PaDiM et PatchCore adoptent une approche discriminative, CFlow-AD utilise un réseau génératif de normalisation des flux afin de détecter les anomalies. Lorsque l'on compare les résultats, on constate que les performances des trois méthodes sont très similaires. Dans la littérature récente, PaDiM est considéré comme une référence et PatchCore et CFlow-AD tentent tous deux de l'améliorer et y parviennent dans la plupart des domaines, à l'exception de la vitesse. En raison de sa simplicité, PaDiM s'entraîne rapidement et, en utilisant les configurations par défaut, a la vitesse d'inférence la plus élevée. En raison de l'implémentation, il peut être plus sensible à l'orientation/rotation, ce que PatchCore, par exemple, tente de résoudre. Comme toujours, le choix du modèle parfait dépend de la situation, mais Anomalib fournit un accès facile à ces modèles, ce qui vous permet de prendre cette décision.
Le plus performant sur l'ensemble des données MVTec est actuellement FastFlow. Au moment de la rédaction de cet article, Fastflow n'était pas disponible dans Anomalib, mais une branche avec une implémentation préliminaire existe déjà, ce qui laisse penser qu'il sera bientôt disponible. Fastflow utilise des flux de normalisation similaires à CFlow-AD et tente de les améliorer.
Google Cut-Paste introduit un cadre en deux étapes. L'algorithme est appelé CutPaste en raison d'une stratégie simple d'augmentation des données qui coupe une partie de l'image et la colle à un endroit aléatoire d'une grande image qui sert d'anomalie. Un CNN est formé à l'aide de cette augmentation de manière autosupervisée. Dans un deuxième temps, ils adoptent des algorithmes de classification à une classe, tels que le SVM à une classe, en utilisant les encastrements de la première étape.