OCR
이 문서는 SaigieVision을 통해 이미지를 'OCR(문자인식)' 하는 방법에 대해 설명합니다.
여러분이 앞서 제공된 Quick Start 를 끝냈다면, 'OCR'을 수행하는 방법은 그리 어렵지 않습니다.
아래 코드 블럭은 간단하게 OCR 검사 진행 방법에 대해서 설명합니다.
{
// Prepare
SrImage srImage = new SrImage(@"..\..\sample.png");
string modelPath = @"..\..\model.saigeocr";
int gpuIndex = 0;
// Initialize
OCREngine engine = new OCREngine(modelPath, gpuIndex);
// Model Info
ModelInfo model = engine.GetModelInfo();
// Option
OCROption option = engine.GetInferenceOption();
option.PolygonScoreThreshold = 0.9;
option.TextSizeRangeMin = 0;
option.TextSizeRangeMax = 4608;
option.MaxNumOfTextObjects = 0;
option.TextScoreThreshold = 0.6;
// option.TextFormatting.Length = 0;
// option.TextFormatting.EngLower[0] = true;
// option.TextFormatting.EngUpper[0] = true;
// option.TextFormatting.Kor[0] = true;
// option.TextFormatting.Number[0] = true;
// option.TextFormatting.Symbol[0] = false;
engine.SetInferenceOption(option);
// Inspection & Get Result
OCRResult result = engine.Inspection(srImage);
Console.WriteLine($"Contour Count:{result.TextObjects.Length}");
Console.WriteLine($"ImreadTime:{result.InspectionTime.ImreadTime}");
Console.WriteLine($"InferenceTime:{result.InspectionTime.InferenceTime}");
Console.WriteLine($"PostProcessingTime:{result.InspectionTime.PostProcessingTime}");
foreach (var textObjects in result.TextObjects)
{
Console.WriteLine($"Text:{textObjects.Text}");
Console.WriteLine($"TextScore:{textObjects.TextScore}");
Console.WriteLine($"TextSize:{textObjects.TextSize}");
Console.WriteLine($"ContourScore:{textObjects.ContourScore}");
}
// optional
srImage.Dispose();
}
Prepare
SrImage srImage = new SrImage(@"..\..\sample.png");
string modelPath = @"..\..\model.saigeocr";
int gpuIndex = 0;
OCREngine 을 사용하기 위해 필요한 모든 데이터를 준비하는 과정입니다. 일반적으로 아래와 같은 3가지를 요구합니다.
- 검사에 사용할 GPU
- 검사에 사용할 샘플 이미지들
- 검사에 사용할 모델( .saigeocr 파일)
SaigeVision은 NVIDIA사의 GPU만을 지원하고 있습니다.
GPU Index에 대해서는명령 프롬프트 (command)창을 통해nvidia-smi명령어를 입력하면 GPU의 index를 확인할 수 있습니다.
이미지는
SrImage객체를 통해 생성 가능합니다.8bit,16bit형태의 이미지를GrayScale,RGB,RGBA형태로 제공이 됩니다.
Initialize
OCREngine engine = new OCREngine(modelPath, gpuIndex)
OCREngine 생성자에서 .saigeocr 모델파일에 대한 경로와 GPU Index를 매개변수로 설정하여 생성합니다.
Model Info (Optional)
ModelInfo model = engine.GetModelInfo();
ModelInfo 는 .saigeocr 모델 파일에 대한 정보를 확인할 수 있습니다. 일반적으로 아래와 같은 정보를 확인할 수 있습니다.
- Network Type (어떤 종류의 딥러닝 네트워크를 사용했는지 나타냅니다)
- Classes Information (클래스 정보입니다. name, color에 대한 정보들을 확인할 수 있습니다.)
- Developer Version (모델을 학습할 때 사용한 SaigeVision Developer의 버전입니다.)
- Server Version (모델을 학습할 때 사용한 SaigeVision Developer의 구성 요소 중 서버의 버전입니다.)
- Module Version (모델을 학습할 때 사용한 SaigeVision Developer의 구성 요소 중 딥러닝 모듈의 버전입니다.)
- Roi Information (ROI 정보입니다.)
- Resize Factor (OCR전용, 인풋 이미지에 적용되는 리사이즈 비율입니다. 추론 이미지에도 동일하게 적용됩니다.)
- Crop Size (OCR전용, 학습 때 사용된 패치의 사이즈입니다. 추론 이미지와는 관련 없습니다)
- Image Resize (IAD 전용, 인풋 이미지에 적용되는 리사이즈 입니다. 추론 이미지에도 동일하게 적용됩니다)
자세한 내용은 Model Info 문서를 통하여 확인할 수 있습니다.
Module 은 .saigeocr 모델 파일에
Option (Optional)
OCROption option = engine.GetInferenceOption();
option.PolygonScoreThreshold = 0.9;
option.TextSizeRangeMin = 0;
option.TextSizeRangeMax = 4608;
option.MaxNumOfTextObjects = 0;
option.TextScoreThreshold = 0.6;
option.TextFormatting.Length = 0;
option.TextFormatting.EngLower[0] = true;
option.TextFormatting.EngUpper[0] = true;
option.TextFormatting.Kor[0] = true;
option.TextFormatting.Number[0] = true;
option.TextFormatting.Symbol[0] = false;
engine.SetInferenceOption(option);
OCROption 에서 GetInferenceOption() 을 통해서 옵션에 대해서 정보를 받을 수 있습니다.
SetInferenceOption() 을 통해서 옵션에 대해서 설정을 할 수 있습니다.
옵션은 아래와 같은 정보들을 설정할 수 있습니다.
Calc Time (추론 API 실행에 소요되는 시간을 세분화하여 출력할지 결정합니다.)
Batch Size (추론을 한 번 수행할 때 추론하는 이미지의 개수입니다.)
PolygonScoreThreshold (검출된 글자영역인 polygon score 값이 이 값보다 작으면 최종 결과에서 제외됩니다.)
TextSizeRangeMin (검출된 글자영역 크기의 유효범위 하한값입니다.)
TextSizeRangeMax (검출된 글자영역 크기의 유효범위 상한값입니다.)
MaxNumOfTextObjects (한 번에 출력할 수 있는 글자 오브젝트의 최대 검출 개수입니다.)
TextScoreThreshold (인식된 글자 오브젝트의 text score 값이 이 값보다 작으면 최종 결과에서 제외됩니다.)
TextFormatting.Length (인식하려는 글자의 수를 지정합니다.)
TextFormatting.EngLower (영소문자를 포함하는지 여부를 지정하는 변수입니다.)
TextFormatting.EngUpper (영대문자를 포함하는지 여부를 지정하는 변수입니다.)
TextFormatting.Kor (한글을 포함하는지 여부를 지정하는 변수입니다.)
TextFormatting.Number (숫자를 포함하는지 여부를 지정하는 변수입니다.)
TextFormatting.Symbol (기호를 포함하는지 여부를 지정하는 변수입니다. 지원하는 기호: ``.,'"·●°_~-+±=※#%&@:/!?(){}[]<>`)*
글자 수에 관계 없이 글자 집합을 지정하는 방식 (By Character Set)
length값을 0으로 설정합니다.- 각 문자집합 bool 배열의 첫 번째 값을 지정합니다.
- 예시: 영소문자, 숫자만 인식하는 경우
SaigeInferenceOption option;
option.TextFormatting.Length = 0;
option.TextFormatting.EngLower[0] = true;
option.TextFormatting.EngUpper[0] = false;
option.TextFormatting.Kor[0] = false;
option.TextFormatting.Number[0] = true;
option.TextFormatting.Symbol[0] = false;
글자 수와 패턴을 지정하는 방식 (By Character Pattern)
length값을 0 초과, MaxLenOfTextFormatting 이하로 설정합니다.- 각 문자집합 bool 배열의 0 ~
length-1까지의 값을 지정합니다. - 예시: 000가1234 (숫자 3자리, 한글 1자리, 숫자 4자리)
SaigeInferenceOption option;
option.TextFormatting.Length = 8;
SaigeInitTextFormatting(option.TextFormatting); // 모든 옵션값을 false로 초기화해주는 함수
for (int i = 0; i < options.TextFormatting.length; i++)
{
options.textFormatting.number[i] = true;
}
options.TextFormatting.number[3] = false;
options.TextFormatting.kor[3] = true;
자세한 내용은 OCR Option 문서를 통하여 확인할 수 있습니다.
Inspection & Result
OCRResult result = engine.Inspection(srImage);
Console.WriteLine($"Contour Count:{result.TextObjects.Length}");
Console.WriteLine($"ImreadTime:{result.InspectionTime.ImreadTime}");
Console.WriteLine($"InferenceTime:{result.InspectionTime.InferenceTime}");
Console.WriteLine($"PostProcessingTime:{result.InspectionTime.PostProcessingTime}");
foreach (var textObjects in result.TextObjects)
{
Console.WriteLine($"Text:{textObjects.Text}");
Console.WriteLine($"TextScore:{textObjects.TextScore}");
Console.WriteLine($"TextSize:{textObjects.TextSize}");
Console.WriteLine($"ContourScore:{textObjects.ContourScore}");
}
코드에서 볼수 있는 것처럼 'Inspection'을 수행하는 주 함수는 engine.Inspect()입니다. 모든 종류의 Engine들은 이러한 공통의 Inspect() 함수를 보유하고 있습니다. 또한, 다양한 사용을 위해 여러 형태로 중첩 되어 있습니다. 비동기 혹은 다수의 이미지들을 검사하는 등의 여러 시나리오에서 선택적으로 사용할 수 있습니다.
OCRResult 에서 결과에 대한 모든 정보를 확인할 수 있습니다. OCR 의 경우 아래와 같은 정보를 결과로 확인할 수 있습니다. 일부 결과 정보에 대해서는 OCRResult 에서 true로 반영해야 정보를 받아올 수 있습니다.
- Insepction Time (추론 API 실행에 소요된 시간을 밀리초 단위로 받아 옵니다.)
Optional
srImage.Dispose();
이 예제에서는 검사에 사용했던 Bitmap들을 더 이상 사용할 곳이 없이게 Dispose() 합니다.