Visão geral da análise de tinta

As APIs do InkAnalysis fornecem aos desenvolvedores de tablets ferramentas avançadas para examinar programaticamente a entrada à 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 manuscrito.

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. Combinar essas duas tecnologias fornece resultados definitivamente maiores do que as partes tiradas sozinhas.

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 manuscrito é como o computador "lê" o manuscrito de uma pessoa.

A Análise de Tinta pode ser dividida ainda mais em classificação de tinta e análise de layout. A classificação de 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 escrita à tinta e como os traços se relacionam entre si espacialmente e até semanticamente. Por exemplo, a análise de layout pode dizer que um determinado pedaço de tinta é uma anotação ou um chamado.

Reconhecimento

Um exemplo de como a combinação de reconhecimento com a análise de tinta na API inkAnalysis ajuda o desenvolvedor é a melhoria nos resultados do 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 fazer anotações, e essas linhas não têm garantia de serem horizontais em relação à página. Com a API inkAnalysis, a tinta é pré-processada pelo analisador de tinta antes de ser enviada ao reconhecedor. A tinta analisada é transformada em horizontal antes de ser reconhecida, melhorando os resultados do reconhecimento.

Outros benefícios para o reconhecimento são derivados de fazer com que o analisador de tinta corrija informações incorretas de ordem de traço antes de enviar a tinta para o reconhecedor. Além disso, os resultados do reconhecimento agora estão disponíveis de maneira seletiva. Ou seja, o desenvolvedor pode recuperar rapidamente os resultados do reconhecimento de uma única palavra, linha ou parágrafo em uma chamada.

Classificação à 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 inkAnalysis fornecem a capacidade de dividir traços de tinta de acordo com a escrita ou desenhos. Traços de tinta classificados como escritos 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, habilitando novos cenários de usuário. Por exemplo, você pode implementar a seleção para que ela seja diferente com base em qual tipo de traço o usuário toca; se um usuário tocar em um traço de gravação, o aplicativo selecionará todo o conjunto de traços que compõem a palavra, se o usuário tocar em um stoke de desenho, o aplicativo selecionará apenas esse traço.

Análise de Layout

A análise de layout útil realmente vai muito além do detalhamento relativamente simples da tinta em componentes de escrita e desenho.

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

duas linhas simples de manuscrito

Depois que a plataforma analisar esses traços, ela retornará uma representação de árvore desses traços, conforme mostrado na ilustração a seguir. Para esse 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 à tinta aumenta.

representação de á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. Por exemplo, o aplicativo pode estender o recurso no qual 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. Aproveitando a estrutura de árvore retornada pela operação de análise, o aplicativo pode relacionar a área tocada de volta a um traço na árvore. Depois que o aplicativo encontrar um traço, ele poderá percorrer a árvore para determinar como e quais traços 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 considera os diferentes tipos de estruturas hierárquicas que o analisador de tinta é capaz de detectar:

  • Listas ordenadas e não ordenadas
  • Formas
  • Comentários anotados escritos embutidos com o texto

Os tipos de recursos variam de aplicativo para aplicativo e são baseados em requisitos e nos mecanismos de reconhecimento e análise 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 usuários finais trabalham com tinta, eles geralmente o tratam como manuscrito. A tinta está continuamente sujeita a operações de edição, como a adição de tinta nova, exclusão de tinta existente e a modificação das propriedades de tinta, todas feitas da mesma forma que o manuscrito é editado continuamente. Essas operações de edição afetam os resultados da análise. Quando ocorrem edições, elas geralmente podem ser isoladas para seções do documento em pontos específicos no tempo. Por exemplo, suponha que um usuário grave cinco linhas de tinta. A maneira padrão que os aplicativos analisam a tinta é aguardar até que o usuário termine de escrever todas as cinco linhas de tinta — um parágrafo, por exemplo — e analisar os resultados de forma síncrona ou assíncrona.

Você pode otimizar o tempo geral gasto analisando essas cinco linhas isolando as áreas analisadas conforme elas estão sendo gravadas 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 de 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 detectar 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 precisa analisar essas estruturas mais altas. 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 no 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 para 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 em uma determinada 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 a análise incremental depois que a tinta é persistente no disco. A API inkAnalysis permite salvar tinta em disco junto 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 em uma nova instância de um InkAnalyzer. Uma nova instância do objeto InkAnalyzer tem o mesmo estado de 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

Muitos aplicativos já têm algum tipo de estrutura de documento existente em seus aplicativos; por exemplo, um grafo ou um banco de dados. O InkAnalyzer também apresenta resultados em um formulário estruturado, em uma árvore de objetos ContextNode . A estrutura InkAnalyzer e a estrutura existente do aplicativo precisam interoperar em duas direções: os resultados são extraídos do InkAnalyzer para o aplicativo e o estado é enviado por push do aplicativo para o InkAnalyzer.

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

Para atender a esse requisito, o InkAnalyzer contém uma série de eventos gerados no momento apropriado durante uma operação de análise para permitir que os aplicativos criem proxy da solicitação de dados de volta para suas estruturas existentes. Esses eventos são gerados apenas para os objetos ContextNode exigidos pela operação incremental.

Reconciliação

A maioria dos aplicativos desejará analisar a tinta em segundo plano para manter as interrupções da interface do usuário no mínimo. A análise de tinta em segundo plano causará 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 ajudar 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á em execução em segundo plano sempre substituem os resultados calculados em segundo plano. Após a reconciliação, somente 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 o processo. O tempo é expresso linearmente de cima para baixo no diagrama.

processo para reconciliar 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. Em t3, o InkAnalyzer retorna a execução do thread da interface do usuário para o aplicativo. O InkAnalyzer cria um segundo thread, o thread de análise em segundo plano e os mecanismos de reconhecimento e análise 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 editando o documento, adicionando e removendo dados de traço, 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 em segundo plano concluiu a operação de análise e os resultados estão prontos. Antes que o InkAnalyzer comunique os resultados ao aplicativo, ele executa um algoritmo de reconciliação para determinar se o usuário edita feitas enquanto a operação de análise estava sendo calculada (t4 e t5) entram em conflito com os resultados. Se alguma colisão for detectada, os traços de colisão serão sinalizados para nova análise, o que ocorrerá na próxima vez que o aplicativo invocar a operação de análise em segundo plano.
  6. Por fim, no t7, com todas as colisões detectadas, o InkAnalyzer apresenta os resultados para o aplicativo.

Extensibilidade

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

Microsoft.Ink

Referência de análise de tinta