$$\rightleftharpoonup{xx}$$
$$\longleftharp{xx}$$,
$$\longrightharp{xx}$$,
Il dataset utilizzato in questo articolo è stato acquisito dal campo AS/RS del Dipartimento Logistica di Longyan Tobacco Industry Co., Ltd. Questo studio non ha coinvolto partecipanti umani né animali. Non era richiesta un'approvazione etica.
Acquisizione e configurazione dei dataset
Configurazione hardware: Montare una fotocamera industriale (ad esempio MV-CA013-A0GM) equipaggiata con un obiettivo a lunghezza focale da 8 mm (ad esempio, MVL-HF0828M-6MPE) sulla piattaforma di carico della gru impilatrice. Collega la fotocamera a un PC di controllo tramite un cavo GigE e un dispositivo AP wireless (ad esempio, BH-ANT5158S-14HV, BH-MS-AC1600HWH). Posizionare una striscia LED (ad esempio MV-LLDS-1002-38-W) attorno alla fotocamera per garantire un'illuminazione uniforme.
Impostazione parametri della fotocamera: Configura la telecamera utilizzando il software del produttore (ad esempio, MVS). Imposta la risoluzione di acquisizione a 1280 x 1024 pixel. Imposta la modalità di innesco su Hardware Trigger e sincronizzala con il sistema di posizionamento della gru impilatrice. Imposta il tempo di esposizione a 100 ms e il guadagno a 5 dB per minimizzare la sfocatura e il rumore. La distanza di lavoro tra la telecamera e le scatole di sigarette è di circa 550 mm.
Raccolta immagini: Una fotocamera industriale con grilletto cattura automaticamente un'immagine ogni volta che un vassoio viene posizionato durante la conservazione e il recupero delle scatole di sigarette. Raccogli un totale di 4.835 immagini grezze; immagini tipiche sono mostrate nella Figura 1.
Annotazione immagini: Usa lo strumento open-source LabelImg. Per ogni immagine, disegna delle riquadre delimitate attorno a ogni caratteristica visibile della marca di sigaretta. Assegnare il nome di marca corretto (ad esempio, Hongzhuang, Gutian) come etichetta di classe per ogni riquadro di delimitazione. Salva le annotazioni in un formato standard di rilevamento a singolo stadio, con un file txt per ogni immagine.
Controllo qualità: Un secondo annotatore esamina casualmente il 20% delle immagini annotate. Eventuali discrepanze vengono discusse e risolte, garantendo la coerenza dell'etichettatura.
Strategia di aumento dei dati
Questa sezione dettaglia sia le tecniche di aumento tradizionali che avanzate applicate ai dataset. I dati iniziali e i dati aumentati vengono combinati in un nuovo dataset, che viene poi suddiviso in set di addestramento, set di validazione e set di test per garantire l'equità nella valutazione.
Aumento tradizionale deidati 32: Queste trasformazioni vengono applicate in tempo reale dalla pipeline di addestramento (ad esempio, utilizzando le librerie Albumentations o PyTorch Transforms) con una probabilità definita per ogni lotto.
Trasformazioni geometriche: Rotazione: ruotare casualmente le immagini con un angolo compreso tra -45° e +45°. Scala: Scala casualmente le immagini di un fattore compreso tra 0,8 e 1,2. Ribaltamento orizzontale: Inverti le immagini in orizzontale con una probabilità del 100%. Ritaglio casuale: ritaglia casualmente una sezione tra l'80% e il 100% dell'area originale dell'immagine.
Trasformazioni fotometriche: Luminosità e contrasto: Regolare luminosità e contrasto con un fattore scelto casualmente da [0.6, 1.4]. Rumore gaussiano: Aggiungi rumore gaussiano con una deviazione standard scelta casualmente da [0, 0,01 * 255] al 10% delle immagini. Sfocatura gaussiana: applica una sfocatura gaussiana con una dimensione del nucleo da 3x3 al 10% delle immagini.
Simulazione di occlusione: Posizionare casualmente da 1 a 3 chiazze rettangolari di occlusione (che coprono fino al 5% ciascuna dell'area dell'immagine) sulle immagini. Le patch sono riempite con rumore casuale o valori medi di pixel dell'immagine.
Potenziamento avanzato dei dati: copia-incolla specifica per regione
Motivazione e impatto: La motivazione principale di questo aumento miro era affrontare un problema critico dei dati: diversi marchi di sigarette avevano pochissimi casi (anche solo una foto). Una divisione standard casuale di test di validazione del treno potrebbe potenzialmente allocare tutte le istanze di un marchio raro a un unico insieme (ad esempio, tutte al set di test), facendo sì che il modello non abbia opportunità di apprendere o convalidare quel marchio. Questo metodo ha aumentato artificialmente la dimensione del campione per questi marchi sottorappresentati, assicurando che ogni marchio abbia un numero sufficiente di istanze distribuite tra i set di addestramento, validazione e test. Questo passaggio fondamentale previene fallimenti catastrofici in categorie rare ed è un prerequisito per qualsiasi performance significativa e generalizzazione del modello sull'intero insieme dei marchi.
Questo passaggio richiede un modello di base segmentale pre-addestrato sul dataset iniziale e il Segment Anything Model (SAM)33.
Segmenta oggetti sorgente: Per immagini di scatole di sigarette di marchi sottorappresentati, usa il modello SAM per generare maschere di segmentazione precise. Usa la modalità punto a spunto, cliccando sulla Funzione Marca della Scatola delle Sigarette per avviare la segmentazione. Valida e affina manualmente le maschere generate per garantire accuratezza. Salva le immagini segmentate delle scatole di sigarette con sfondi trasparenti come file PNG. Questo crea una libreria di istanze isolate di oggetti.
Genera maschere di sfondo: Usa il modello segmentale di base pre-addestrato per eseguire la segmentazione delle istanze su un insieme di immagini di sfondo (immagini con ampio spazio libero o sfondi semplici). Il modello produrrà maschere binarie che indicano le regioni già occupate dagli oggetti.
Maschere di processo e incolla oggetti: Per ogni maschera di sfondo, si utilizza la libreria OpenCV (funzione 'cv2.approxPolyDP' con un fattore epsilon di 0,02 * perimetro di contorno) per eseguire l'adattamento delle curve e linearizzare i bordi della maschera, ottenendo una rappresentazione poligonale semplificata dello spazio libero. Identifica la più grande area di poligoni contigui all'interno della maschera di sfondo come la regione della pasta target. Seleziona casualmente un oggetto sorgente segmentato dalla libreria. Ridimensionarla (mantenendo il rapporto d'aspetto) e applicare una trasformazione affine (rotazione minore tra -5° e +5°, e leggera taglio) per adattarla naturalmente all'interno della regione della pasta target, assicurandosi che non si sovrapponi ai confini degli oggetti esistenti. Usa l'alpha blending per incollare senza soluzione di continuità l'oggetto trasformato sull'immagine di sfondo nella posizione calcolata. Il quadro complessivo della tecnologia di aumento dei dati, basato sulla tecnica copia-incolla in aree specifiche, è mostrato nella Figura 2. Genera in modo programmatico un nuovo file di annotazione txt corrispondente per l'oggetto incollato, aggiornando le coordinate della scatola delimitatrice e l'etichetta della classe.
Dataset finale aumentato: Questo processo offline genera 600 nuove immagini sintetiche. Combinandole con le 4.835 immagini originali e altre 1.167 immagini generate applicando le tecniche di aumento tradizionali descritte sopra per formare il dataset finale di 6.602 immagini. Dividere il dataset finale in set di addestramento (70%, 4.621 immagini), validazione (20%, 1.320 immagini) e test (10%, 661 immagini), assicurandosi che le immagini della stessa sequenza originale siano mantenute all'interno della stessa divisione per prevenire perdite di dati.
Modifica del modello per la costruzione del rivelatore migliorato proposto
Gli algoritmi ottimizzati per il rilevamento degli oggetti34 hanno raggiunto notevoli progressi nell'ispezione industriale negli ultimi anni. Questa sezione fornisce una procedura dettagliata passo dopo passo per modificare l'architettura del modello di base per creare il modello proposto. Le modifiche vengono implementate modificando il file di configurazione del modello (ad esempio, config.yaml) e assicurandosi che le corrispondenti definizioni personalizzate dei moduli siano incluse nella base di codice. La motivazione di ciascuna modifica viene fornita per chiarirne il ruolo nell'affrontare specifiche sfide di rilevamento. La struttura del modello proposto è mostrata nella Figura 3.
Sostituzione dei moduli di downsampling con il modulo ADown: Il modulo standard Convolution-BatchNorm-SiLU (CBS) impiega una singola convoluzione strided che può agire come collo di bottigliainformativo 35, potenzialmente eliminando caratteristiche a grana fine cruciali per riconoscere piccole scatole di sigarette e loghi dettagliati del marchio. Il modulo ADown è progettato per alleviare questo problema implementando una struttura a doppio ramo che cattura e preserva un insieme più ricco di caratteristiche durante la riduzione della risoluzione spaziale. Un ramo dà priorità alla conservazione dei dettagli locali ad alta frequenza, mentre l'altro cattura una panoramica più ampia e ricca di contesto. La fusione di queste caratteristiche complementari porta a una rappresentazione più robusta e informativa per i livelli successivi.
Passaggi di implementazione
Definizione del modulo: Assicurarsi che un modulo personalizzato di PyTorch chiamato ADown sia definito all'interno dei file di definizione del modello del progetto. Questo modulo deve contenere due rami paralleli. Il primo ramo dovrebbe consistere in uno strato convoluzionale bidimensionale con un nucleo 3x3 e una stride di 2. Il secondo ramo dovrebbe consistere sequencialmente in uno strato di max-pooling 2x2 (con passo 2) seguito da uno strato di convoluzione 1x1. Gli output di questi due rami devono essere concatenati lungo la dimensione del canale, e la mappa delle caratteristiche risultante viene poi passata attraverso uno strato finale di convoluzione 1x1 per integrare i canali e produrre l'output. La struttura del modulo ADown è mostrata nella Figura 4.
Modifica file di configurazione: Apri il file di configurazione del modello di base (config.yaml). Identifica sistematicamente ogni istanza del modulo CBS configurata per il downsampling (cioè dove il parametro stride è impostato a 2). Sostituire ciascuna di queste voci del modulo CBS con il nuovo modulo ADown.
Motivazione progettuale: Il design di ADown è motivato dalla necessità di mitigare la perdita di informazioni nelle convoluzioni standard strided convolutions, che possono essere dannose per oggetti piccoli. La sua struttura a doppio ramo è ispirata all'idea dell'elaborazione parallela per catturare sia dettagli spaziali ad alta frequenza (tramite convoluzione) sia informazioni contestuali a bassa frequenza (tramite pooling), fornendo così una rappresentazione più ricca delle caratteristiche multiscala per i livelli successivi.
Integrazione del modulo iEMA
Motivazione e principio progettuale: Per migliorare la capacità del modello di rilevare piccoli bersagli e quelli parzialmente oscurati, è essenziale incorporare un meccanismo che possa modellare efficacemente contesti spaziali su più scala. Il modulo iEMA ottiene questo obiettivo incorporando un componente Efficient Multi-scale Attention (EMA)36 all'interno di una struttura a blocco residuo invertito (iRMB)37 . L'iRMB fornisce una base computazionalmente efficiente utilizzando convoluzioni separabili in profondità, mentre la componente EMA cattura esplicitamente interazioni spaziali su scala trasversale attraverso un design parallelo multiramo. Questa integrazione permette al modello di ricalibrare dinamicamente i pesi delle caratteristiche, concentrando l'attenzione sulle regioni spaziali più discriminative su diverse scale, migliorando così il riconoscimento in caso di occlusione e per oggetti piccoli.
Passi di azione-implementazione
Definizione del modulo: Assicurarsi che sia definito un modulo personalizzato di PyTorch chiamato iEMA. Questo modulo dovrebbe prima implementare un blocco residuo invertito. Questo blocco tipicamente inizia con una convoluzione punto a punto per l'espansione del canale, seguita da una convoluzione in profondità (ad esempio, 3x3) per l'estrazione delle caratteristiche spaziali, e infine una convoluzione puntuale per la proiezione del canale. Immediatamente dopo questo blocco, dovrebbe essere implementato il meccanismo di attenzione EMA. Il meccanismo EMA tipicamente impiega convoluzioni raggruppate e interazioni trasversali per generare in modo efficiente una mappa di attenzione spaziale su più scala senza un eccessivo sovraccarico computazionale. La struttura del modulo iEMA è mostrata nella Figura 5.
Modifica del file di configurazione: Nel file di configurazione config.yaml, individua le sezioni che definiscono la rete del collo, in particolare i livelli immediatamente successivi ai moduli C2F. In queste posizioni strategiche, inserire un nuovo livello che richiama il modulo iEMA.
Motivazione progettuale: Il modulo iEMA si basa sul principio di migliorare la discriminabilità delle caratteristiche integrando l'estrazione locale delle caratteristiche (tramite convoluzione in profondità) con un meccanismo di modellazione globale del contesto (EMA) leggero ma efficace. Questo approccio ibrido permette al modello di concentrarsi in modo adattivo su regioni informative su diverse scale, cosa cruciale per riconoscere loghi e testi di brand parzialmente visibili.
Sostituzione della testina di rilevamento con il modulo DynamicHead
Motivazione e principio progettuale: La testa di rilevamento originale potrebbe non gestire in modo ottimale la significativa variazione di scala delle scatole di sigarette e la complessa interazione tra compiti di localizzazione e classificazione. Il modulo DynamicHead affronta questo obiettivo unificando tre forme di attenzione in una struttura coerente: consapevole della scala, consapevole dello spazio e attenzione consapevole del compito. Il componente consapevole della scala fonde dinamicamente caratteristiche provenienti da diversi livelli della piramide delle caratteristiche, assicurando che oggetti di tutte le dimensioni siano rappresentati efficacemente. La componente spaziale utilizza una strategia di campionamento scarno per concentrare le risorse computazionali sulle regioni più informative all'interno delle feature map. La componente task-aware adatta la rappresentazione delle caratteristiche specificamente per gli obiettivi distinti della regressione delle scatole delimitanti e della classificazione delle categorie. Questo approccio unificato porta a previsioni più accurate e solide.
Passi di azione-implementazione
Definizione del modulo: Questo è un modulo complesso che comprende i tre meccanismi di attenzione descritti dalle Equazioni (1) fino a (4). La sua struttura interna includerà strati per calcolare pesi su scala, eseguire attenzione spaziale deformabile e applicare trasformazioni di caratteristiche specifiche per compito.
(1)
(2)
(3)
(4)
Dove WL(F) indica la mappa finale delle caratteristiche affinate dell'attenzione, ottenuta applicando sequenzialmente i meccanismi di attenzione consapevoli della scala π L(F), consapevoli dello spazio πS(F) e i meccanismi di attenzione consapevoli del compito π C(F) alla caratteristica di input F. In particolare, nell'Equazione (2), πL(F) calcola un peso di attenzione scala a scala facendo prima una media tra le dimensioni spaziali (S) e del canale (C), passandolo attraverso una funzione lineare f(⋅) e un'attivazione sigmoide rigida σ(⋅). Nell'Eq. (3), πS(F) esegue un'attenzione spaziale scarsa aggregando caratteristiche da K punti chiave campionati pk, ciascuno con uno spostamento apprendibile Δp k per concentrarsi su regioni discriminative e uno scalare di importanza Δm k. Nell'Eq. (4), πC(F) implementa un'attenzione consapevole del compito applicando una trasformazione lineare (governata da parametri appresi (α1, β1,α 2,β 2)) a ciascun canale e selezionando la risposta massima, permettendo alla testa di specializzarsi per compiti di classificazione e regressione. La struttura del modulo DynamicHead è mostrata nella Figura 6.
Modifica del file di configurazione: Nel file config.yaml, trova la sezione che definisce la testa del modello, che originariamente contiene il modulo Detect. Sostituiscila con una nuova voce che chiama il modulo DynamicHead.
Motivazione di progettazione: Il modulo DynamicHead si basa sull'osservazione che le teste di rilevamento degli oggetti dovrebbero essere adattive alla scala, alla posizione spaziale e al compito. Il suo quadro di attenzione unificato, formalizzato in Equalizzazioni. (1-4), consente al modello di ricalibrare dinamicamente le risposte delle caratteristiche basandosi su queste tre dimensioni, portando a previsioni più robuste contro variazioni di scala e disordini di fondo.
Addestramento al modello
Assicurati che PyTorch 2.1.0, CUDA 12.1 e tutte le dipendenze siano installate.
Comando di addestramento
Prima di riaddestrarsi, preparare i dati dell'immagine divisa e quelli delle annotazioni in un formato standard di rilevamento a singolo stadio. Crea un file .yaml contenente il percorso immagine e la categoria dati. Secondo il miglioramento del modello, il file .yaml originale del rilevatore viene sostituito dal file .yaml del modello proposto. Scrivi il file train.py, importi il pacchetto rilevatore a singolo stadio, carichi il modello di addestramento e il percorso dati, e imposta alcuni parametri di addestramento, tra cui imgze=640, epochs=100, batch=4, workers=0, device='0', ottimizzatore='SGD', close_mosaic=10, ecc.
Iperparametri: I parametri chiave sono: dimensione dell'immagine di input (640 x 640), dimensione del lotto (4), tasso di apprendimento iniziale (0,01) con scheduler di ricottura coseno, ottimizzatore SGD con quantità di moto (0,937) e decadimento del peso (0,0005). L'augmentazione Mosaic è abilitata di default.
Monitoraggio dell'addestramento: Il processo di addestramento fornirà metriche per ogni epoca. Monitorare le curve per perdite di addestramento/validazione e mAP a 0,5 per garantire la convergenza ed evitare sovrafitting. L'addestramento per 100 epoche è generalmente sufficiente.
Valutazione e distribuzione del modello
Valutazione: Dopo l'allenamento, il modello migliore viene salvato come runs/allenamento/esperienza/pesi/best.pt. Valutalo sul set val usando: bash python val.py --data cigarette_dataset.yaml --weights runs/train/exp/weights/best.pt. Lo script riproduce Precisione, Richiuro, mAP a 0,5, ecc. Conferma che il mAP raggiunga la soglia richiesta (ad esempio, 97,9%).
Inferenza per la verifica: Esegui inferenza su immagini di esempio per verificare visivamente i risultati della rilevazione: bash python detect.py --weights runs/train/exp/weights/best.pt --source path/to/test/images --conf 0.5. Verificando il ragionamento, si possono ottenere i risultati di rilevamento di ogni immagine e la velocità di rilevamento del modello.
Implementazione: Per il dispiegamento in tempo reale sul sistema della gru impilatrice, convertite il modello PyTorch (best.pt, ~4,7 MB) in un formato come TensorRT o ONNX per ottimizzare la velocità di inferenza. L'output finale è costituito da riquadri di delimitazione con etichette di classe (nomi di marchi) e punteggi di confidenza.