Partilhar via


Visão geral da análise de tinta

As APIs do InkAnalysis fornecem aos desenvolvedores do Tablet PC ferramentas poderosas para examinar programaticamente a entrada de tinta. A API classifica a tinta em categorias significativas, como palavras, linhas, parágrafos e desenhos.

Você pode usar cada classificação de várias maneiras, incluindo melhorar os resultados de reconhecimento para escrita manual.

Noções básicas de análise de tinta

Esta seção apresenta a tecnologia de análise de tinta da Plataforma Tablet PC e explica quando e como usá-la.

As APIs do InkAnalysis combinam efetivamente duas tecnologias distintas, mas complementares: reconhecimento de manuscrito e classificação de layout. A combinação destas duas tecnologias dá resultados definitivamente maiores do que as partes tomadas isoladamente.

O reconhecimento de manuscrito é a análise computacional da tinta digital manuscrita para retornar a interpretação baseada em caracteres em um determinado idioma. Ou seja, o reconhecimento de caligrafia é como o computador "lê" a caligrafia de uma pessoa.

A análise de tinta pode ser dividida em classificação de tinta e análise de layout. A classificação da tinta é a divisão computacional da tinta em unidades semanticamente significativas, como parágrafos, linhas, palavras e desenhos. A análise de layout é o exame computacional da entrada de tinta para determinar a posição da tinta na superfície de tinta e como os traços se relacionam entre si espacial e até semanticamente. Por exemplo, a análise de layout pode dizer que um traço ou marca de tinta é uma anotação ou uma chamada de atenção.

Reconhecimento

Um exemplo de como a combinação de reconhecimento com análise de tinta na API do InkAnalysis ajuda o desenvolvedor é a melhoria nos resultados de reconhecimento. Os mecanismos de reconhecimento de manuscrito do Tablet PC foram projetados principalmente para reconhecer uma única linha horizontal de tinta. No entanto, as pessoas tendem a escrever várias linhas ao tomar notas, e não é garantido que essas linhas sejam horizontais em relação à página. Com a API InkAnalysis, a tinta é pré-processada pelo analisador de tinta antes de ser enviada para o reconhecedor. A tinta analisada é transformada em horizontal antes de ser reconhecida, melhorando os resultados de reconhecimento.

Outros benefícios para o reconhecimento surgem de permitir que o analisador de escrita corrija a ordem incorreta dos traçados antes de enviar a escrita para o sistema de reconhecimento. Além disso, os resultados do reconhecimento estão agora disponíveis de forma seletiva. Ou seja, o desenvolvedor pode recuperar rapidamente os resultados de reconhecimento de uma única palavra, linha ou parágrafo em uma chamada.

Classificação da tinta

Há, é claro, uma variedade de cenários em que você pode manter os dados de tinta intactos, em vez de convertê-los imediatamente em texto. A análise de tinta também oferece benefícios aqui. Especificamente, as APIs do InkAnalysis oferecem a capacidade de dividir traços de tinta consoante se são de escrita ou de desenho. Os traços de tinta que são classificados como escrita são aqueles que compõem uma palavra ou caracteres. Todos os outros traços são desenhos. Isso fornece uma nova maneira de acessar dados de tinta, permitindo novos cenários de usuário. Por exemplo, pode implementar a seleção para que ela seja diferente com base no tipo de traçado em que o utilizador toca; se o utilizador tocar em um traçado de escrita, o aplicativo selecionará todo o conjunto de traçados que compõem a palavra, se o utilizador tocar em um traçado de desenho, o aplicativo selecionará apenas esse traçado.

Análise de layout

A análise de layout útil, na verdade, vai muito além da divisão relativamente simples da tinta em componentes de escrita e desenho.

A análise de tinta também inclui uma análise mais rica dos traços de escrita e desenho. Como um exemplo muito simples, pegue um blob de tinta como mostrado na ilustração a seguir.

duas linhas simples de caligrafia

Depois que a plataforma analisa esses traçados, ela retorna uma representação em árvore desses traços, conforme mostrado na ilustração a seguir. Para este caso simples, a árvore contém apenas informações de parágrafo, linha e palavra, mas a riqueza dessa árvore aumenta à medida que a complexidade do documento de tinta aumenta.

representação em árvore de raiz, parágrafo, linhas e palavras

Como essas informações agora estão separadas em unidades gerenciáveis, agora você pode criar recursos mais poderosos. Como exemplo, o aplicativo pode estender o recurso em que o usuário toca para selecionar uma palavra em um recurso no qual o usuário toca uma vez para selecionar a palavra, toca duas vezes para selecionar a linha inteira e toca três vezes para selecionar o parágrafo inteiro. Ao aproveitar a estrutura da árvore retornada pela operação de análise, o aplicativo pode relacionar a área explorada de volta a um traçado na árvore. Depois de a aplicação encontrar um traçado, pode subir pela árvore para determinar como e quais traçados vizinhos selecionar.

Selecionar uma linha inteira é um exemplo simplista dos benefícios da análise de tinta, mas as possibilidades se tornam grandes quando se consideram os diferentes tipos de estruturas hierárquicas que o analisador de tinta é capaz de detetar:

  • Listas ordenadas e não ordenadas
  • Formas
  • Comentários anotativos escritos em linha com o texto

Os tipos de recursos variam de aplicativo para aplicativo e são baseados nos requisitos e nos mecanismos de análise e reconhecimento de tinta disponíveis.

Principais recursos de análise de tinta

Os principais recursos da API do InkAnalysis incluem os seguintes recursos:

  • Análise incremental
  • Persistência
  • Proxy de dados
  • Reconciliação
  • Extensibilidade

Análise incremental

Quando os utilizadores finais trabalham com tinta digital, geralmente encaram-na como escrita à mão. A tinta está continuamente sujeita a operações de edição, como a adição de nova tinta, a exclusão da tinta existente e a modificação das propriedades da tinta, tudo feito da mesma forma que a caligrafia é continuamente editada. Essas operações de edição afetam os resultados da análise. Quando ocorrem edições, elas geralmente podem ser isoladas em seções do documento em momentos específicos. Por exemplo, suponha que um usuário escreva cinco linhas de tinta. A maneira padrão de os aplicativos analisarem a tinta é esperar até que o usuário termine de escrever todas as cinco linhas de tinta — um parágrafo, por exemplo — e, em seguida, analisar os resultados, de forma síncrona ou assíncrona.

Você pode otimizar o tempo total gasto analisando essas cinco linhas isolando as áreas que são analisadas enquanto estão sendo escritas e, em seguida, reanalisando apenas as partes dos resultados que foram alteradas. Depois que a primeira linha for analisada, ela nunca mais será reconhecida, a menos que seja modificada pelo usuário final. O reconhecimento da segunda linha é tratado como uma operação de reconhecimento independente.

Essa abordagem incremental funciona bem no nível da linha para as operações de reconhecimento, mas precisa funcionar em um nível mais alto para a operação de análise de tinta. Como o analisador de tinta pode detetar diferentes classificações de nível superior para essas cinco linhas de tinta (por exemplo, pode ser um parágrafo padrão ou cinco itens em uma lista), a abordagem incremental para o analisador de tinta é que ele tem que analisar essas estruturas superiores. Ou seja, depois que o analisador de tinta classifica a primeira linha de tinta como uma linha, ele verifica duas vezes se ela ainda é uma linha quando classifica a segunda linha. No entanto, o analisador de tinta isola essa verificação dupla para o parágrafo e ignora o primeiro parágrafo ao analisar um segundo parágrafo, tratando o segundo parágrafo como uma operação independente do analisador de tinta. Essa abordagem incremental à análise economiza drasticamente o tempo de processamento quando grandes quantidades de tinta já existem no aplicativo.

Persistência

A análise incremental funciona bem dentro de uma sessão ou instância de um objeto InkAnalyzer. No entanto, as APIs da plataforma Tablet PC de primeira geração não podem executar análises incrementais depois que a tinta é mantida no disco. A API do InkAnalysis permite salvar a tinta no disco juntamente com uma forma persistente dos resultados da análise. Os resultados da análise podem ser carregados quando a tinta é carregada e podem ser injetados numa nova instância de um InkAnalyzer. Uma nova instância do objeto InkAnalyzer tem os mesmos resultados que tinha anteriormente e agora pode aceitar quaisquer modificações como alterações incrementais no estado existente, em vez de analisar tudo novamente.

Proxy de dados

Muitas aplicações já têm algum tipo de estrutura documental existente nas suas aplicações; por exemplo, um gráfico ou uma base de dados. O InkAnalyzer também apresenta resultados de forma estruturada, numa árvore de objetos ContextNode. A estrutura do InkAnalyzer e a estrutura existente do aplicativo precisam interoperar em duas direções: os resultados são extraídos do do InkAnalyzer para o aplicativo e o estado é enviado do aplicativo para o InkAnalyzer.

Se fosse apenas necessário extrair os resultados do InkAnalyzer para a estrutura da aplicação, seria relativamente simples. Os aplicativos iterariam através da árvore de resultados e copiariam (integrariam) todas as partes dos resultados de que precisam em sua estrutura de dados existente. No entanto, como muitos aplicativos horizontais exigem análise incremental e persistência no disco, o problema se torna bidirecional. O estado (resultados anteriores) precisa ser extraído da estrutura do aplicativo e enviado para o InkAnalyzer.

Para atender a esse requisito, o InkAnalyzer contém uma série de eventos que ele aciona no momento apropriado durante uma operação de análise para permitir que as aplicações encaminhem a solicitação de dados de volta para suas estruturas existentes. Esses eventos são gerados somente para aqueles ContextNode objetos exigidos pela operação incremental.

Reconciliação

A maioria dos aplicativos desejará analisar a tinta em segundo plano para manter as interrupções na interface do usuário ao mínimo. Analisar a tinta em segundo plano causa problemas, no entanto, se o usuário alterar a tinta (ou tinta vizinha) que está sendo analisada. Por exemplo, se o usuário excluir a tinta durante a operação em segundo plano, a estrutura resultante refletirá o estado do documento quando a operação em segundo plano foi iniciada, em vez de quando foi concluída.

Para auxiliar os aplicativos, o InkAnalyzer reconcilia as diferenças no estado do documento entre o início e o fim da operação de análise. As alterações feitas pelo usuário ou aplicativo enquanto a análise está sendo executada em segundo plano sempre substituem os resultados calculados em segundo plano. Após a reconciliação, apenas as partes da estrutura de resultados que não entram em conflito com as alterações do documento são relatadas, e os traços conflitantes são marcados para análise futura. Na próxima vez que a operação de análise em segundo plano for executada, os resultados serão recalculados com base no novo estado.

O diagrama a seguir mostra esse processo. O tempo é expresso linearmente de cima para baixo no diagrama.

processo de reconciliação de alterações de estado do documento durante a operação de análise

  1. No momento 1 (t1), o aplicativo está coletando tinta do usuário final, incluindo qualquer tipo de modificação de tinta, como adicionar, remover ou modificar.
  2. Em t2, o aplicativo invoca a operação de análise em segundo plano. O InkAnalyzer determina qual tinta não tem resultados e qual tinta precisa ser verificada duas vezes. Ele copia os dados de tinta necessários para permitir que o thread em segundo plano seja executado de forma independente.
  3. No t3, o InkAnalyzer retorna a execução do thread da interface do usuário para o aplicativo. O InkAnalyzer cria um segundo fio, o fio de análise em segundo plano, e os motores de análise e reconhecimento de tinta analisam os dados de tinta copiados.
  4. Enquanto a operação de análise está ocorrendo no segundo thread em segundo plano, o usuário final continua a editar o documento, adicionando e removendo dados de traçado, em t4 e t5. Essas edições podem entrar em conflito com o trabalho que está sendo processado em segundo plano.
  5. Em t6, o thread de plano de fundo terminou a operação de análise e os resultados estão prontos. Antes de o InkAnalyzer comunicar os resultados ao aplicativo, ele executa um algoritmo de reconciliação para determinar se as edições feitas pelo usuário durante a operação de análise (t4 e t5) estão em conflito com os resultados. Se alguma colisão for detetada, os traçados de colisão são sinalizados para reanálise, que ocorre na próxima vez que o aplicativo invocar a operação de análise em segundo plano.
  6. Finalmente, em t7, com todas as colisões detetadas, o InkAnalyzer apresenta os resultados à aplicação.

Extensibilidade

As APIs do InkAnalysis permitem que novos tipos de mecanismos de análise sejam usados pelos aplicativos, de modo a evitar que o aplicativo tenha que reescrever todos os benefícios da API do InkAnalysis, incluindo reconciliação, proxy de dados, persistência e análise incremental.

Microsoft.Ink

Referência da Análise de Tinta