콘텐츠로 이동

OCR.h

Go to the source code of this file.

OCR은 이미지에 존재하는 문자열의 위치를 Bounding Box 형태로, 해당 영역에 존재하는 문자열을 unicode 형태의 데이터로 반환하는 기능입니다.

SAIGE VISION에서는 검출된 문자열을 SaigeTextObject 구조체로 반환합니다. 해당 구조체는 문자열의 위치를 Polygon 형태의 점의 배열과 Polygon 위치의 신뢰도 점수, 인식된 글자의 확률적 점수와 검출된 문자열을 포함합니다.

추론 옵션

OCR 기능에는 다음과 같은 추론 옵션들이 존재합니다.

Inspection Size Width, Height

SaigeHandleConfig 구조체를 사용하여 핸들 생성 시 설정할 수 있는 옵션 중 하나입니다. SaigeInferenceOption::batchSize 와 마찬가지로, 핸들 생성 시 메모리 설정 등에 영향을 주는 옵션으로, 핸들 생성 이후 값을 변경할 수 없습니다. Segmentation 기능과 동일합니다.

52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// ExampleSegRuntime.cpp:54

SaigeInferenceHandle handle = nullptr;
SaigeInferenceHandle handle2 = nullptr;
SaigeInferenceHandle handle3 = nullptr;
SaigeHandleConfig config;
config.inspectionSizeHeight = 2496;
config.inspectionSizeWidth = 2496;
unsigned int handleFlags = 0;
if (optimize) {
    handleFlags |= SAIGE_OPTIMIZE_HANDLE;
}
retval = SaigeCreateInferenceHandle(&handle, kProjectTypeSEG, trainedModelPath2.c_str(),
                                    1, &config, handleFlags);
if (retval < 0) {
    std::cerr << "SaigeCreateInferenceHandle failed - " << SaigeStrError(retval) << std::endl;
    return retval;
}

retval = SaigeCreateInferenceHandle(&handle2, kProjectTypeSEG, trainedModelPath.c_str(),
                                    0, &config, handleFlags);
if (retval < 0) {
    std::cerr << "SaigeCreateInferenceHandle failed - " << SaigeStrError(retval) << std::endl;
    return retval;
}

retval = SaigeCreateInferenceHandle(&handle3, kProjectTypeSEG, trainedModelPath.c_str(), 1,
                                    &config, handleFlags);
if (retval < 0) {
    std::cerr << "SaigeCreateInferenceHandle failed - " << SaigeStrError(retval) << std::endl;
    return retval;
}

검출 영역 옵션

OCR의 글자 영역을 검출하는 단계에서 적용되는 옵션입니다. 이 옵션들은 검출된 글자 영역을 필터링하는데 사용됩니다.

글자 인식 옵션

OCR의 글자 인식 단계에서 적용되는 옵션입니다. 이 옵션들은 인식된 글자를 점수나 특정 문자열 패턴을 기준으로 필터링하는데 사용됩니다.

133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
// ExampleOCRRuntime.cpp:135

/*options->textFormatting.length = 5;
SaigeInitTextFormatting(options->textFormatting);
for (int i = 0; i < options->textFormatting.length; ++i) {
    options->textFormatting.engUpper[i] = true;
    options->textFormatting.number[i] = true;
}

retval = SaigeSetInferenceOption(handle, options, SAIGE_SET_TEXT_FORMATTING);
if (retval < 0) {
    std::cerr << "SaigeGetInferenceOption() failed - " << SaigeStrError(retval) << std::endl;
    SaigeDestroyInferenceHandle(handle);
    SaigeDestroyInferenceResult(result);
    return retval;
}*/
/* options->oversizedImageHandling = SAIGE_RESIZE_TO_FIT;
 retval = SaigeSetInferenceOption(handle, options, SAIGE_SET_OVERSIZED_IMAGE_HANDLING);
 if (retval < 0) {
     std::cerr << "SaigeGetInferenceOption() failed - " << SaigeStrError(retval) << std::endl;
     SaigeDestroyInferenceHandle(handle);
     SaigeDestroyInferenceResult(result);
     return retval;
 }*/

추론 결과

검출된 문자열을 받아오기 위해서 아래와 같이 문자열의 개수를 먼저 받아온 후, SaigeTextObject 구조체 배열을 사용하여 문자열 정보를 받아옵니다. 여기서는 C++의 STL vector를 사용하여 메모리 할당/해제를 vector 에서 처리하도록 하였습니다.

264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
// ExampleOCRRuntime.cpp:266

int numTextObject;
long long imreadTime, inferenceTime, postProcessingTime;
std::vector<SaigeTextObject> textObjects;
retval = SaigeGetInferenceResultNumOfTextObjects(result, &numTextObject);
if (retval < 0) {
    std::cerr << "SaigeGetInferenceResultNumOfTextObjects() failed - "
              << SaigeStrError(retval) << std::endl;
    SaigeDestroyInferenceHandle(handle);
    SaigeDestroyInferenceResult(result);
    return retval;
}
textObjects.resize(numTextObject);
retval = SaigeGetInferenceResultTextObjects(result, textObjects.data());
if (retval < 0) {
    std::cerr << "SaigeGetInferenceResultTextObjects() failed - " << SaigeStrError(retval)
              << std::endl;
    SaigeDestroyInferenceHandle(handle);
    SaigeDestroyInferenceResult(result);
    return retval;
}