잉크 분석 개요

InkAnalysis API는 태블릿 PC 개발자에게 프로그래밍 방식으로 잉크 입력을 검사할 수 있는 강력한 도구를 제공합니다. API는 잉크를 단어, 선, 단락 및 드로잉과 같은 의미 있는 범주로 분류합니다.

각 분류는 필기 인식 결과 향상을 포함하여 다양한 방법으로 사용할 수 있습니다.

잉크 분석 기본 사항

이 섹션에서는 태블릿 PC 플랫폼 잉크 분석 기술을 소개하고 사용 시기와 방법을 설명합니다.

InkAnalysis API는 두 가지 고유하지만 무료 기술인 필기 인식 및 레이아웃 분류를 효과적으로 결합합니다. 이러한 두 기술을 결합하면 단독으로 사용하는 부품보다 더 큰 결과를 얻을 수 있습니다.

필기 인식은 지정된 언어로 문자 기반 해석을 반환하기 위해 필기 디지털 잉크의 계산 분석입니다. 즉, 필기 인식은 컴퓨터가 사람의 필기를 "읽는" 방법입니다.

잉크 분석은 잉크 분류 및 레이아웃 분석으로 더 세분화할 수 있습니다. 잉크 분류는 잉크를 단락, 선, 단어 및 드로잉과 같은 의미 있는 단위로 계산하여 분할하는 것입니다. 레이아웃 분석은 잉크 입력의 계산 검사로 잉크 표면에서 잉크의 위치와 스트로크가 공간적, 심지어 의미상 서로 어떻게 관련되는지를 결정합니다. 예를 들어 레이아웃 분석을 통해 특정 잉크 조각이 주석 또는 콜아웃임을 알 수 있습니다.

인식

InkAnalysis API에서 인식과 잉크 분석의 조합이 개발자에게 어떻게 도움이 되는지에 대한 한 가지 예는 인식 결과의 개선입니다. 태블릿 PC 필기 인식 엔진은 주로 잉크의 단일 가로줄을 인식하도록 설계되었습니다. 그러나 사람들은 노트를 작성할 때 여러 줄을 쓰는 경향이 있으며 해당 줄은 페이지와 관련하여 가로로 보장되지 않습니다. InkAnalysis API를 사용하면 잉크 분석기가 잉크를 전처리한 후 인식기로 전송됩니다. 분석된 잉크는 인식되기 전에 수평으로 변환되어 인식 결과가 향상됩니다.

인식에 대한 다른 이점은 잉크 분석기가 인식기로 잉크를 보내기 전에 잘못된 스트로크 순서 정보를 수정하도록 함으로써 파생됩니다. 또한 이제 인식 결과를 선택적 방식으로 사용할 수 있습니다. 즉, 개발자는 한 번의 호출로 한 단어, 줄 또는 단락에 대한 인식 결과를 빠르게 검색할 수 있습니다.

잉크 분류

물론 잉크 데이터를 즉시 텍스트로 변환하는 대신 그대로 유지할 수 있는 다양한 시나리오가 있습니다. 잉크 분석은 여기에서도 이점을 제공합니다. 특히 InkAnalysis API는 쓰기 또는 드로잉 여부에 따라 잉크 스트로크를 분할하는 기능을 제공합니다. 쓰기로 분류되는 잉크 스트로크는 단어 또는 문자를 구성하는 스트로크입니다. 다른 모든 스트로크는 드로잉입니다. 이렇게 하면 새 사용자 시나리오를 사용하도록 설정하여 잉크 데이터에 액세스하는 새로운 방법을 제공합니다. instance 경우 사용자가 탭하는 스트로크 유형에 따라 선택 영역을 구현할 수 있습니다. 사용자가 쓰기 스트로크를 탭하면 애플리케이션은 단어를 구성하는 전체 스트로크 집합을 선택하고, 사용자가 그리기 스토크를 탭하면 애플리케이션에서 해당 스트로크만 선택합니다.

레이아웃 분석

유용한 레이아웃 분석은 실제로 잉크를 작성 및 그리기 구성 요소로 분석하는 비교적 간단한 분석을 훨씬 뛰어넘습니다.

잉크 분석에는 쓰기 및 그리기 스트로크의 풍부한 분석도 포함됩니다. 매우 간단한 예제로 다음 그림과 같이 잉크 Blob을 사용합니다.

간단한 두 줄의 필기

플랫폼에서 이러한 스트로크를 분석한 후 다음 그림과 같이 이러한 스트로크의 트리 표현을 반환합니다. 이 간단한 경우 트리에는 단락, 줄 및 단어 정보만 포함되지만 잉크 문서의 복잡성이 증가함에 따라 이 트리의 풍요로움이 증가합니다.

루트, 단락, 선 및 단어의 트리 표현

이 정보는 이제 관리 가능한 단위로 구분되므로 이제 더 강력한 기능을 만들 수 있습니다. 예를 들어 애플리케이션은 사용자가 탭하여 단어를 한 번 탭하여 단어를 선택하고, 두 번 탭하여 전체 줄을 선택하고, 세 번 탭하여 전체 단락을 선택하는 기능으로 단어를 선택하는 기능을 확장할 수 있습니다. 분석 작업에서 반환된 트리 구조를 활용하여 애플리케이션은 탭된 영역을 트리의 스트로크와 다시 연결할 수 있습니다. 애플리케이션에서 스트로크를 찾은 후 트리를 걸어서 선택할 인접 스트로크와 방법을 결정할 수 있습니다.

전체 줄을 선택하는 것은 잉크 분석의 이점에 대한 간단한 예이지만 잉크 분석기에서 검색할 수 있는 다양한 유형의 계층 구조체를 고려할 때 가능성이 커집니다.

  • 정렬된 목록 및 순서가 지정되지 않은 목록
  • 셰이프
  • 텍스트와 함께 인라인으로 작성된 주석 주석

기능 유형은 애플리케이션마다 다르며 요구 사항 및 사용 가능한 잉크 분석 및 인식 엔진을 기반으로 합니다.

주요 잉크 분석 기능

InkAnalysis API의 주요 기능에는 다음 기능이 포함됩니다.

  • 증분 분석
  • 지속성
  • 데이터 프록시
  • 조정
  • 확장성

증분 분석

최종 사용자는 잉크로 작업할 때 일반적으로 필기처럼 처리합니다. 잉크는 새 잉크 추가, 기존 잉크 삭제 및 잉크 속성 수정과 같은 편집 작업이 지속적으로 적용되며, 모두 필기가 지속적으로 편집되는 것과 동일한 방식으로 수행됩니다. 이러한 편집 작업은 분석 결과에 영향을 줍니다. 편집이 수행되면 일반적으로 특정 시점에 문서의 섹션으로 격리될 수 있습니다. 예를 들어 사용자가 5줄의 잉크를 쓴다고 가정합니다. 애플리케이션에서 잉크를 분석하는 표준 방법은 사용자가 5줄의 잉크(단락, instance)를 모두 작성할 때까지 기다린 다음, 동기적으로 또는 비동기적으로 결과를 분석하는 것입니다.

기록될 때 분석되는 영역을 격리한 다음 변경된 결과의 일부만 다시 분석하여 이러한 5줄을 분석하는 데 소요된 전체 시간을 최적화할 수 있습니다. 첫 번째 줄을 분석한 후에는 최종 사용자가 수정하지 않으면 다시 인식되지 않습니다. 두 번째 줄의 인식은 독립적인 인식 작업으로 처리됩니다.

이 증분 접근 방식은 인식 작업의 선 수준에서 잘 작동하지만 잉크 분석 작업에 대해 더 높은 수준에서 작동해야 합니다. 잉크 분석기는 이러한 5개의 잉크 줄(예: 표준 단락 또는 목록의 5개 항목일 수 있음)에 대해 서로 다른 상위 수준 분류를 검색할 수 있기 때문에 잉크 분석기의 증분 접근 방식은 이러한 높은 구조를 분석해야 한다는 것입니다. 즉, 잉크 분석기가 잉크의 첫 번째 줄을 선으로 분류한 후 두 번째 줄을 분류할 때 여전히 선인지 다시 확인합니다. 그러나 잉크 분석기는 이 이중 검사를 단락으로 격리하고 두 번째 단락을 분석할 때 첫 번째 단락을 무시하고 두 번째 단락을 독립적인 잉크 분석기 작업으로 처리합니다. 분석에 대한 이러한 증분 접근 방식은 애플리케이션에 많은 양의 잉크가 이미 있는 경우 처리 시간을 크게 절약합니다.

지속성

증분 분석은 지정된 세션 또는 InkAnalyzer 개체의 instance 내에서 잘 작동합니다. 그러나 1세대 태블릿 PC 플랫폼 API는 잉크가 디스크에 유지된 후 증분 분석을 수행할 수 없습니다. InkAnalysis API를 사용하면 지속적인 형태의 분석 결과와 함께 디스크에 잉크를 저장할 수 있습니다. 잉크가 로드될 때 분석 결과를 로드할 수 있으며 InkAnalyzer의 새 instance 삽입할 수 있습니다. 그런 다음 InkAnalyzer 개체의 새 instance 이전에 있던 것과 동일한 결과 상태를 가지며 이제 모든 항목을 다시 분석하는 대신 기존 상태에 대한 증분 변경으로 수정을 허용할 수 있습니다.

데이터 프록시

많은 애플리케이션에는 이미 애플리케이션에 일종의 기존 문서 구조가 있습니다. instance, 그래프 또는 데이터베이스의 경우 또한 InkAnalyzerContextNode 개체의 트리에 구조화된 형태로 결과를 표시합니다. InkAnalyzer 구조체와 애플리케이션의 기존 구조는 두 방향으로 상호 운용되어야 합니다. 즉, 결과가 InkAnalyzer에서 애플리케이션으로 끌어오고 상태가 애플리케이션에서 InkAnalyzer로 푸시됩니다.

InkAnalyzer의 결과를 애플리케이션의 구조로 끌어와야 하는 경우 비교적 간단합니다. 애플리케이션은 결과 트리를 반복하고 필요한 모든 결과를 기존 데이터 구조로 복사(통합)합니다. 그러나 많은 수평 애플리케이션에는 디스크에 대한 증분 분석 및 지속성이 필요하므로 문제는 양방향이 됩니다. 상태(과거 결과)는 애플리케이션의 구조에서 가져와 서 InkAnalyzer로 푸시해야 합니다.

이 요구 사항을 충족하기 위해 InkAnalyzer 에는 애플리케이션이 데이터에 대한 요청을 기존 구조로 다시 프록시할 수 있도록 분석 작업 중에 적절한 시간에 발생하는 일련의 이벤트가 포함되어 있습니다. 이러한 이벤트는 증분 작업에 필요한 ContextNode 개체에 대해서만 발생합니다.

조정

대부분의 애플리케이션은 백그라운드에서 잉크를 분석하여 사용자 인터페이스 중단을 최소한으로 유지하려고 합니다. 그러나 사용자가 분석 중인 잉크(또는 인접 잉크)를 변경하면 백그라운드에서 잉크를 분석하면 문제가 발생합니다. 예를 들어 사용자가 백그라운드 작업 중에 잉크를 삭제하는 경우 결과 구조는 백그라운드 작업이 시작된 시점이 아니라 문서 상태를 반영합니다.

애플리케이션을 지원하기 위해 InkAnalyzer 는 분석 작업의 시작과 끝 사이의 문서 상태 차이를 조정합니다. 분석이 백그라운드에서 실행되는 동안 사용자 또는 애플리케이션이 변경한 내용은 항상 백그라운드에서 계산된 결과를 재정의합니다. 조정 후에는 문서 변경 내용과 충돌하지 않는 결과 구조의 일부만 보고되고 충돌하는 스트로크는 향후 분석을 위해 태그가 지정됩니다. 다음에 백그라운드 분석 작업을 실행할 때 결과는 새 상태에 따라 다시 계산됩니다.

다음 다이어그램은 이 프로세스를 보여줍니다. 시간은 다이어그램에서 위에서 아래로 선형으로 표현됩니다.

분석 작업 중 문서 상태 변경 내용을 조정하는 프로세스

  1. 시간 1(t1)에서 애플리케이션은 추가, 제거 또는 수정과 같은 모든 종류의 잉크 수정을 포함하여 최종 사용자로부터 잉크를 수집합니다.
  2. t2에서 애플리케이션은 백그라운드 분석 작업을 호출합니다. InkAnalyzer는 결과가 없는 잉크와 다시 확인해야 하는 잉크를 결정합니다. 백그라운드 스레드를 독립적으로 실행할 수 있도록 필요한 잉크 데이터를 복사합니다.
  3. t3에서 InkAnalyzer 는 사용자 인터페이스 스레드 실행을 애플리케이션에 반환합니다. InkAnalyzer는 두 번째 스레드, 백그라운드 분석 스레드 및 잉크 분석 및 인식 엔진이 복사한 잉크 데이터를 분석합니다.
  4. 분석 작업이 두 번째 백그라운드 스레드에서 발생하는 동안 최종 사용자는 t4 및 t5에서 스트로크 데이터를 추가 및 제거하여 문서를 계속 편집합니다. 이러한 편집은 백그라운드에서 처리 중인 작업과 충돌할 수 있습니다.
  5. t6에서 백그라운드 스레드가 분석 작업을 완료했으며 결과가 준비되었습니다. InkAnalyzer는 결과를 애플리케이션에 전달하기 전에 조정 알고리즘을 실행하여 분석 작업이 계산되는 동안 사용자가 편집했는지 확인합니다(t4 및 t5)는 결과와 충돌합니다. 충돌이 감지되면 충돌하는 스트로크에 다시 분석 플래그가 지정됩니다. 이 플래그는 다음에 애플리케이션이 백그라운드 분석 작업을 호출할 때 발생합니다.
  6. 마지막으로 t7에서 모든 충돌이 감지되면 InkAnalyzer 는 결과를 애플리케이션에 제공합니다.

확장성

InkAnalysis API를 사용하면 애플리케이션이 조정, 데이터 프록시, 지속성 및 증분 분석을 포함하여 InkAnalysis API의 모든 이점을 다시 작성하지 못하도록 애플리케이션에서 새로운 유형의 분석 엔진을 사용할 수 있습니다.

Microsoft.Ink

잉크 분석 참조