다음을 통해 공유


잉크 분석 개요

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

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

잉크 분석 기본 사항

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

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

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

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

인식

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

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

잉크 분류

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

레이아웃 분석

효과적인 레이아웃 분석은 단순히 잉크를 글씨 및 그림 구성 요소로 구분하는 것보다 훨씬 더 깊이 있는 분석을 제공합니다.

잉크 분석에는 쓰기 및 그리기 스트로크의 풍부한 분석도 포함됩니다. 매우 간단한 예로, 다음 그림과 같이 잉크 얼룩을 생각해 보세요.

간단한 두 줄의 필기

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

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

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

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

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

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

주요 잉크 분석 기능

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

  • 증분 분석
  • 고집
  • 데이터 프록시
  • 화해
  • 확장성

증분 분석

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

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

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

고집

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

데이터 프록시

많은 애플리케이션은 이미 애플리케이션에 일종의 기존 문서 구조를 가지고 있습니다. 예를 들어 그래프 또는 데이터베이스입니다. 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

잉크 분석 참조