Hai un set di dati contenente:
- immagini I1, I2, ...
- testi di verità di base T1, T2, ... per le immagini I1, I2, ...
Quindi il tuo set di dati potrebbe assomigliare a questo:
Una rete neurale (NN) genera un punteggio per ogni possibile posizione orizzontale (spesso chiamata fase temporale t in letteratura) dell'immagine. È simile a questo per un'immagine con larghezza 2 (t0, t1) e 2 caratteri possibili ("a", "b"):
| t0 | t1
--+-----+----
a | 0.1 | 0.6
b | 0.9 | 0.4
Per addestrare un tale NN, è necessario specificare per ogni immagine in cui un carattere del testo di verità di terra è posizionato nell'immagine. Ad esempio, pensa a un'immagine che contiene il testo "Ciao". Ora devi specificare dove inizia e finisce la "H" (es. "H" inizia dal decimo pixel e arriva fino al venticinquesimo pixel). Lo stesso per "e", "l, ... Sembra noioso ed è un duro lavoro per grandi set di dati.
Anche se in questo modo sei riuscito ad annotare un set di dati completo, c'è un altro problema. L'NN genera i punteggi per ciascun personaggio in ogni fase, vedere la tabella che ho mostrato sopra per un esempio di giocattolo. Ora potremmo prendere il personaggio più probabile per ogni passaggio temporale, questo è "b" e "a" nell'esempio giocattolo. Ora pensa a un testo più grande, ad esempio "Ciao". Se lo scrittore ha uno stile di scrittura che utilizza molto spazio in posizione orizzontale, ogni personaggio occuperebbe più fasi temporali. Prendendo il personaggio più probabile per passo temporale, questo potrebbe darci un testo come "HHHHHHHHeeeellllllllloooo". Come dovremmo trasformare questo testo nell'output corretto? Rimuovere ogni personaggio duplicato? Questo produce "Helo", che non è corretto. Quindi avremmo bisogno di un postelaborazione intelligente.
CTC risolve entrambi i problemi:
- puoi addestrare la rete dalle coppie (I, T) senza dover specificare in quale posizione si verifica un personaggio usando la perdita CTC
- non è necessario postelaborare l'output, poiché un decodificatore CTC trasforma l'output NN nel testo finale
Come si ottiene questo risultato?
- introdurre un carattere speciale (CTC-vuoto, indicato come "-" in questo testo) per indicare che non viene visto alcun carattere in un determinato intervallo di tempo
- modificare il testo di verità di base da T a T 'inserendo spazi CTC e ripetendo i caratteri in tutti i modi possibili
- conosciamo l'immagine, conosciamo il testo, ma non sappiamo dove sia posizionato il testo. Quindi, proviamo solo tutte le possibili posizioni del testo "Ciao ----", "-Hi ---", "--Hi--", ...
- inoltre non sappiamo quanto spazio occupa ciascun personaggio nell'immagine. Quindi proviamo anche tutti i possibili allineamenti consentendo ai personaggi di ripetere come "HHi ----", "HHHi ---", "HHHHi--", ...
- vedi un problema qui? Naturalmente, se permettiamo a un personaggio di ripetere più volte, come possiamo gestire veri personaggi duplicati come la "l" in "Ciao"? Bene, basta inserire sempre uno spazio in mezzo in queste situazioni, ad esempio "Hel-lo" o "Heeellll ------- llo"
- calcola il punteggio per ogni possibile T '(cioè per ogni trasformazione e ogni combinazione di questi), somma su tutti i punteggi che producono la perdita per la coppia (I, T)
- la decodifica è semplice: scegli il personaggio con il punteggio più alto per ogni passaggio temporale, ad es. "HHHHHH-eeeellll-lll - oo ---", elimina i caratteri duplicati "H-el-lo", elimina gli spazi "Ciao", e noi sono fatti.
Per illustrare questo, dai un'occhiata alla seguente immagine. È nel contesto del riconoscimento vocale, tuttavia, il riconoscimento del testo è lo stesso. La decodifica produce lo stesso testo per entrambi i parlanti, anche se l'allineamento e la posizione del personaggio differiscono.
Ulteriori letture: