Vous disposez d'un jeu de données contenant:
- images I1, I2, ...
- textes de vérité au sol T1, T2, ... pour les images I1, I2, ...
Votre jeu de données pourrait donc ressembler à ceci:
Un réseau neuronal (NN) produit un score pour chaque position horizontale possible (souvent appelée pas de temps t dans la littérature) de l'image. Cela ressemble à ceci pour une image de largeur 2 (t0, t1) et 2 caractères possibles ("a", "b"):
| t0 | t1
--+-----+----
a | 0.1 | 0.6
b | 0.9 | 0.4
Pour former un tel NN, vous devez spécifier pour chaque image où un caractère du texte de vérité au sol est positionné dans l'image. A titre d'exemple, pensez à une image contenant le texte "Bonjour". Vous devez maintenant spécifier où le "H" commence et se termine (par exemple, "H" commence au 10e pixel et va jusqu'au 25e pixel). La même chose pour "e", "l, ... Cela semble ennuyeux et est un travail difficile pour les grands ensembles de données.
Même si vous avez réussi à annoter un ensemble de données complet de cette manière, il y a un autre problème. Le NN génère les scores de chaque personnage à chaque pas de temps, voir le tableau que j'ai montré ci-dessus pour un exemple de jouet. Nous pourrions maintenant prendre le personnage le plus probable par pas de temps, c'est "b" et "a" dans l'exemple de jouet. Pensez maintenant à un texte plus grand, par exemple "Bonjour". Si l'écrivain a un style d'écriture qui utilise beaucoup d'espace en position horizontale, chaque caractère occupera plusieurs pas de temps. Prenant le caractère le plus probable par pas de temps, cela pourrait nous donner un texte comme "HHHHHHHHeeeellllllllloooo". Comment transformer ce texte en sortie correcte? Supprimer chaque caractère en double? Cela donne "Helo", ce qui n'est pas correct. Nous aurions donc besoin d'un post-traitement intelligent.
La CCT résout les deux problèmes:
- vous pouvez entraîner le réseau à partir de paires (I, T) sans avoir à spécifier à quelle position un caractère se produit à l'aide de la perte CTC
- vous n'avez pas à post-traiter la sortie, car un décodeur CTC transforme la sortie NN en texte final
Comment y parvient-on?
- introduire un caractère spécial (vide CTC, noté "-" dans ce texte) pour indiquer qu'aucun caractère n'est vu à un pas de temps donné
- modifier le texte de vérité au sol T à T 'en insérant des blancs CTC et en répétant les caractères de toutes les manières possibles
- nous connaissons l'image, nous connaissons le texte, mais nous ne savons pas où le texte est positionné. Essayons donc toutes les positions possibles du texte "Hi ----", "-Hi ---", "--Hi--", ...
- nous ne savons pas non plus combien d'espace chaque personnage occupe dans l'image. Essayons donc également tous les alignements possibles en permettant aux caractères de se répéter comme "HHi ----", "HHHi ---", "HHHHi--", ...
- voyez-vous un problème ici? Bien sûr, si nous autorisons un caractère à se répéter plusieurs fois, comment traitons-nous les vrais caractères en double comme le «l» dans «Bonjour»? Eh bien, insérez toujours un espace entre ces situations, par exemple "Hel-lo" ou "Heeellll ------- llo"
- calculer le score pour chaque T 'possible (c'est-à-dire pour chaque transformation et chaque combinaison de celles-ci), additionner tous les scores qui produisent la perte pour la paire (I, T)
- le décodage est facile: choisissez le caractère avec le score le plus élevé pour chaque pas de temps, par exemple "HHHHHH-eeeellll-lll - oo ---", jetez les caractères en double "H-el-lo", jetez les blancs "Bonjour", et nous sont fait.
Pour illustrer cela, regardez l'image suivante. C'est dans le contexte de la reconnaissance vocale, cependant, la reconnaissance de texte est tout de même. Le décodage produit le même texte pour les deux locuteurs, même si l'alignement et la position du caractère diffèrent.
Lectures complémentaires: