$$\rightleftharpoonup{xx}$$
$$\longleftharp{xx}$$,
$$\longrightharp{xx}$$,
L’ensemble de données utilisé dans cet article a été acquis dans le domaine AS/RS du département logistique de Longyan Tobacco Industry Co., Ltd. Cette étude n’a pas impliqué de participants humains ni d’animaux. Aucune approbation éthique n’était requise.
Acquisition et mise en place des jeux de données
Configuration matérielle : Monter un appareil photo industriel (par exemple, MV-CA013-A0GM) équipé d’un objectif de 8 mm à distance focale (par exemple, MVL-HF0828M-6MPE) sur la plateforme de cargaison de la grue empilière. Connectez la caméra à un PC de contrôle via un câble GigE et un dispositif d’accès sans fil (par exemple, BH-ANT5158S-14HV, BH-MS-AC1600HWH). Placez une bande lumineuse LED (par exemple, MV-LLDS-1002-38-W) autour de l’appareil pour assurer un éclairage uniforme.
Paramètres de la caméra : Configurez la caméra à l’aide du logiciel du fabricant (par exemple, MVS). Réglez la résolution d’acquisition à 1280 x 1024 pixels. Réglez le mode de déclenchement sur Déclencheur matériel et synchronisez-le avec le système de positionnement de la grue empileur. Réglez le temps d’exposition à 100 ms et le gain à 5 dB pour minimiser le flou de mouvement et le bruit. La distance de travail entre la caméra et les boîtes à cigarettes est d’environ 550 mm.
Collecte d’images : Un appareil photo industriel avec déclencheur capture automatiquement une image à chaque position d’un plateau lors du stockage et de la récupération des boîtes de cigarettes. Collectez un total de 4 835 images brutes ; des images typiques sont montrées à la Figure 1.
Annotation d’image : Utilisez l’outil open source LabelImg. Pour chaque image, dessinez des encadrés englobants autour de chaque caractéristique visible de la marque de cigarette. Attribuez le nom de marque correct (par exemple, Hongzhuang, Gutian) comme étiquette de classe pour chaque boîte englobante. Sauvegardez les annotations dans un format standard de détection à un seul étage, avec un fichier txt par image.
Contrôle qualité : Un second annoteur examine aléatoirement 20 % des images annotées. Toute incohérence est discutée et résolue, garantissant la cohérence de l’étiquetage.
Stratégie d’augmentation des données
Cette section détaille à la fois les techniques d’augmentation traditionnelles et avancées appliquées aux ensembles de données. Les données initiales et les données augmentées sont combinées dans un nouveau jeu de données, qui est ensuite divisé en ensemble d’entraînement, ensemble de validation et ensemble de test afin d’assurer l’équité dans l’évaluation.
Augmentation traditionnelle des données32 : Ces transformations sont appliquées en temps réel par le pipeline d’entraînement (par exemple, en utilisant les bibliothèques Albumentations ou PyTorch Transforms) avec une probabilité définie pour chaque lot.
Transformations géométriques : Rotation : Faire tourner aléatoirement les images d’un angle compris entre -45° et +45°. Mise à l’échelle : Mettez les images à l’échelle aléatoire d’un facteur entre 0,8 et 1,2. Retournement horizontal : Inverser les images horizontalement au hasard avec une probabilité de 100 %. Recadrage aléatoire : recadrez aléatoirement une section entre 80 % et 100 % de la zone originale de l’image.
Transformations photométriques : Luminosité et contraste : Ajustez la luminosité et le contraste d’un facteur choisi au hasard parmi [0,6, 1,4]. Bruit gaussienne : Ajoutez le bruit gaussienne avec un écart-type choisi aléatoirement entre [0, 0,01 * 255] à 10 % des images. Flou gaussienne : Appliquer un flou gaussienne avec une taille de noyau de 3x3 à 10 % des images.
Simulation d’occlusion : placer aléatoirement 1 à 3 plaques rectangulaires d’occlusion (couvrant chacune jusqu’à 5 % de la surface de l’image) sur les images. Les patches sont remplis de bruit aléatoire ou de valeurs moyennes de pixels d’image.
Augmentation avancée des données : copier-coller spécifique à une région
Motivation et impact : La motivation principale de cette augmentation ciblée était de résoudre un problème crucial de données : plusieurs marques de cigarettes ont eu très peu de cas (jusqu’à une seule image). Une division standard aléatoire de test de validation de train pourrait potentiellement attribuer toutes les instances d’une marque rare à un seul ensemble (par exemple, toutes à l’ensemble de test), ce qui empêcherait le modèle d’apprendre ou de valider cette marque. Cette méthode a artificiellement augmenté la taille de l’échantillon pour ces marques sous-représentées, garantissant que chaque marque dispose d’un nombre suffisant d’instances réparties sur les ensembles de formation, de validation et de test. Cette étape fondamentale évite les échecs catastrophiques dans les catégories rares et constitue une condition préalable à toute performance significative du modèle et à une généralisation sur l’ensemble des marques.
Cette étape nécessite un modèle de référence segmentaire pré-entraîné sur le jeu de données initial et le Segment Anything Model (SAM)33.
Segmenter les objets sources : Pour les images de boîtes à cigarettes de marques sous-représentées, utilisez le modèle SAM pour générer des masques de segmentation précis. Utilisez le mode invite de point, cliquez sur la fonction Marque de la boîte à cigarettes pour lancer la segmentation. Validez et affinez manuellement les masques générés pour garantir la précision. Sauvegardez les images segmentées des boîtes de cigarettes avec des arrière-plans transparents sous forme de fichiers PNG. Cela crée une bibliothèque d’instances d’objets isolés.
Générez des masques d’arrière-plan : Utilisez le modèle segmentaire de base pré-entraîné pour effectuer la segmentation des instances sur un ensemble d’images d’arrière-plan (images avec un espace libre suffisant ou des arrière-plans simples). Le modèle produira des masques binaires indiquant les régions déjà occupées par les objets.
Masques de procédé et collage d’objets : Pour chaque masque d’arrière-plan, utilisez la bibliothèque OpenCV (fonction 'cv2.approxPolyDP' avec un facteur épsilon de 0,02 * périmètre de contour) pour effectuer l’ajustement des courbes et linéariser les arêtes du masque, obtenant ainsi une représentation polygonale simplifiée de l’espace libre. Identifiez la plus grande zone de polygones contiguës dans le masque d’arrière-plan comme la région de la pâte cible. Sélectionnez aléatoirement un objet source segmenté dans la bibliothèque. Redimensionnez-la (en conservant le format d’aspect) et appliquez une transformation affine (rotation mineure entre -5° et +5°, et légère cisaillement) pour qu’elle s’adapte naturellement à la région de la pâte cible, afin de s’assurer qu’elle ne chevauche pas les limites des objets existants. Utilisez le mélange alpha pour coller sans interruption l’objet transformé sur l’image de fond à l’emplacement calculé. Le cadre global de la technologie d’augmentation de données, basé sur la technique de copier-coller dans des domaines spécifiques, est illustré à la Figure 2. Générez programmatiquement un nouveau fichier d’annotation txt correspondant pour l’objet collé, en mettant à jour les coordonnées de la boîte englobante et l’étiquette de classe.
Jeu de données final augmenté : Ce processus hors ligne génère 600 nouvelles images synthétiques. Combinez-les avec les 4 835 images originales et 1 167 images supplémentaires générées en appliquant les techniques d’augmentation traditionnelles décrites ci-dessus pour former le jeu de données final de 6 602 images. Divisez le jeu de données final en ensembles d’entraînement (70 %, 4 621 images), de validation (20 %, 1 320 images) et de test (10 %, 661 images), en veillant à ce que les images de la même séquence originale soient conservées dans la même division pour éviter toute fuite de données.
Modification du modèle pour la construction du détecteur amélioré proposé
Les algorithmes optimisés de détectiond’objets 34 ont réalisé des progrès notables dans l’inspection industrielle ces dernières années. Cette section fournit une procédure détaillée étape par étape pour modifier l’architecture de base du modèle afin de créer le modèle proposé. Les modifications sont mises en œuvre en modifiant le fichier de configuration du modèle (par exemple, config.yaml) et en s’assurant que les définitions personnalisées correspondantes des modules sont incluses dans la base de code. La justification de chaque modification est fournie pour en élucider le rôle dans la résolution de défis spécifiques de détection. La structure du modèle proposé est illustrée à la Figure 3.
Remplacement des modules de downsampling par le module ADown : Le module standard Convolution-BatchNorm-SiLU (CBS) utilisé pour le downsampling utilise une convolution à une seule stridée, qui peut agir comme un goulot d’étranglementd’information 35, éliminant potentiellement des fonctionnalités fines cruciales pour reconnaître les petites boîtes de cigarettes et les logos détaillés de marque. Le module ADown est conçu pour atténuer cela en implémentant une structure à double branchement qui capture et préserve un ensemble plus riche de caractéristiques lors de la réduction de la résolution spatiale. Une branche privilégie la conservation des détails locaux à haute fréquence, tandis que l’autre offre une vue d’ensemble plus large et riche en contexte. La fusion de ces caractéristiques complémentaires aboutit à une représentation plus robuste et informative pour les couches suivantes.
Étapes d’action et de mise en œuvre
Définition du module : Assurez-vous qu’un module PyTorch personnalisé nommé ADown est défini dans les fichiers de définition du modèle du projet. Ce module doit contenir deux branches parallèles. La première branche doit consister en une couche de convolution bidimensionnelle avec un noyau de 3x3 et une foulée de 2. La seconde branche doit consister séquentiellement en une couche de max-pooling 2x2 (avec la foulée 2) suivie d’une couche de convolution 1x1. Les sorties de ces deux branches doivent être concaténées le long de la dimension du canal, et la carte de caractéristiques résultante est ensuite passée à travers une couche finale de convolution 1x1 pour intégrer les canaux et produire la sortie. La structure du module ADown est illustrée à la Figure 4.
Édition du fichier de configuration : Ouvrez le fichier de configuration de base du modèle (config.yaml). Identifier systématiquement chaque instance du module CBS configurée pour le downsampling (c’est-à-dire où le paramètre stride est fixé à 2). Remplacez chacune de ces entrées de module CBS par le nouveau module ADown.
Motivation de conception : La conception d’ADown est motivée par la nécessité de limiter la perte d’information dans les convolutions standard stridées, ce qui peut être préjudiciable pour les petits objets. Sa structure à double branche s’inspire de l’idée du traitement parallèle pour capturer à la fois des détails spatiaux à haute fréquence (par convolution) et des informations contextuelles à basse fréquence (via le pooling), offrant ainsi une représentation des caractéristiques multi-échelle plus riche pour les couches suivantes.
Intégration du module iEMA
Rationalisation et principe de conception : Pour améliorer la capacité du modèle à détecter de petites cibles et celles partiellement obscurcies, il est essentiel d’incorporer un mécanisme capable de modéliser efficacement un contexte spatial à plusieurs échelles. Le module iEMA y parvient en intégrant un composant Efficient Multi-scale Attention (EMA)36 dans une structure de bloc résiduel inversé (iRMB)37 . L’iRMB fournit une base efficace en calcul grâce à des convolutions séparables en profondeur, tandis que la composante EMA capture explicitement les interactions spatiales à l’échelle croisée via une conception parallèle à plusieurs branches. Cette intégration permet au modèle de recalibrer dynamiquement les poids des caractéristiques, en concentrant l’attention sur les régions spatiales les plus discriminantes à différentes échelles, améliorant ainsi la reconnaissance sous occlusion et pour les petits objectifs.
Étapes d’action et de mise en œuvre
Définition du module : Assurez-vous qu’un module PyTorch personnalisé nommé iEMA est défini. Ce module doit d’abord implémenter un bloc résiduel inversé. Ce bloc commence généralement par une convolution ponctuelle pour l’expansion du canal, suivie d’une convolution en profondeur (par exemple, 3x3) pour l’extraction des caractéristiques spatiales, et enfin une convolution ponctuelle pour la projection du canal. Immédiatement après ce blocage, le mécanisme d’attention EMA devrait être mis en œuvre. Le mécanisme EMA utilise typiquement des convolutions groupées et des interactions interdimensionnelles pour générer efficacement une carte d’attention spatiale multi-échelle sans surcharge computationnelle excessive. La structure du module iEMA est illustrée à la Figure 5.
Édition du fichier de configuration : Dans le fichier config.yaml, localisez les sections définissant le réseau neck, en particulier les couches immédiatement après les modules C2f. À ces emplacements stratégiques, insérez une nouvelle couche qui appelle le module iEMA.
Motivation de conception : Le module iEMA repose sur le principe d’amélioration de la discriminabilité des caractéristiques en intégrant l’extraction locale des caractéristiques (via convolution en profondeur) avec un mécanisme de modélisation globale du contexte (EMA) léger mais efficace. Cette approche hybride permet au modèle de se concentrer de manière adaptative sur des régions informatives à différentes échelles, ce qui est crucial pour reconnaître les logos et textes partiellement visibles de la marque.
Remplacement de la tête de détection par le module DynamicHead
Rationalité et principe de conception : La tête de détection originale peut ne pas gérer de manière optimale la variation significative d’échelle des boîtes de cigarettes et l’interaction complexe entre les tâches de localisation et de classification. Le module DynamicHead répond à cela en unifiant trois formes d’attention dans une structure cohérente : consciente de l’échelle, consciente de l’espace et attentive à la tâche. La composante sensible à l’échelle fusionne dynamiquement des éléments provenant de différents niveaux de la pyramide des caractéristiques, garantissant que les objets de toutes tailles sont représentés efficacement. La composante spatiale utilise une stratégie d’échantillonnage clairsemé pour concentrer les ressources computationnelles sur les régions les plus informatives des cartes de caractéristiques. La composante consciente de la tâche adapte la représentation des caractéristiques spécifiquement aux objectifs distincts de la régression par boîtes englobantes et de la classification des catégories. Cette approche unifiée conduit à des prédictions plus précises et robustes.
Étapes d’action et de mise en œuvre
Définition du module : Il s’agit d’un module complexe qui englobe les trois mécanismes d’attention décrits par les équations (1) à (4). Sa structure interne comprendra des couches pour calculer des poids à l’échelle, effectuer une attention spatiale déformable et appliquer des transformations de caractéristiques spécifiques à la tâche.
(1)
(2)
(3)
(4)
Où WL(F) désigne la carte finale de caractéristiques affinées par l’attention, obtenue en appliquant séquentiellement les mécanismes d’attention conscients de l’échelle π L(F), les mécanismes d’attention conscients de l’échelle πS(F) et conscients de la tâche π C(F) à la caractéristique d’entrée F. Plus précisément, dans l’équation (2), πL(F) calcule un poids d’attention par échelle en faisant d’abord une moyenne entre les dimensions spatiales (S) et du canal (C), en le faisant passer par une fonction linéaire f(⋅) et une activation sigmoïde dure σ(⋅). Dans l’équation (3), πS(F) effectue une attention spatiale clairsemée en agrégeant des caractéristiques de K points clés échantillonnés pk, chacun avec un décalage apprenable Δp k pour se concentrer sur les régions discriminatives et un scalaire d’importance Δm k. Dans l’Équation (4), πC(F) implémente une attention consciente de la tâche en appliquant une transformation linéaire (régie par des paramètres appris (α1, β1,α 2,β 2)) à chaque canal et en sélectionnant la réponse maximale, permettant à la tête de se spécialiser pour les tâches de classification et de régression. La structure du module DynamicHead est illustrée à la Figure 6.
Édition du fichier de configuration : Dans le fichier config.yaml, trouvez la section qui définit la tête du modèle, qui contient à l’origine le module Detect. Remplacez-le par une nouvelle entrée qui appelle le module DynamicHead.
Motivation de conception : Le module DynamicHead repose sur l’observation que les têtes de détection d’objets doivent être adaptatives à l’échelle, à la localisation spatiale et à la tâche. Son cadre d’attention unifié, formalisé dans les équations (1-4), permet au modèle de recalibrer dynamiquement les réponses des caractéristiques en fonction de ces trois dimensions, ce qui conduit à des prédictions plus robustes contre la variation d’échelle et le bruit d’arrière-plan.
Entraînement des modèles
Assurez-vous que PyTorch 2.1.0, CUDA 12.1 et toutes les dépendances sont installées.
Commandement de formation
Avant de réentraîner, préparez les données d’image divisée et les données d’annotation dans un format standard de détection à une seule étape. Créez un fichier .yaml contenant le chemin de l’image et la catégorie de données. Selon l’amélioration du modèle, le fichier .yaml du détecteur original est remplacé par le fichier .yaml proposé pour le modèle. Écrire le fichier train.py, importer le package détecteur à un seul étage, charger le modèle d’entraînement et le chemin des données, et définir certains paramètres d’entraînement, notamment imgze=640, epochs=100, batch=4, workers=0, device='0', optimiser='SGD', close_mosaic=10, etc.
Hyperparamètres : Les paramètres clés sont : taille de l’image d’entrée (640 x 640), taille du lot (4), taux d’apprentissage initial (0,01) avec planificateur de recuit cosinus, optimiseur SGD avec quantité de mouvement (0,937) et décroissance en poids (0,0005). L’augmentation en mosaïque est activée par défaut.
Surveillance de la formation : Le processus d’entraînement génère des métriques pour chaque époque. Surveillez les courbes pour la perte d’entraînement/validation et le mAP à 0,5 afin d’assurer la convergence et éviter le surapprentissage. Une formation de 100 époques est généralement suffisante.
Évaluation et déploiement du modèle
Évaluation : Après l’entraînement, le meilleur modèle est enregistré sous forme de runs/train/exp/weights/best.pt. Évaluez-le sur l’ensemble val en utilisant : bash python val.py --data cigarette_dataset.yaml --weights runs/train/exp/weights/best.pt. Le script affichera Précision, Rappel, mAP à 0,5, etc. Confirmez que le mAP atteint le seuil requis (par exemple, 97,9 %).
Inférence pour la vérification : Exécutez l’inférence sur des images d’échantillon pour vérifier visuellement les résultats de détection : bash python detect.py --weights runs/train/exp/weights/best.pt --source path/to/test/images --conf 0.5. En vérifiant le raisonnement, on peut obtenir les résultats de détection de chaque image et la vitesse de détection du modèle.
Déploiement : Pour un déploiement en temps réel sur le système de la grue empileur, convertissez le modèle PyTorch (best.pt, ~4,7 Mo) vers un format comme TensorRT ou ONNX pour une vitesse d’inférence optimisée. Le résultat final est constitué de boîtes englobantes avec des étiquettes de classes (noms de marques) et des scores de confiance.