Formazione e distribuzione di un modello Detectron2 personalizzato per il rilevamento di oggetti utilizzando documenti PDF (Parte 1: Formazione) |  di Noah Haglund |  Novembre 2023

 | Intelligenza-Artificiale

Se sei un utente Mac o Linux, sei fortunato! Questo processo sarà relativamente semplice eseguendo il seguente comando:

pip install torchvision && pip install "detectron2@git+https://github.com/facebookresearch/detectron2.git@v0.5#egg=detectron2"

Tieni presente che questo comando compilerà la libreria, quindi dovrai attendere un po’. Se desideri installare Detectron2 con supporto GPU, fai riferimento al Detectron2 ufficiale istruzioni per l’installazione per informazioni dettagliate.

Se tuttavia sei un utente Windows, questo processo sarà un po’ fastidioso, ma sono riuscito a farlo da solo su Windows.

Seguire attentamente le istruzioni esposto qui dal pacchetto Layout Parser per Python (che è anche un pacchetto utile da usare se non ti interessa addestrare il tuo modello Detectron2 per l’inferenza della struttura/del contenuto del PDF e vuoi fare affidamento su dati pre-annotati! Questo è sicuramente più dispendioso in termini di tempo , ma scoprirai che con casi d’uso specifici, puoi addestrare da solo un modello molto più accurato e più piccolo, il che è utile per la gestione della memoria nella distribuzione, come discuterò più avanti). Assicurati di installare pycocotools, insieme a Detectron2, poiché questo pacchetto ti aiuterà a caricare, analizzare e visualizzare COCO data, il formato in cui abbiamo bisogno dei nostri dati per addestrare un modello Detectron2.

L’installazione locale di Detectron2 verrà utilizzata nella parte 2 di questa serie di articoli, poiché utilizzeremo un’istanza AWS EC2 più avanti in questo articolo per la formazione su Detectron2.

Per l’annotazione delle immagini, abbiamo bisogno di due cose: (1) le immagini che annoteremo e (2) uno strumento di annotazione. Assembla una directory con tutte le immagini che desideri annotare, ma se stai seguendo il mio caso d’uso e desideri utilizzare immagini PDF, assembla una directory di PDF, installa il pacchetto pdftoimage:

pip install pdf2image

Quindi utilizza il seguente script per convertire ogni pagina PDF in un’immagine:

import os
from pdf2image import convert_from_path

# Assign input_dir to PDF dir, ex: "C://Users//user//Desktop//pdfs"
input_dir = "##"
# Assign output_dir to the dir you’d like the images to be saved"
output_dir = "##"
dir_list = os.listdir(input_dir)

index = 0
while index < len(dir_list):

images = convert_from_path(f"{input_dir}//" + dir_list(index))
for i in range(len(images)):
images(i).save(f'{output_dir}//doc' + str(index) +'_page'+ str(i) +'.jpg', 'JPEG')
index += 1

Una volta ottenuta una directory di immagini, utilizzeremo lo strumento LabelMe, vedere le istruzioni di installazione Qui. Una volta installato, esegui semplicemente il comando labelme dalla riga di comando o da un terminale. Si aprirà una finestra con il seguente layout:

Fai clic sull’opzione “Apri directory” sul lato sinistro e apri la directory in cui sono salvate le tue immagini (e chiamiamo anche questa directory “treno”). LabelMe aprirà la prima immagine nella directory e ti consentirà di annotare su ciascuna di esse. Fai clic con il pulsante destro del mouse sull’immagine per trovare varie opzioni per le annotazioni, come Crea poligoni per fare clic su ciascun punto di un poligono attorno a un determinato oggetto nell’immagine o Crea rettangolo per catturare un oggetto garantendo angoli di 90 gradi.

Una volta posizionato il riquadro/poligono di delimitazione, LabelMe chiederà un’etichetta. Nell’esempio seguente ho fornito l’intestazione dell’etichetta per ciascuna delle istanze di intestazione trovate nella pagina. Puoi utilizzare più etichette, identificando vari oggetti trovati in un’immagine (per l’esempio PDF potrebbe essere Titolo/Intestazione, Tabelle, Paragrafi, Elenchi, ecc.), ma per il mio scopo identificherò semplicemente intestazioni/titoli e poi in modo algoritmico associando ciascuna intestazione al rispettivo contenuto dopo l’inferenza del modello (vedi Parte 2).

Una volta etichettata, fare clic sul pulsante Salva, quindi fare clic su Immagine successiva per annotare l’immagine successiva nella directory specificata. Detectron2 è eccellente nel rilevare inferenze con dati minimi, quindi sentiti libero di annotare fino a circa 100 immagini per l’addestramento e il test iniziali, quindi annotare e addestrare ulteriormente per aumentare la precisione del modello (tieni presente che l’addestramento di un modello su più di un’etichetta categoria ridurrà leggermente la precisione, richiedendo un set di dati più grande per una maggiore precisione).

Una volta che ciascuna immagine nella directory del treno è stata annotata, prendiamo circa il 20% di queste coppie immagine/annotazione e spostiamole in una directory separata etichettata test.

Se hai familiarità con il Machine Learning, una semplice regola pratica è che deve esserci una suddivisione test/addestramento/convalida (60–80% dati di addestramento, 10–20% dati di convalida e 10–20% dati di test). A questo scopo, eseguiremo semplicemente una suddivisione test/allenamento pari al 20% di test e all’80% di allenamento.

Ora che abbiamo le nostre cartelle di annotazioni, dobbiamo convertire le annotazioni labelme nel formato COCO. Puoi farlo semplicemente inserendo il file labelme2coco.py il repository che ho qui. Ho rifattorizzato questo script da Tony607 che convertirà entrambe le annotazioni del poligramma E eventuali annotazioni rettangolari create (poiché lo script iniziale non convertiva correttamente le annotazioni rettangolari nel formato COCO).

Una volta scaricato il file labelme2coco.py, eseguilo nel terminale con il comando:

python labelme2coco.py path/to/train/folder

e genererà un file train.json. Esegui il comando una seconda volta per la cartella test e modifica la riga 172 in labelme2coco.py per modificare il nome di output predefinito in test.json (altrimenti sovrascriverà il file train.json).

Ora che il noioso processo di annotazione è finito, possiamo passare alla parte divertente, la formazione!

Se il tuo computer non è dotato di funzionalità GPU Nvidia, dovremo avviare un’istanza EC2 utilizzando AWS. Il modello Detectron2 può essere addestrato sulla CPU, ma se lo provi, noterai che ci vorrà molto tempo, mentre usando Nvidia CUDA su un’istanza basata su GPU addestrerebbe il modello in pochi minuti.

Per iniziare, accedi a Console AWS. Una volta effettuato l’accesso, cerca EC2 nella barra di ricerca per accedere alla dashboard di EC2. Da qui, fai clic su Istanze sul lato sinistro dello schermo, quindi fai clic sul pulsante Avvia istanze

Il livello minimo di dettaglio che dovrai fornire per l’istanza è:

  • Un nome
  • L’immagine della macchina Amazon (AMI) che specifica la configurazione del software. Assicurati di usarne uno con funzionalità GPU e PyTorch, poiché avrà i pacchetti necessari per CUDA e dipendenze aggiuntive necessarie per Detectron2, come Torch. Per seguire questo tutorial, utilizza anche un’AMI Ubuntu. Ho utilizzato l’AMI — Deep Learning AMI GPU PyTorch 2.1.0 (Ubuntu 20.04).
  • Il tipo di istanza che specifica la configurazione hardware. Consulta una guida Qui sui vari tipi di istanza come riferimento. Vogliamo utilizzare un’istanza ottimizzata per le prestazioni, come una delle famiglie di istanze P o G. Ho utilizzato p3.2xlarge che viene fornito con tutta la potenza di calcolo e, più specificamente, le funzionalità GPU di cui avremo bisogno.

NOTA BENE: le istanze della famiglia P richiederanno di contattare il servizio clienti AWS per un aumento della quota (poiché non consentono immediatamente agli utenti base di accedere a istanze con prestazioni più elevate a causa del costo associato). Se utilizzi l’istanza p3.2xlarge, dovrai richiedere un aumento della quota a 8 vCPU.

  • Specificare a Coppia di chiavi (accesso). Crea questo se non ne hai già uno e sentiti libero di chiamarlo p3key come ho fatto io.
  • Finalmente, Configura spazio di archiviazione. Se hai utilizzato la mia stessa AMI e tipo di istanza, vedrai uno spazio di archiviazione predefinito iniziale di 45 GB. Sentiti libero di aumentarlo fino a circa 60 GB o più secondo necessità, a seconda delle dimensioni del set di dati di addestramento per garantire che l’istanza disponga di spazio sufficiente per le tue immagini.

Vai avanti e avvia la tua istanza e fai clic sul collegamento ipertestuale dell’ID istanza per visualizzarla nel dashboard EC2. Quando l’istanza è in esecuzione, apri una finestra del prompt dei comandi ed eseguiremo l’SSH nell’istanza EC2 utilizzando il comando seguente (e assicurati di sostituire il testo in grassetto con (1) il percorso della coppia di chiavi .pem e (2) l’indirizzo per la tua istanza EC2):

ssh -L 8000:localhost:8888 -i C:\path\to\p3key.pem ubuntu@ec2id.ec2region.compute.amazonaws.com

Poiché si tratta di un nuovo host, accetta il seguente messaggio:

E poi Ubuntu inizierà insieme a un ambiente virtuale preconfezionato chiamato PyTorch (dall’AMI AWS). Attiva il venv e avvia un notebook jupyter preinstallato utilizzando i due comandi seguenti:

Ciò restituirà gli URL da copiare e incollare nel tuo browser. Copia quello con localhost nel tuo browser e cambia 8888 in 8000. Questo ti porterà a un Jupyter Notebook simile a questo:

Da il mio repository GitHubcaricare il file Detectron2_Tutorial.ipynb nel notebook. Da qui, esegui le righe sotto l’intestazione Installazione per installare completamente Detectron2. Quindi, riavvia il runtime per assicurarti che l’installazione abbia avuto effetto.

Una volta tornati al notebook riavviato, dobbiamo caricare alcuni file aggiuntivi prima di iniziare il processo di formazione:

  • Il file utils.py dal repository github. Ciò fornisce i file .ipynb con i dettagli di configurazione per Detectron2 (vedere la documentazione Qui come riferimento se sei interessato alle specifiche di configurazione). In questo file è incluso anche un file plot_samples funzione a cui si fa riferimento nel file .ipynb, ma è stato commentato in entrambi. Puoi rimuovere il commento e utilizzarlo per tracciare i dati di training se desideri vedere elementi visivi degli esempi durante il processo. Tieni presente che dovrai installare ulteriormente cv2 per utilizzare la funzione plot_samples.
  • Entrambi i file train.json e test.json sono stati creati utilizzando lo script labelme2coco.py.
  • Un file zip sia della directory Train images che della directory Test images (comprimere le directory ti consente di caricare solo un elemento sul notebook; puoi conservare i file delle annotazioni labelme nella directory, ciò non influirà sull’addestramento). Una volta caricati entrambi i file zip, aprire un terminale nel notebook facendo clic su (1) Nuovo e quindi su (2) Terminale nella parte in alto a destra del notebook e utilizzare i seguenti comandi per decomprimere ciascuno dei file, creando una directory separata di immagini Train e Test nel notebook:
! unzip ~/train.zip -d ~/
! unzip ~/test.zip -d ~/

Infine, esegui le celle del notebook nella sezione Formazione nel file .ipynb. L’ultima cella restituirà risposte simili alle seguenti:

Ciò mostrerà la quantità di immagini utilizzate per l’addestramento, nonché il conteggio delle istanze annotate nel set di dati di addestramento (qui sono state trovate 470 istanze della categoria “titolo” prima dell’addestramento). Detectron2 quindi serializza i dati e carica i dati in batch come specificato nelle configurazioni (utils.py).

Una volta iniziato l’addestramento, vedrai gli eventi di stampa di Detectron2:

Ciò consente di conoscere informazioni quali: il tempo di addestramento stimato rimasto, il numero di iterazioni eseguite da Detectron2 e, cosa più importante, per monitorare l’accuratezza, il total_loss, che è un indice degli altri calcoli delle perdite, che indica quanto fosse negativa la previsione del modello. un solo esempio. Se la previsione del modello è perfetta, la perdita è zero; in caso contrario, la perdita è maggiore. Non preoccuparti se il modello non è perfetto! Possiamo sempre aggiungere più dati annotati per migliorare l’accuratezza del modello o utilizzare le inferenze del modello addestrato finale che hanno un punteggio elevato (che indica quanto il modello è sicuro che un’inferenza sia accurata) nella nostra applicazione.

Una volta completato, nel notebook verrà creata una directory chiamata output con una sottodir, rilevamento oggetti, che contiene file relativi agli eventi e alle metriche di training, un file che registra un checkpoint per il modello e infine un file .pth intitolato model_final .pth. Questo è il modello Detectron2 salvato e addestrato che ora può essere utilizzato per fare inferenze in un’applicazione distribuita! Assicurati di scaricarlo prima di arrestare o terminare l’istanza AWS EC2.

Ora che abbiamo model_final.pth, segui a Parte 2: distribuzione articolo che tratterà il processo di distribuzione di un’applicazione che utilizza Machine Learning, con alcuni suggerimenti chiave su come rendere efficiente questo processo.

Se non diversamente specificato, tutte le immagini utilizzate in questo articolo sono dell’autore

Fonte: towardsdatascience.com

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *