Você tem um conjunto de dados que contém:
- imagens I1, I2, ...
- textos da verdade básica T1, T2, ... para as imagens I1, I2, ...
Portanto, seu conjunto de dados pode ser algo assim:
Uma rede neural (NN) gera uma pontuação para cada posição horizontal possível (geralmente chamada de tempo t na literatura) da imagem. É algo parecido com isto para uma imagem com largura 2 (t0, t1) e 2 caracteres possíveis ("a", "b"):
| t0 | t1
--+-----+----
a | 0.1 | 0.6
b | 0.9 | 0.4
Para treinar esse NN, você deve especificar para cada imagem em que um caractere do texto de base da verdade esteja posicionado na imagem. Como exemplo, pense em uma imagem contendo o texto "Olá". Agora você deve especificar onde o "H" começa e termina (por exemplo, "H" começa no 10º pixel e vai até o 25º pixel). O mesmo para "e", "l, ... Isso parece chato e é um trabalho árduo para grandes conjuntos de dados.
Mesmo se você conseguiu anotar um conjunto de dados completo dessa maneira, há outro problema. O NN gera as pontuações de cada personagem em cada etapa do tempo; veja a tabela que mostrei acima para um exemplo de brinquedo. Agora, podemos pegar o personagem mais provável por etapa de tempo, isto é "b" e "a" no exemplo do brinquedo. Agora pense em um texto maior, por exemplo, "Olá". Se o escritor tiver um estilo de escrita que use muito espaço na posição horizontal, cada personagem ocupará vários intervalos de tempo. Tomando o caractere mais provável por etapa do tempo, isso pode nos dar um texto como "HHHHHHHHeeeellllllllloooo". Como devemos transformar esse texto na saída correta? Remover cada caractere duplicado? Isso produz "Helo", o que não está correto. Portanto, precisaríamos de um pós-processamento inteligente.
O CTC resolve os dois problemas:
- você pode treinar a rede a partir de pares (I, T) sem precisar especificar em qual posição um personagem ocorre usando a perda CTC
- você não precisa pós-processar a saída, pois um decodificador CTC transforma a saída NN no texto final
Como isso é alcançado?
- introduza um caractere especial (CTC-blank, denotado como "-" neste texto) para indicar que nenhum caractere é visto em um determinado intervalo de tempo
- modifique o texto da verdade fundamental T para T 'inserindo espaços em branco do CTC e repetindo os caracteres de todas as maneiras possíveis
- conhecemos a imagem, conhecemos o texto, mas não sabemos onde o texto está posicionado. Então, vamos tentar todas as posições possíveis do texto "Oi ----", "-Hi ---", "--Hi--", ...
- também não sabemos quanto espaço cada personagem ocupa na imagem. Então, vamos tentar todos os alinhamentos possíveis, permitindo que os caracteres se repitam como "HHi ----", "HHHi ---", "HHHHi--", ...
- você vê algum problema aqui? Obviamente, se permitirmos que um personagem se repita várias vezes, como lidamos com caracteres duplicados reais , como o "l" em "Olá"? Bem, basta sempre inserir um espaço em branco nessas situações, ou seja, "Hel-lo" ou "Heeellll ------- llo"
- calcular a pontuação para cada T 'possível (ou seja, para cada transformação e cada combinação delas), somar todas as pontuações que produzem a perda para o par (I, T)
- a decodificação é fácil: escolha o caractere com a maior pontuação para cada etapa do tempo, por exemplo, "HHHHHH-eeeellll-lll - oo ---", jogue fora os caracteres duplicados "H-el-lo", jogue fora os espaços em branco "Olá" e nós estão feitos.
Para ilustrar isso, dê uma olhada na imagem a seguir. É no contexto do reconhecimento de fala, no entanto, o reconhecimento de texto é o mesmo. A decodificação produz o mesmo texto para os dois alto-falantes, mesmo que o alinhamento e a posição do caractere sejam diferentes.
Leitura adicional: