딥러닝기반의 OCR에 대해 정리해보려 한다.
OCR = Optical Character Recognition , 이미지 내의 글자를 자동으로 인식하는 인공지능 기술
✔ OCR = Text detection(문자의 영역 검출) + Text recognition(검출된 영역의 문자 인식)
Text detection
: 일반적인 Object detection 태스크를 문자 찾아내기로 확장한 버전이라고 생각.
Text detection은 단순히 Object detection 기법뿐 아니라 Segmentation 기법도 동원되며, 문자가 가지는 특성도 고려
Text recognition
: 검출된 영역의 문자가 무엇인지를 인식해내는 과정
📍 Text detection
- 문자는 몇 개가 모여서 단어 혹은 문장을 이루고 있어서 이미지 내에서 문자를 검출해낼 때엔 검출하기 위한 최소 단위를 정해야 한다
- 위 그림은 https://arxiv.org/pdf/1704.03155v2.pdf 논문에서 소개된 다양한 Text detection 기법을 정리한 것
- 가로 방향(Horizontal)으로만 텍스트 박스를 구하는 방식이나 기울어지거나 세로 방향 등의 여러 방향(Multi-oriented)의 텍스트 박스를 구하는 방식이 다양하게 소개되고 있다
- 이미지 속에서 문장 단위로 위치를 찾을수도 혹은 단어나 글자 단위로 위치를 찾을 수도 있다
- 단어 단위의 탐지 : Object detection의 Regression 기반의 Detection 방법
- 글자 단위의 탐지 : Bounding box regression을 사용하는 대신 글자 영역을 Segmentation하는 방법으로 접근
- 두 가지 방법을 모두 활용한 방법도 있다
✔ 1. Regression
- TextBoxes는 2017년 AAAI에 공개된 논문
- 이미지 내에서 문자를 찾아내려는 방법에는 다양한 기법들이 활용
- 네트워크의 기본구조는 SSD ( 참고 : https://yeomko.tistory.com/20 )
갈아먹는 Object Detection [6] SSD: SIngle Shot Multibox Detector
지난 글 갈아먹는 Object Detection [1] R-CNN 갈아먹는 Object Detection [2] Spatial Pyramid Pooling Network 갈아먹는 Object Detection [3] Fast R-CNN 갈아먹는 Object Detection [4] Faster R-CNN 갈아..
yeomko.tistory.com
- 일반적으로 단어들은 가로로 길기 때문에 Aspect ratio(종횡비)가 크다. 이에 따라 몇 가지 변형을 준다. SSD에서는 Regression을 위한 Convolution layer에서 3x3 크기의 kernel을 갖는다
- 하지만 여기서는 긴 단어의 Feature를 활용하기 위해서 1x5로 convolution filter를 정의하여 사용
- Anchor box의 aspect ratio를 1, 2, 3, 5, 7로 만들고, 이에 vertical offset을 적용하여 세로 방향으로 촘촘한 단어의 배열에 대응하도록
➰ 종횡비(Aspect ratio) : 종횡비는 가로와 세로 길이의 비를 의미하며, 가로세로비, 영상비, 화면비 등으로 부르기도 한다. 일반적으로 16:9와 같이 '가로:세로'의 형태로 표현.
➰ offset : 일반적인 의미의 Offset이란 특정한 값에서 차이가 나는 값 또는 차이를 의미. offset과 오차가 다르다. offset은 차이가 목적에 의해 만들어진 것과 상황에 따라 자연스럽게 발생된 것을 모두 포함
-> Grid cell의 중앙을 기점으로 생성할 경우를 예로 든 것이 파란색(aspect ratio:1) 그리고 검은색 박스(aspect ratio:5).
그리고 이를 수직방향으로 옮겨서 촘촘하게 만들어준 것이 빨간색과 녹색. 수직방향으로 Anchor box의 중앙을 하나 더 둠으로써 세로로 촘촘하게 Anchor box를 배치할 수 있게 된다.
✔ 2. Segmentation
- Text 영역을 찾아내는 segmentation과 함께, 글자가 어느 방향으로 연결되는지를 같이 학습하여 Text 영역 간의 분리 및 연결을 할 수 있는 정보를 추가적으로 활용
- PixelLink의 전체적인 구조는 U-Net과 유사
- 그러나 output으로 총 9가지의 정보를 얻는다
- output 중 하나는 Text/non-text Prediction을 위한 class segmentation map으로 해당 영역이 Text인지 Non-text인지 예측값을 의미하는 2개의 커널을 가진다
- 나머지 8가지는 글자의 Pixel을 중심으로 인접한 8개의 Pixel에 대한 연결 여부를 의미하는 16개의 커널로 이루어진 Link Prediction map
- conv 1X1, 2(16) 형태의 레이어가 U-Net 구조로 연결되어, 인접 pixel간 연결 구조가 지속적으로 유지되도록 하는 모델 구조
- 이를 통해서 인접한 pixel이 중심 pixel과 단어 단위로 연결된 pixel인지, 아니면 분리된 pixel인지 알 수 있으므로, 문자 영역이 단어 단위로 분리된 Instance segmentation이 가능
✔ 3. 최근의 방법들
3.1. CRAFT
- CRAFT는 문자(Character) 단위로 문자의 위치를 찾아낸 뒤, 이를 연결하는 방식을 Segmentation 기반으로 구현한 방법
- 문자의 영역을 boundary로 명확히 구분하지 않고, 가우시안 분포를 따르는 원형의 score map을 만들어서 배치시키는 방법으로 문자의 영역을 학습
- 문자 단위 라벨을 가진 데이터셋이 많지 않기 때문에, 단어 단위의 정보만 있는 데이터셋에 대해 단어의 영역에 Inference를 한 후, 얻어진 문자 단위의 위치를 다시 학습에 활용하는 Weakly supervised learning을 활용
https://arxiv.org/abs/1904.01941
Character Region Awareness for Text Detection
Scene text detection methods based on neural networks have emerged recently and have shown promising results. Previous methods trained with rigid word-level bounding boxes exhibit limitations in representing the text region in an arbitrary shape. In this p
arxiv.org
3.2. Pyramid Mask Text Detector
- PMTD(Pyramid Mask Text Detector)는 Mask-RCNN의 구조를 활용하여 먼저 Text영역을 Region proposal network로 찾아낸다
- 그다음 Box head에서 더 정확하게 regression 및 classification을 하고 Mask head에서 Instance의 Segmentation을 하는 과정을 거친다
https://arxiv.org/pdf/1903.11800.pdf
Text recognition은 이어서...
https://journeysnote.tistory.com/51
[AIFFEL/GoingDeeper] OCR - Text recognition
https://journeysnote.tistory.com/50 [AIFFEL/GoingDeeper] OCR - Text detection 딥러닝기반의 OCR에 대해 정리해보려 한다. OCR = Optical Character Recognition , 이미지 내의 글자를 자동으로 인식하는 인공..
journeysnote.tistory.com
'AIFFEL > GoingDeeper-CV' 카테고리의 다른 글
[AIFFEL/GoingDeeper] CAM(Class Activation Map) (0) | 2022.04.20 |
---|---|
[AIFFEL/GoingDeeper] OCR - Text recognition (0) | 2022.04.13 |
[AIFFEL/GoingDeeper] Cutmix & Mixup Augmentation (0) | 2022.03.29 |
[AIFFEL/GoingDeeper] ResNet-34와 ResNet-50 Tensorflow 구현하기 (0) | 2022.03.25 |
[AIFFEL/GoingDeeper] VGG-16/VGG-19 Tensorflow 구현하기 (0) | 2022.03.22 |