메인 콘텐츠로 건너뛰기
개발자는 인식 솔루션에서 여러 엔진을 조합할 수 있습니다. 여러 엔진이 하나의 문자나 단어에 대해 서로 다른 인식 후보를 생성하는 경우, 개발자는 후보들 간 투표를 통해 가장 적합한 결과를 선택할 수 있습니다. 투표 기능을 지원하기 위해 ABBYY FineReader Engine은 특수한 Voting API를 제공하며, 이를 통해 문자 또는 단어 인식의 여러 가설과 각 가설에 대응하는 가중치 값에 액세스할 수 있습니다. 투표 기능 외에도 개발자는 Voting API를 사용하여 자체 데이터베이스와 알고리즘으로 인식 결과를 검증하고 텍스트를 수정할 수 있습니다. 예를 들어, 문자를 조합해 단어를 만들거나 생성된 모든 가설을 검사할 수 있습니다.
Voting API는 손글씨/정자체 텍스트 인식에는 사용할 수 없습니다.
WordRecognitionVariants 객체는 단어에 대한 가설 모음을 나타내고, CharacterRecognitionVariants 객체는 문자에 대한 가설 모음을 나타냅니다. 이러한 모음의 요소는 각각 WordRecognitionVariant 객체와 CharacterRecognitionVariant 객체입니다. WordRecognitionVariant 객체는 단어에 대한 단일 가설을 나타내며, 가설의 텍스트, 모델 유형, 획의 평균 너비, 그리고 해당 가설이 사전에서 발견되었는지 여부에 대한 정보를 포함합니다. 이 객체의 GetCharParams method는 개별 문자의 매개변수에 액세스할 수 있게 해줍니다. CharacterRecognitionVariant 객체는 문자에 대한 단일 가설을 나타내며, 문자 신뢰도, 문자가 세리프 글꼴로 작성되었을 확률, 그리고 해당 문자가 위 첨자인지 아래 첨자인지에 대한 정보를 포함합니다.

단어 또는 문자에 대한 인식 후보를 가져오는 방법

단어 또는 문자에 대한 모든 인식 가설을 확인하려면 다음과 같이 하십시오.
  1. RecognizerParams 객체의 SaveWordRecognitionVariants 및 SaveCharacterRecognitionVariants 속성을 TRUE로 설정합니다. 그러면 FineReader Engine이 인식 결과에 인식 후보를 저장합니다.
  2. RecognizerParams 객체를 PageProcessingParams 객체(또는 이를 포함하는 DocumentProcessingParams 객체)의 하위 객체로 전달한 다음, 이를 ABBYY FineReader Engine의 인식 메서드 중 하나에 전달합니다.
  3. 인식 후 ICharParams::WordRecognitionVariants, ICharParams::CharacterRecognitionVariants 속성 및 IParagraph::GetWordRecognitionVariants 메서드를 통해 가설 컬렉션에 액세스할 수 있습니다.
이러한 메서드는 출력할 수 없는 문자(공백, 캐리지 리턴 등)와 인식되지는 않았지만 편집 중 텍스트에 추가된 문자에 대해서는 0을 반환합니다. 텍스트가 이전 ABBYY FineReader Engine 버전 중 하나로 인식된 경우에도 0이 반환됩니다. 가설 컬렉션에는 가장 가능성이 높은 것부터 가장 낮은 것까지 순위가 매겨진 인식 후보가 포함됩니다. RecognizerParams 객체의 SaveWordRecognitionVariants 또는 SaveCharacterRecognitionVariants 속성이 FALSE로 설정된 경우 해당 컬렉션에는 요소가 하나만 포함됩니다.

Windows 샘플

FREngine::IEnginePtr Engine;
FREngine::IFRDocumentPtr frDocument;
...
// DocumentProcessingParams 객체를 만들고 매개변수를 설정한 후,
// 인식 중에 사용합니다
FREngine::IDocumentProcessingParamsPtr dpp = Engine->CreateDocumentProcessingParams();
dpp->PageProcessingParams->RecognizerParams->SaveCharacterRecognitionVariants = VARIANT_TRUE;
dpp->PageProcessingParams->RecognizerParams->SaveWordRecognitionVariants = VARIANT_TRUE;
frDocument->Process( dpp );
// Layout 블록 순회
FREngine::ILayoutPtr layout = frDocument->Pages->Item(0)->Layout;
for (int i = 0; i < layout->Blocks->Count; i++) {
 if (layout->Blocks->Item(i)->Type == FREngine::BT_Text) {
  getVariants (layout->Blocks->Item(i));
 }
}
// 텍스트 블록의 모든 단어와 문자에 대한 가설을 생성하는 절차
void getVariants(FREngine::IBlockPtr& block)
{
 FREngine::ICharParamsPtr charParams = Engine->CreateCharParams();
 FREngine::IParagraphsPtr paragraphs = block->GetAsTextBlock()->Text->Paragraphs;
 for (int i = 0; i < paragraphs->Count; i++) {
  for (int j = 0; j < paragraphs->Item(i)->Length; j++) {
   paragraphs->Item(i)->GetCharParams(j, charParams);
   FREngine::ICharacterRecognitionVariantsPtr charVariants = charParams->CharacterRecognitionVariants;
   FREngine::IWordRecognitionVariantsPtr wordVariants = charParams->WordRecognitionVariants;
   if (wordVariants != 0) {
    for (int k = 0; k < wordVariants->Count; k++) {
     FREngine::IWordRecognitionVariantPtr wordVariant = wordVariants->Item(k);
    }
   }
   if (charVariants != 0) {
    for ( int k = 0; k < charVariants->Count; k++) {
     FREngine::ICharacterRecognitionVariantPtr charVariant = charVariants->Item(k);
    }
   }
  }
 }
}
FREngine.IEngine engine;
FREngine.IFRDocument document;
...
// DocumentProcessingParams 객체를 만들고 매개변수를 설정한 후,
// 인식 중에 사용합니다
FREngine.IDocumentProcessingParams dpp = engine.CreateDocumentProcessingParams();
dpp.PageProcessingParams.RecognizerParams.SaveCharacterRecognitionVariants = true;
dpp.PageProcessingParams.RecognizerParams.SaveWordRecognitionVariants = true;
document.Process( dpp );
// Layout 블록 순회
FREngine.ILayout layout = document.Pages[0].Layout;
for (int i = 0; i < layout.Blocks.Count; i++) {
 if (layout.Blocks[i].Type == FREngine.BlockTypeEnum.BT_Text) {
  getVariants (layout.Blocks[i]);
 }
}
// 텍스트 블록의 모든 단어와 문자에 대한 가설을 생성하는 절차
void getVariants(FREngine.IBlock block)
{
 FREngine.ICharParams charParams = engine.CreateCharParams();
 FREngine.IParagraphs paragraphs = block.GetAsTextBlock().Text.Paragraphs;
 for (int i = 0; i < paragraphs.Count; i++) {
  for (int j = 0; j < paragraphs[i].Length; j++) {
   paragraphs[i].GetCharParams(j, charParams);
   FREngine.ICharacterRecognitionVariants charVariants = charParams.CharacterRecognitionVariants;
   FREngine.IWordRecognitionVariants wordVariants = charParams.WordRecognitionVariants;
   if (wordVariants != null) {
    for (int k = 0; k < wordVariants.Count; k++) {
     FREngine.IWordRecognitionVariant wordVariant = wordVariants[k];
    }
   }
   if (charVariants != null) {
    for ( int k = 0; k < charVariants.Count; k++) {
     FREngine.ICharacterRecognitionVariant charVariant = charVariants[k];
    }
   }
  }
 }
}

CharConfidence, ErrorProbability, IsSuspicious의 차이점은 무엇인가요

문자가 신뢰할 수 없게 인식되어 검증이 필요한지 확인하려면, 해당 문자에 대해 PlainText 또는 CharParams 객체의 IsSuspicious 속성을 사용합니다. 이 값은 ErrorProbability를 기준으로 계산됩니다. 더 세분화된 구분이 필요하면 PlainText 또는 CharParams 객체의 ErrorProbability 속성을 사용할 수 있습니다. 이 속성은 문자가 잘못 인식되었을 것으로 추정되는 확률(0~100 범위)을 반환합니다. 이 값은 해당 문자가 포함된 단어가 사전에 있는지 여부와 같이, 문자가 나타나는 문맥을 고려합니다. 인식된 문자에 대한 문자 신뢰도(PlainText 객체의 CharConfidence 속성)와 모든 인식 후보에 대한 문자 신뢰도(CharacterRecognitionVariant 객체의 CharConfidence 속성)도 확인할 수 있습니다. 신뢰도는 문맥을 고려하지 않고, 개별 문자 이미지 하나만을 기준으로 한 정확도 추정치를 제공합니다. 서로 다른 문자에 대한 신뢰도 추정치는 서로 비교할 수 없으며, 신뢰도를 안전하게 사용할 수 있는 유일한 경우는 동일한 이미지(문자)에 대한 여러 인식 후보를 비교할 때입니다. 이러한 속성은 인식 과정 없이 얻은 기호에는 의미가 없습니다. 예를 들어 원본 PDF 파일에서 직접 가져온 기호가 여기에 해당합니다.

참고 항목

CharacterRecognitionVariant WordRecognitionVariant