실제로 OCR 모델을 사용해 텍스트 인식을 시도할 때 모델이 텍스트를 잘 읽어내지 못 할 수도 있는데, 모델이 내가 제공한 이미지에 대해 적절한 성능을 보이지 못 하는 데에는 다양한 이유가 있어요. 만약 내가 아주 복잡하고 난해한 폰트를 사용한다거나 아주 드문 언어를 사용하는 게 아니라면, 성능을 향상시키기 위해 모델을 새로 학습시킬 필요도 없고, 딱히 도움이 되지도 않을 거예요. 대신, 모델이 문자를 더 잘 읽을 수 있도록 이미지를 처리해 보여줌으로써 원하는 성능을 얻을 수 있습니다.
이번 세션에서는 바로 이런 전처리 방법들에 대한 이론적 내용을 다룰 거예요.
Image Processing
많은 OCR 모델은 실제 OCR을 수행하기 전에 내부적으로 여러 이미지 처리 작업을 수행합니다. 사실 대부분의 상황에서는 이 작업을 매우 잘 수행하지만, 때론 이 작업만으로는 부족하거나 정확도를 저하시키는 경우도 있어요. 만약 모델이 내부적으로 실시한 이미지 처리의 결과가 부적절하다면, 직접 이미지를 전처리함으로써 성능을 끌어올릴 수 있어요.
Inverting images
이미지의 밝은 부분과 어두운 부분을 반전시키는 방법입니다. 어떤 모델은 버전에 따라 어두운 배경에 있는 밝은 글자를 제대로 처리하지 못 하기도 해서, 이런 경우 이미지를 반전시켜 입력하는 것만으로 문제를 해결할 수 있습니다.
Rescaling
이미지의 해상도가 너무 높거나 낮은 경우 성능에 영향을 미칠 수 있어요. 사용하고자 하는 모델에 적절한 해상도로 조절해주어야 합니다. 예를 들어 tesserart의 경우, 이미지의 DPI가 최소 300 DPI일 때 최고의 성능을 발휘합니다. DPI가 낮은 이미지는 텍스트 인식 정확도가 떨어질 수 있으며, 특히 작은 글씨나 세밀한 디테일이 있는 경우 더 영향을 많이 받습니다.
Binarisation
이미지를 흑백으로 이진화하는 것은 모델이 내부적으로 수행하는 작업이지만, 이미지의 밝기가 고르지 않거나 배경이 복잡한 패턴을 가지는 경우 이 작업만으로 충분하지 않을 수 있습니다. 이런 경우, 다른 이진화 방법을 사용해 추가적으로 이진화를 진행할 수 있어요.
Noise Removal
노이즈는 인식하고자 하는 것을 모호하게 만드는, 이미지의 불필요한 부분들을 말합니다. 예를 들면, 스캔한 문서의 뒷면의 글씨가 비쳐보이는 경우 비친 글씨들이 노이즈인 거죠. 비친 글씨는 비침의 정도에 따라 이진화 과정에서 제거되지 않고 남아 문서의 텍스트 인식에 방해가 될 수 있어요. 따라서, Gaussian 블러, 중간값 필터, 또는 이진화 전에 노이즈를 줄이기 위한 스무딩(smoothing) 필터를 사용해 제거해줌으로써 모델의 성능을 개선할 수 있습니다.
Dilation and Erosion
두꺼운 문자나 얇은 문자(특히 세리프가 있는 문자)는 인식 정확도를 낮출 수 있어요. 따라서 문자의 두께를 적절하게 조절해주면 좋습니다.
- Dilation
문자의 크기를 키우는 작업입니다. 문자가 너무 얇거나 세리프가 있는 경우, 팽창을 통해 문자를 더 두껍게 만들어 인식할 수 있도록 할 수 있습니다. - Erosion
문자의 크기를 줄이는 작업입니다. 오래된 문서에서 잉크 번짐 현상 때문에 문자가 뭉개진 경우, 침식을 사용하여 문자를 원래의 두께로 축소할 수 있습니다.
Deskewing
페이지가 너무 기울어져있는 경우 Tesseract이 line segmentation을 제대로 수행할 수 없는데, 결과적으로 OCR 결과에 심각한 영향을 미칠 수 있습니다. 이 문제를 해결하기 위해 페이지 이미지를 회전시켜 텍스트 줄이 수평으로 정렬되도록 해야 합니다.
Page segmentation method
Tesseract는 기본적으로 전체 페이지 텍스트를 예상하여 이미지를 분할합니다. 대부분의 경우 텍스트는 전체 페이지에 걸쳐 left-right, top-bottom 형태로 나타나기 때문에 문제가 없지만, 내가 어떤 OCR 프로젝트를 진행하느냐에 따라 주어지는 이미지의 일부만 처리하거나 다른 방식으로 페이지를 분할할 필요가 있을 수 있어요. 예를 들어 텍스트가 전체 페이지에 걸쳐 세로로 흐르거나, 원형으로 배치되어있는 이미지를 인식하고자 할 수 있잖아요?
이런 경우, tesserart의 --psm (Page Segmentation Mode) 인자를 사용해 다른 분할 모드를 시도해볼 수 있습니다.
Dictionaries, word lists, and patterns
Tesseract는 기본적으로 문장 단위로 단어를 인식하도록 설계되어있어요. 그러나 영수증, 가격 목록, 코드와 같은 특정 유형의 텍스트를 인식할 때는 몇 가지 설정을 조절해 정확도를 향상시킬 수 있습니다.
- 사전 비활성화
Tesseract는 기본적으로 사전(dictionaries)을 사용해 단어를 인식합니다. 만약 텍스트가 사전 단어가 아닌 경우가 많다면, 사전을 비활성화하면 인식률이 향상될 수 있어요. 사전을 비활성화하려면 구성 변수 load_system_dawg와 load_freq_dawg를 모두 false로 설정하면 됩니다. - 단어 목록 추가
Tesseract의 단어 목록에 특정 단어를 추가하여 인식을 개선할 수 있습니다. 이는 특정 입력 유형을 예상할 때 유용합니다. 예를 들어, 영수증이나 가격 목록의 경우, 자주 등장하는 단어나 패턴을 단어 목록에 추가해볼 수 있어요. - 문자 화이트리스트 설정
만약 인식할 문자의 집합이 정해져있다면, tessedit_char_whitelist 구성 변수를 사용해 인식할 문자를 제한할 수 있습니다. 예를 들어 숫자만 포함된 텍스트를 인식할 경우, 이 변수를 설정하여 숫자만 인식하도록 할 수 있습니다.
'Study > Deep Learning' 카테고리의 다른 글
[OCR] #4_Naver Clova OCR API 네이버 클로바 OCR 사용해보기 (0) | 2024.08.05 |
---|---|
[OCR] #3_Python Practice Tesseract & OCR 파이썬 실습 (0) | 2024.08.02 |
[OCR] #1_OCR Intro OCR이란 (0) | 2024.08.01 |
[Object Detection] #2_OpenCV & YOLOv8 & DeepSORT 객체탐지와 객체추적 (0) | 2024.08.01 |
[Object Detection] #1_Object Detection Intro 객체탐지란 (0) | 2024.07.31 |