O que é Classificação Temporal Conexionista (CTC)?

15

Estou procurando fazer um projeto de reconhecimento óptico de caracteres (OCR). Depois de fazer algumas pesquisas, encontrei uma arquitetura que parece interessante: CNN + RNN + CTC. Eu estou familiarizado com redes neurais complicadas (CNN) e redes neurais recorrentes (RNN), mas o que é Classificação Temporal Conexionista (CTC)? Eu gostaria de uma explicação em termos leigos.

Ryan Zotti
fonte
3
Eu recomendo que você leia o artigo de origem: Graves, et al. (2006) Classificação temporal conexionista: rotulando dados de sequência não segmentada com redes neurais recorrentes, Anais da 23ª Conferência Internacional sobre Aprendizado de Máquina ( pdf ).
neo li

Respostas:

28

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:

insira a descrição da imagem aqui

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.

insira a descrição da imagem aqui

Leitura adicional:

atormentar
fonte
É um pouco confuso, pelo menos para mim, o que você inicialmente quer dizer com " texto de verdade básico para cada imagem T1, T2, ...". Você deve começar explicando isso. Além disso, não está muito claro, se você não estiver familiarizado com os conceitos, o que você quer dizer com "Uma Rede Neural (NN) gera uma pontuação para cada posição horizontal possível (passo t) da imagem". Como uma imagem tem etapas de tempo? Em resumo, algumas de suas declarações iniciais parecem assumir que você está ciente de alguns conceitos, que acabam sendo entendidos posteriormente nesta mesma resposta, mas, IMHO, você deve esclarecer esses conceitos.
nbro 3/09/18
Obrigado pelo feedback. Adicionei uma ilustração sobre o conjunto de dados e aprimorei a descrição. Além disso, o termo intervalo de tempo significa simplesmente "posição horizontal" ou coordenada x no contexto do reconhecimento de texto. O termo provavelmente se origina do reconhecimento de fala (uma tarefa semelhante), em que o intervalo de tempo se refere à posição no tempo no sinal de áudio.
Harry