├── EasyOCR.ipynb
├── OCR_CRAFT_PaperReview.ipynb
├── OCR_CRNN_PaperReview.ipynb
├── OCR정리.ipynb
├── PDF_to_Image.ipynb
├── README.md
├── Tesseract-OCR.ipynb
├── img
├── Generate_Confidence_Score.png
├── OCR_Flow.png
├── OCR_RPA.png
├── OCR_RPA와연계_업무자동화_.jpg
├── confidence.png
├── connected_component_labeling.png
├── craft.png
├── craft2.png
├── craft_loss.PNG
├── craft_model.jpeg
├── craft_model_architecture.png
├── crnn.png
├── easyocr_framework.jpeg
├── ocr_flow_5.png
├── polygon_generate.png
├── rotation.png
├── test_image.PNG
├── text_recogniton.png
└── wordlevel_to_characterlevel.png
├── ocr-image
├── 2020-kor-1_crop.png
├── 2020-kor-1_crop_result.png
├── test1.PNG
└── test2.PNG
├── ocr_paper
├── (2016)TextBoxes-A Fast Text Detector with a Single Deep Neural Network.pdf
├── (2017)AON-Towards Arbitrarily-Oriented Text Recognition.pdf
├── (2017)EAST-An Efficient and Accurate Scene Text Detector.pdf
├── (2018)ASTER-An Attentional Scene Text Recognizer with Flexible Rectification.pdf
├── (2018)An end-to-end TextSpotter with Explicit Alignment and Attention.pdf
├── (2018)DocUNet- Document Image Unwarping via A Stacked U-Net.pdf
├── (2018)FOTS-Fast Oriented Text Spotting with a Unified Network.pdf
├── (2018)Geometry-Aware Scene Text Detection with instance Transformation Network.pdf
├── (2018)multi-oriented scene text detection via corner localization and region segmentation.pdf
├── (2019)CRAFT-Character Region Awareness for Text Detection.pdf
└── (2019)What Is Wrong With Scene Text Recognition Model Comparisons Dataset and Model Analysis(2019).pdf
├── pdf
├── 2017학년도_국어_짝.pdf
├── 2017학년도_국어_홀.pdf
├── 2018학년도_국어_짝.pdf
├── 2018학년도_국어_홀.pdf
├── 2019학년도_국어_짝.pdf
├── 2019학년도_국어_홀.pdf
├── 2020학년도_국어_짝.pdf
├── 2020학년도_국어_홀.pdf
├── 아이유노래가사_궁서.pdf
└── 아이유노래가사_맑은고딕.pdf
└── result
└── out.html
/OCR_CRAFT_PaperReview.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "## CRAFT \n",
8 | "- Character Region Awareness for Text Detection\n",
9 | "- 전체 텍스트 대신 개별 문자를 인식하고, 상향식(Bottom-up)으로 문자들을 연결하는 방식\n",
10 | "\n",
11 | "- 장점\n",
12 | " - 큰 이미지에서 비교적 작은 Receptive field로 하나의 문자를 감지하기에 충분\n",
13 | " - 스케일이 가변적인 텍스트를 검출하는 데 있어서 견고 및 유연함\n",
14 | " - 기존 Bounding-Box Regression을 활용 Object detection 기반 접근 방식은 여러 앵커박스 필요하지만 CRAFT의 접근방식은 여러 개의 앵커박스가 필요x => Non-Maximum Suppression (NMS)과 같은 후처리 작업도 필요 X\n",
15 | "\n",
16 | "- 단점\n",
17 | " - 각 문자가 분리되어 있지 않고 연결되는 경우 학습 어려움\n",
18 | " - 아쉬운 FPS\n",
19 | " - 특정 국가의 언어 혹은 필기체에 학습이 어려움\n",
20 | "\n",
21 | "### Introduction\n",
22 | "- Scene text detection has attracted much attention in the computer vision field because of its numerous applications, such as instant translation, image retrieval, scene parsing, geo-location, and blind-navigation.\n",
23 | "\n",
24 | "- However, they may suffer in difficult cases, such as texts that are curved, deformed, or extremely long, which are hard to detect with a single bounding box. \n",
25 | " - 구부러지거나 변형되거나 극단적으로 긴 것들은 파악하기 어렵다\n",
26 | "\n",
27 | "- Character-level awareness has many advantages when handling challenging texts by linking the successive characters in a bottom-up manner. \n",
28 | " - 문자 수준의 인식은 바텀업 방식으로 문자로 연결하여 텍스트 처리 시 큰 이점을 가짐\n",
29 | "\n",
30 | "- we propose a novel text detector that localizes the individual character regions and links the detected characters to a text instance \n",
31 | " - 개별 문자 영역을 지역화하고, 감지 된 문자를 텍스트 인스턴스에 연결하는 새로운 텍스트 감지기를 제안\n",
32 | "\n",
33 | "- CRAFT (Character Region Awareness for Text Detection) is designed with a convolutional neural-network producing the character **region score** and **affinity score**\n",
34 | " \n",
35 | "- The Region score is used to localize individual characters in the image \n",
36 | " - 각각의 문자가 이미지에서 어느정도 위치인지\n",
37 | "- The Affinity score is used to group each character into a single instance \n",
38 | " - 해당 픽셀이 인접한 두 문자의 중심일 확률 - 이 점수를 기반으로 개별 문자가 하나의 단어로 그룹화될 것인지\n",
39 | "\n",
40 | "\n"
41 | ]
42 | },
43 | {
44 | "cell_type": "markdown",
45 | "metadata": {},
46 | "source": [
47 | "## Methodology\n",
48 | "- Our main objective is to precisely localize each individual character in natural images.\n",
49 | " - 각각의 이미지를 글자별로 분류하는 것이 주 목적\n",
50 | "- Predict character regions and the affinity between characters.\n",
51 | "- Since there is no public character-level dataset available, the model is trained in a weakly-supervised manner.\n",
52 | " - 문자 수준의 dataset이 없어서, 약한 지도학습으로 학습됨.\n",
53 | "\n",
54 | "## Architecture\n",
55 | "- Backbone : Convolutional network architecture based on VGG-16 with batch normalization\n",
56 | "- Decoding Part : Skip-connections (which is similar to U-Net)\n",
57 | "\n",
58 | "
\n"
59 | ]
60 | },
61 | {
62 | "cell_type": "markdown",
63 | "metadata": {},
64 | "source": [
65 | "## Ground Truth Label Generation (라벨링 과정)\n",
66 | "- For each training image, we generate the ground truth label for the region score and the affinity score with character-level bounding boxes.\n",
67 | " - 각 훈련 이미지에 대해 ground truth를 생성(region score, affinity score)\n",
68 | "- 1) Prepare a 2-dimensional isotropic Gaussian map\n",
69 | "- 2) Compute perspective transform between the Gaussian map region and each character box\n",
70 | "- 3) Warp Gaussian map to the box area\n",
71 | "\n",
72 | "- Affinity Score \n",
73 | " - 1) By drawing diagonal lines to connect opposite corners of each character box.\n",
74 | " - 2) We can generate two triangles which we will refer to as the upper and lower character triangles\n",
75 | " - 3) Each adjacent character box pair, an affinity box is generated by setting the centers of the upper and lower triangles as corners of the box\n",
76 | "\n",
77 | "\n",
78 | "\n",
79 | "### Ground Truth Label 문제점 및 해결법\n",
80 | "- 이러한 Ground Truth 를 매 이미지마다 만들기 힘듬 (데이터셋 부족)\n",
81 | "- 기존에 공개되어 있는 대부분의 데이터 집합들은 Word-level로 라벨링 되어있음\n",
82 | "\n",
83 | "- **데이터 부족에 대한 해결법 : 이를 해결하기 위해 Word-level Annotation이 포함된 데이터 집합을 Character-box로 생성하는 방법을 제안**\n",
84 | "- 즉 단어로 되어있는 데이터셋을 문자데이터로 찢어서 활용하는 법 제안.\n",
85 | " - Weakly Supervised learning\n",
86 | " - Psuedo Ground Truth\n",
87 | " \n",
88 | "
\n"
89 | ]
90 | },
91 | {
92 | "cell_type": "markdown",
93 | "metadata": {},
94 | "source": [
95 | "## Weakly-Supervised Learning\n",
96 | "- Unlike synthetic datasets, real images in a dataset usually have word-level annotations\n",
97 | " - 합성 데이터 이미지와 달리, 실제 이미지에는 일반적으로 단어 수준으로 되어있음.\n",
98 | "- we generate character boxes from each word-level annotation in a weakly-supervised manner\n",
99 | " - 우리는 weakly-supervised manner를 통해서 단어박스를 생성함 \n",
100 | "- When a real image with word-level annotations is provided, the learned interim model predicts the character region score of the cropped word images to generate character-level bounding boxes\n",
101 | " - 단어 수준 문자가 포함 된 실제 이미지가 제공되면 학습 된 중간 모델이 잘라낸 단어 이미지의 문자 영역 점수를 예측하여 문자 수준 경계 상자를 생성\n",
102 | "\n",
103 | "\n",
104 | "\n",
105 | "
\n"
106 | ]
107 | },
108 | {
109 | "cell_type": "markdown",
110 | "metadata": {},
111 | "source": [
112 | "\n",
113 | "## Word-Level annotation to Character-level annotation\n",
114 | "- 쉬운말로 textbox to charater box\n",
115 | "\n",
116 | "- 1) The word-level images are cropped from the original images\n",
117 | "- 2) The model(interim model) trained up to date predicts the region score\n",
118 | "- 3) The watershed algorithm is used to split the character regions\n",
119 | "- 4) The coordinates of the character boxes are transformed back into the original image coordinates using the inverse transform from the cropping step. (unwarp 과정)\n",
120 | "- 단어 단위 로부터 문자 단위를 도출한 후 각 Region score map과 Affinity Score map을 구함 (Pseudo-Ground Truth)\n",
121 | "- 이 Ground Truth는 Interim model에 의해 예측된 것이므로 Pseudo-Ground Truth라고 부름.\n",
122 | "\n",
123 | "\n"
124 | ]
125 | },
126 | {
127 | "cell_type": "markdown",
128 | "metadata": {},
129 | "source": [
130 | "\n",
131 | "## Pseudo Ground Truth\n",
132 | "- Pseudo Ground Truth는 Interim model로 예측된 결과임.\n",
133 | "- 따라서 이것을 온전히 믿으면 안되고 신뢰도를 통해 최적화 하여야 함.\n",
134 | "- When the model is trained using weak-supervision, we are compelled to train with incomplete pseudo-GTs.\n",
135 | " - 위에서 구한 방법으로 GT들이 생성되고 이것으로 훈련함. (이것이 정답 라벨이라고 생각하고 훈련해야함\n",
136 | " \n",
137 | "- If the model is trained with inaccurate region scores, the output might be blurred within character regions. \n",
138 | "\n",
139 | "- To prevent this we measure the quality of each pseudo-GTs generated by the model\n",
140 | " - 단 위에서 방법이 잘못될수도 있기 때문에 구한 GT에 대한 신뢰도 필요\n",
141 | "- There is a very strong cue in the text annotation, which is the word length\n",
142 | " - 신뢰도를 평가하는 좋은 기준 중 하나는 단어길이(word-length)이다.\n",
143 | "\n",
144 | "- 신뢰도평가 ex)\n",
145 | " - 원래는 6글자, Splitting Characters 했더니 5글자\n",
146 | " - L(w) = 6, L^c(w) = 5 ==> conf(w) = 6 - min(6, 6-5)/6 => 5/6\n",
147 | "\n",
148 | "\n",
149 | "\n",
150 | "- If the confidence score is below 0.5 ~ simply dividing the word region R(w) by the number of characters L(w)\n",
151 | " - 만일 신뢰도가 0.5 이하면, 단어간의 길이가 일정하다고 가정하고, 단어영역을 글자 길이로 나누어서 다시 진행함.\n",
152 | "\n",
153 | "- 최종 Generate Confidence Map\n",
154 | " - 픽셀 p에 대해 p가 원본 이미지에서 Word-Box 영역에 포함된다면 좌표와 대응되는 Confidence Map의 좌표값은 WordBox의 Confidence Score로 설정\n",
155 | " - 나머지 영역은 모두 1\n",
156 | " \n",
157 | "\n",
158 | "\n",
159 | "## 목적함수 (Loss)\n",
160 | "- Region score and Affinity score respectively\n",
161 | "- 각 픽셀 p에 대한 (Region / Affinity) 기댓값과 정답간의 유클리드\n",
162 | "- 각각의 Loss의 합이 총 Loss\n",
163 | "\n",
164 | "\n"
165 | ]
166 | },
167 | {
168 | "cell_type": "markdown",
169 | "metadata": {},
170 | "source": [
171 | "## 학습과정 요약\n",
172 | "\n",
173 | "- Character-level Annotation 데이터 집합의 부족함을 보완하기 위해 2단계의 학습을 수행\n",
174 | " - Ground Truth Label으로 1차 학습 : Interim model 생성\n",
175 | " - Pseudo-Ground Truth Label으로 2차 학습 : Weakly-Supervised Learning"
176 | ]
177 | },
178 | {
179 | "cell_type": "markdown",
180 | "metadata": {},
181 | "source": [
182 | "
\n",
183 | "\n",
184 | "## Word Level QuadBox Inference\n",
185 | "- 개별 문자를 단어로 연결하기 (Region Score와 Affinity Score를 이용한 결과물 도출\n",
186 | "- 목적에 따라 Character box, Word box, Polygon등 다양한 형태의 결과물 도출가능\n",
187 | "\n",
188 | "- Region Score와 Affinity Score를 통해 각 문자를 하나의 단어로 그룹화하는 방법\n",
189 | " - (1) The Binary map M covering the image is initialized with 0\n",
190 | " - 원본 이미지와 동일한 크기의 이진 맵 M(모든 값이 0이 되도록 초기화)\n",
191 | " - (2) 픽셀 p의 Region Score(p) or Affinity Score(p)가 각각 역치값 Tr(p), Ta(p)보다 클 경우 해당 픽셀을 1로 설정\n",
192 | " - (3) Connected Component Labeling (CCL) on M is performed\n",
193 | " - 이진 맵 M에 대해 Connected component Labeling을 수행\n",
194 | " - (4) QUADBox is obtained by finding a rotated rectangle with the minimum area enclosing the connected components corresponding to each of the labels.\n",
195 | " - 각 Label을 둘러싸는 최소 영역의 회전된 직사각형 찾기(OpenCV에서 제공하는 connectedComponents()와 minAreaRect()를 활용)\n",
196 | "\n",
197 | "\n",
198 | "\n",
199 | ""
200 | ]
201 | },
202 | {
203 | "cell_type": "markdown",
204 | "metadata": {},
205 | "source": [
206 | "## 모델 구조 특징\n",
207 | "- Fully Convolutional network architecture\n",
208 | " - Bilinear interpolation\n",
209 | " - Backwards convolution 두가지 방법 사용\n",
210 | "- VGG-16을 기반, Batch normalization을 사용\n",
211 | "- U-net처럼 UpConv를 통해 Low-level 특징을 집계하여 예측함"
212 | ]
213 | },
214 | {
215 | "cell_type": "markdown",
216 | "metadata": {},
217 | "source": [
218 | "## 참고문헌\n",
219 | "- https://github.com/clovaai/CRAFT-pytorch // Naver Clova CRAFT\n",
220 | "- https://medium.com/@msmapark2/character-region-awareness-for-text-detection-craft-paper-%EB%B6%84%EC%84%9D-da987b32609c // CRAFT 요약글\n",
221 | "- https://tkdguq05.github.io/2020/03/29/craft/ // CRAFT 요약\n",
222 | "- http://blog.daum.net/shksjy/198 // CCL (Connected Component Labeling)\n",
223 | "- https://data-newbie.tistory.com/187 // CRAFT 또다른 정리글"
224 | ]
225 | },
226 | {
227 | "cell_type": "code",
228 | "execution_count": null,
229 | "metadata": {},
230 | "outputs": [],
231 | "source": []
232 | }
233 | ],
234 | "metadata": {
235 | "kernelspec": {
236 | "display_name": "Python 3",
237 | "language": "python",
238 | "name": "python3"
239 | },
240 | "language_info": {
241 | "codemirror_mode": {
242 | "name": "ipython",
243 | "version": 3
244 | },
245 | "file_extension": ".py",
246 | "mimetype": "text/x-python",
247 | "name": "python",
248 | "nbconvert_exporter": "python",
249 | "pygments_lexer": "ipython3",
250 | "version": "3.7.5"
251 | }
252 | },
253 | "nbformat": 4,
254 | "nbformat_minor": 4
255 | }
256 |
--------------------------------------------------------------------------------
/OCR_CRNN_PaperReview.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "## CRNN vs RCNN\n",
8 | "\n",
9 | "- CRNN/RCNN은 CNN개념과 RNN 개념을 하나로 연결해서 설계된 모델\n",
10 | "- CRNN (Convolutional Recurrent Neural Network)\n",
11 | " - First CNN after RNN\n",
12 | "- RCNN (Recurrent Convolutional Neural Network)\n",
13 | " - First RNN after CNN\n",
14 | " \n",
15 | "## CRNN Paper\n",
16 | "- (2015)An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition \n",
17 | "\n",
18 | "## CRNN의 구조적 특징\n",
19 | "- (1) 기존은 부분적 학습 및 튜닝 -> End-to-End 학습 (전체를 한번에 학습하는것)\n",
20 | "- (2) 문자와 같은 디테일한 어노테이션을 필요로 하지 않고, 단어와 같은 시퀀스 라벨에서 직접적으로 학습할 수 있다.\n",
21 | "- (3) 임의의 길이의 시계열 데이터를 다루기 가능 (no character segmentation, horizontal scale normalization)\n",
22 | "- (4) 사전 정의된 어휘집에 갇혀있지 않으며, 정의된 어휘집 이든 아니든 좋은 성과를 보여줌\n",
23 | "- (5) 레이블 시퀀스를 생성 할 수 있는 RNN의 특성을 가지고 있음\n",
24 | "- (6) 이미지 데이터에서 유익한 특성을 직접 학습하는 DCNN과 같은 특성을 가지고, 사전처리 단계를 필요로 하지 않음\n",
25 | "\n",
26 | "
\n",
27 | "\n"
28 | ]
29 | },
30 | {
31 | "cell_type": "markdown",
32 | "metadata": {},
33 | "source": [
34 | "## 0. Introduction\n",
35 | "- 과거 DCNN\n",
36 | " - 이미지에 존재하는 문자들을 따로따로 인식 및 하나로 합쳐서 결과물을 내는 방식\n",
37 | " - 개별문자 분리 힘듬\n",
38 | "- 장점 및 의의\n",
39 | " - 왼쪽부터 순차적으로 이미지 인식 및 기존에 존재하는 단어와의 관계를 계산\n",
40 | " - 문자단위가 아닌 Word 단위로 학습 (Word를 잘게 분리하는거니까)\n",
41 | " - 시퀀스의 길이에 구애받지 않고 DCNN 보다 훨씬 적은 Parameter를 가짐\n",
42 | " - Preprocessing 및 Segmentation 등의 과정 불필요\n",
43 | "\n",
44 | "## Network Architecture\n",
45 | "- Convolutional layer\n",
46 | " - 각각의 input 이미지에서 자동으로 특징 시퀀스를 추출\n",
47 | " - 채널별로 RNN에 나눠서 입력\n",
48 | "\n",
49 | "- Recurrent layers\n",
50 | " - CNN에서 출력된 각각의 특징 시퀀스의 각 프레임에 대해 예측을 수행하기 위해 recurrent network가 생성\n",
51 | "\n",
52 | "- Transcription layer\n",
53 | " - RNN에 의한 각 프레임에 대한 예측을 라벨 시퀀스로 변환\n",
54 | " \n",
55 | "\n"
56 | ]
57 | },
58 | {
59 | "cell_type": "markdown",
60 | "metadata": {},
61 | "source": [
62 | "\n",
63 | "## 1. Feature Sequence Extraction\n",
64 | "- **이미지에서 Sequential 한 피처를 뽑아내는 것이 목적**\n",
65 | "- Fully Connected Layer를 제외한 Convolution Layer, Maxpooling 만을 이용\n",
66 | "- 모든 이미지는 같은 높이를 가지도록 크기가 조정 (각 열의 너비는 고정픽셀)\n",
67 | "- 전체 이미지를 나타내는 Representation을 찾고자함\n",
68 | " - 그러려면 해당 Representation을 동일한 전처리 필요 및 해당 방법 어려움\n",
69 | "- 특징 시퀀스내의 각 벡터는 그 지역에 대한 이미지 묘사임\n",
70 | "\n",
71 | "\n"
72 | ]
73 | },
74 | {
75 | "cell_type": "markdown",
76 | "metadata": {},
77 | "source": [
78 | "
\n",
79 | "\n",
80 | "## 2. Sequence Labeling\n",
81 | "- 순차적으로 예측하기 때문에, 왼쪽의 이미지에 대한 라벨로부터 영향을 받아 예측하게 됨 \n",
82 | " - 개별적으로 문자들을 독립적으로 인식하는 것보다 훨씬 안정적이고 효율적\n",
83 | "- **쪼개서 순차적으로 인식을 하기 때문에, 이미지 전체의 라벨을 나타내야 하는 모델처럼 시퀀스의 길이를 지정해주지 않아도 됨**\n",
84 | "- RNN은 역전파로 학습을 할 수 있기 때문에 Convolutional layer와 같이 학습을 반복 가능\n",
85 | "\n",
86 | "- 전달되어지는 차이값의 시퀀스가 맵으로 연결 \n",
87 | "- 피처맵을 피처시퀀스로 변환하는 작동을 반대로 진행 및 컨벌루션 레이어로 피드백\n",
88 | "- CNN과 RNN사이의 다리 역할인 Map-to-Sequence라고 불리는 커스텀 레이어를 생성\n",
89 | "- LSTM\n",
90 | " - RNN의 시퀀스가 길어지면 발생하는 그레디언트 소실문제 극복 위해 고안\n",
91 | " - memory cell, input gate, output gate, forget gate로 구성\n",
92 | " - memory cell은 과거의 문맥을 저장\n",
93 | " - input gate, output gate는 셀이 오랜시간동안 문맥을 저장 할 수 있게 함\n",
94 | " - 메모리에 있는 셀은 forget gate에 의해 삭제 될 수 있음\n",
95 | "- Bidirectional LSTM\n",
96 | " - 기존 LSTM은 과거의 문맥만 사용하던 방법에서 양방향성으로 상호보완\n",
97 | " - 두개의 LSTM을 결합하여 앞->뒤, 뒤->앞 진행\n",
98 | "\n",
99 | "\n",
100 | "\n",
101 | "
"
102 | ]
103 | },
104 | {
105 | "cell_type": "markdown",
106 | "metadata": {},
107 | "source": [
108 | "\n",
109 | "## 3. Transcription \n",
110 | "- RNN으로부터 만들어진 프레임당 예측 라벨값들을 시퀀스로 변환하는 과정\n",
111 | "\n",
112 | "- 조각들을 합치면서 프레임당 예측이 가장 높을 확률과 라벨 시퀀스를 찾음\n",
113 | " - ex) 첫번째 조각엔 a,e,g 가 높음 -> 두세번째 조각 붙이면서 a로 확정\n",
114 | "\n",
115 | " \n",
116 | "### 3-(1) Probability of label sequence\n",
117 | "- 시퀀스의 길이가 T라고 하고, 그 T개만큼의 라벨이 주어졌을 때 공백으로 인식되는 부분을 지우고 존재하는 단어로의 확률값 계산 가능\n",
118 | "\n",
119 | "### 3-(2) Transcription 두가지 방법\n",
120 | "- 사전이 있는 lexicon-based transcriptions\n",
121 | "- 사전이 존재하지 않는 lexicon-free\n",
122 | "\n",
123 | "- Lexicon은 라벨 시퀀스의 집합\n",
124 | " - 가장 확률값을 크게하는 단어 얻는 것\n",
125 | " - 사전이 존재하지 않는 lexicon-free 모드\n",
126 | " - 예측은 어떤 lexicon없이 만들어짐.\n",
127 | " \n",
128 | " - 어휘사전 기반 lexicon-based transcriptions모드\n",
129 | " - 예측은 가장 높은 가능성을 가진 라벨 시퀀스의 선택으로 만들어짐.\n",
130 | " \n",
131 | " - 두 단계를 거치는 이유\n",
132 | " - 시퀀스 라벨에 대해 확률값을 계산하고 선택하는 시간 비용이 크므로\n",
133 | " - Lexicon-free 방식으로 추정을 어느정도 한 후 거리기반 가까운 확률의 라벨 선택\n",
134 | " "
135 | ]
136 | },
137 | {
138 | "cell_type": "markdown",
139 | "metadata": {},
140 | "source": [
141 | "
\n",
142 | "\n",
143 | "## 참고문헌\n",
144 | "- https://soyoung-new-challenge.tistory.com/5\n",
145 | "- https://wujincheon.github.io/wujincheon.github.io/deep%20learning/2018/11/28/CRNN.html\n"
146 | ]
147 | }
148 | ],
149 | "metadata": {
150 | "kernelspec": {
151 | "display_name": "Python 3",
152 | "language": "python",
153 | "name": "python3"
154 | },
155 | "language_info": {
156 | "codemirror_mode": {
157 | "name": "ipython",
158 | "version": 3
159 | },
160 | "file_extension": ".py",
161 | "mimetype": "text/x-python",
162 | "name": "python",
163 | "nbconvert_exporter": "python",
164 | "pygments_lexer": "ipython3",
165 | "version": "3.7.5"
166 | }
167 | },
168 | "nbformat": 4,
169 | "nbformat_minor": 4
170 | }
171 |
--------------------------------------------------------------------------------
/OCR정리.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# # OCR (Optical Character Recognition)\n",
8 | "- 광학 문자 인식(OCR, Optical Character Recognition)은 사람이 쓰거나 기계로 인쇄한 문자의 영상을 이미지 스캐너로 획득하여 기계가 읽을 수 있는 문자로 변환하는 것\n",
9 | "\n",
10 | "## # OCR 4단계\n",
11 | "- 1단계(Pre-processing, 전처리)\n",
12 | "- **2단계(Text Detection. 글자탐지)**\n",
13 | "- **3단계 (Text Recognition, 글자 인식)**\n",
14 | "- 4단계 (Post-processing, 후처리)\n",
15 | "\n",
16 | "\n",
17 | "\n",
18 | "
\n",
19 | "\n",
20 | "## # 1. Pre-processing 단계\n",
21 | "- 문서를 디지털로 처리하는 과정에서는 잡음(noise), 왜곡(distort)으로 인해 인식률이 현저하게 낮아지는 경우가 많음. => **전처리 과정을 통한 인식률 개선 가능**\n",
22 | "- Grayscale 변환\n",
23 | "- 히스토그램 정규화\n",
24 | " - 밝기의 분포를 재분배해 명암 대비를 최대화하여 더 선명한 이미지를 가짐\n",
25 | "\n",
26 | "
\n",
27 | "\n",
28 | "## # 2. Text Detection 단계\n",
29 | "- **이미지에서 텍스트 영역을 골라내어 불필요한 계산을 줄임**\n",
30 | "- Convolution을 통한 FeatureMap 추출\n",
31 | "- rotation angle regression (회전 문제)\n",
32 | "\n",
33 | "\n",
34 | "- text인지 text가 아닌지에 대한 segmentation (=classification 이기도 함)\n",
35 | "- Detection이 끝나면 TextBox에 대한 ROI들을 출력 및 Crop 작업 진행\n",
36 | "\n",
37 | "### 2-1) three types of detection CNN\n",
38 | "- 1) type1 pyramid + multi prediction (ssd 같은)\n",
39 | "- 2) pyramid + feature fusion + multi-prediction \n",
40 | "- 3) pyramid + feature fusion + single prediction\n",
41 | "\n",
42 | "
\n",
43 | "\n",
44 | "## # 3. Text Recognition 단계\n",
45 | "- 이미지를 잘라낸 후 각 이미지가 어떤 글자를 포함하고 있는지 인식 필요\n",
46 | "- **Convolution layer Model과 Recurrent layer Model로 이루어짐**\n",
47 | "- language별로 당연히 모듈 따로 존재 / crop된 textbox를 언어별로 분류 실행 가능\n",
48 | "\n",
49 | "### 3-1) Convolution layer Model\n",
50 | "- Convolutional, Normalization연산, maxpool 연산 3가지로 이루어짐\n",
51 | "- 2단계와 마찬가지로 CNN이 사용 Shared CNN도 가능함\n",
52 | "- CNN 이미지를 Vertical(세로로)로 쪼개며, 글자마다 여러개의 Feature가 나옴\n",
53 | " - 쪼갠 Feature들을 내부적으로 alignment라고도 함.\n",
54 | "\n",
55 | "### 3-2) Recurrent layer Model\n",
56 | "- 그러한 alignment들을 sequence를 RNN을 통해 학습\n",
57 | "- 글자들이 쪼개진걸 다시 조합하기 위해서 decoder가 존재 \n",
58 | " - decoder를 위해 CTC Loss(Connectionist temporal classification loss)\n",
59 | " - decoder를 위해 Attention도 사용가능\n",
60 | "\n",
61 | "\n",
62 | "\n",
63 | "
\n",
64 | "\n",
65 | "## # 4. Post-processing 단계\n",
66 | "- 품질이 낮은 워드들 버리기 \n",
67 | "- 워드들을 합쳐 Sentence 생성\n",
68 | "- 맞춤법체크 보완 등 (ex. oat -> cat )"
69 | ]
70 | },
71 | {
72 | "cell_type": "markdown",
73 | "metadata": {},
74 | "source": [
75 | "\n",
76 | "## # OCR Paper\n",
77 | "- 크게 3종류\n",
78 | " - 1. TextDetection\n",
79 | " - 2. TextRecognition\n",
80 | " - 3. end to end ( 1. + 2. )\n",
81 | "\n",
82 | "### 필수 논문 List\n",
83 | "- (2016)TextBoxes: A Fast Text Detector with a Single Deep Neural Network\n",
84 | "- (2017)EAST: an Efficient and Accurate Scene Text Detector)\n",
85 | "- (2017)AON: Towards Arbitrarily-Oriented Text Recognition\n",
86 | "- (2018)FOTS: Fast Oriented Text Spotting with a Unified Network\n",
87 | "- (2018)Multi-Oriented Scene Text Detection via Corner Localization and Region Segmentation\n",
88 | "- (2018)Geometry-Aware Scene Text Detection with instance Transformation Network\n",
89 | "- (2018)An end-to-end TextSpotter with Explicit Alignment and Attention\n",
90 | "- (2018)DocUNet: Document Image Unwarping via A Stacked U-Net\n",
91 | "- (2018)ASTER-An Attentional Scene Text Recognizer with Flexible Rectification\n",
92 | "- (2019)CRAFT: Character Region Awareness for Text Detection\n",
93 | "- (2019)What Is Wrong With Scene Text Recognition Model Comparisons? Dataset and Model Analysis(사진 내 문자 인식 분야의 모델 비교시의 문제는 무엇인가?, 데이터셋 및 모델 분석, 네이버 Clova - ICCV 2019 Oral)\n",
94 | "\n",
95 | "### What Is Wrong With Scene Text Recognition Model Comparisons? Dataset and Model Analysis\n",
96 | "- 변환, 특성추출, 시퀀스, 예측 4개모듈로 구분\n",
97 | "- 변환 모듈은 TPS(Thin Plate Spline) 사용여부 (2)\n",
98 | "- 특성추출 모듈은 VGGNet, RCNN, ResNet (3)\n",
99 | "- 시퀀스 모듈은 BiLSTM 사용여부에 따라 (2)\n",
100 | "- 예측 모듈은 CTC(Connectionist Temporal Classification) 과 어텐션으로 구성 (2)\n",
101 | "\n",
102 | "- **따라서 4개 모듈조합은 전체 경우의 수가 2 x 3 x 2 x 2 = 24가지**로 모든 조합에 대한 실험을 진행\n",
103 | "- 논문에서 최고 정확도의 모델조합은 TPS-ResNet-BiLSTM-Attn (영문 단어기준 84%)\n",
104 | "- 한글문장 데이터로 실험한 결과 TPS-VGG-BiLSTM-Attn 으로 88.24% 의 정확도가 나왔다(박선우 님)\n"
105 | ]
106 | },
107 | {
108 | "cell_type": "markdown",
109 | "metadata": {},
110 | "source": [
111 | "## 정리 필요 링크\n",
112 | "- https://medium.com/@sunwoopark/%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%ED%95%9C%EA%B8%80%EB%AC%B8%EC%9E%A5-ocr-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-hclt-2019-bb9d17622412\n",
113 | "\n",
114 | "- https://ichi.pro/ko/dib-leoning-ocr-sijaghagi-21349313927965\n",
115 | "\n",
116 | "- https://medium.com/@aimap.marker/%EC%9D%B4%EB%AF%B8%EC%A7%80-%ED%95%A9%EC%84%B1%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EB%A7%9E%EC%B6%A4%ED%98%95-ocr-%EC%97%94%EC%A7%84-%EB%A7%8C%EB%93%A4%EA%B8%B0-632602e59571\n",
117 | "\n",
118 | "- ICDAR 2019 Task 1: Multi-script text detection 로 테스트"
119 | ]
120 | },
121 | {
122 | "cell_type": "markdown",
123 | "metadata": {},
124 | "source": [
125 | "## # OCR 컴피티션\n",
126 | "- 국제패턴인식 협회인 IAPR 주관의 국제 컴퓨터 문자인식 대회인 ICDAR 로버스트 리딩 컴피티션(ICDAR Robust Reading Competition) 챌린지\n",
127 | "\n",
128 | "
\n",
129 | "\n",
130 | "## # OCR 국산 오픈소스 OCR \n",
131 | "### Tesseract\n",
132 | "- Source Repository: https://github.com/tesseract-ocr/tesseract\n",
133 | "- 상대적으로 유구한 역사를 가진 Open Source OCR 툴 \n",
134 | "- HP에서 개발을 시작해서 Open Source화 한 이후 Google의 개발자들이 유지보수\n",
135 | "- C기반 개발 및 여러 wrapper library들도 풍부하게 존재 / 다양한 option 제공됨\n",
136 | "- 국문 폰트 3~4가지 정도로만 학습되었기 때문에 다양한 폰트로 추가 학습시 성능향상 기대\n",
137 | "\n",
138 | "- 단점\n",
139 | " - 속도가 느린편\n",
140 | " - GPU 지원이 안됨\n",
141 | "\n",
142 | "### EasyOCR\n",
143 | "- Source Repository: https://github.com/JaidedAI/EasyOCR\n",
144 | "- Tesseract보다 정확도 면에서도 향상\n",
145 | "- GPU 연산을 지원하기 때문에 성능(속도)면에서도 개선\n",
146 | "- 아파치 2.0으로 상용에도 이용 가능\n",
147 | "- 추가학습 용이 및 추가폰트 학습 가능\n",
148 | "- Naver에서 만들어 공개한 CRAFT라는 TextDetection 도구 이용\n",
149 | "\n",
150 | "### ocr_kor\n",
151 | "- Source Repository: https://github.com/parksunwoo/ocr_kor\n",
152 | "- 박선우, Naver에서 연구하여 공개한 Deep-text-recognition-benchmark를 한국어로 학습시킨 OCR 툴\n",
153 | "- Text Detection 부분이 없기 때문에 일반 문서의 OCR은 수행하지 못함\n",
154 | "- 학습 데이터 생성기를 제공하는 등 추가 학습이 가능한 형태\n",
155 | "\n",
156 | "
\n",
157 | "\n",
158 | "## # OCR 국내 트렌드\n",
159 | "\n",
160 | "- 삼성 SDS (AICR, Nexfinance AICR) \n",
161 | " - 딥러닝 기반의 OCR 솔루션 삼성 넥스 파이낸스 (AICR) \n",
162 | " - 자체 개발한 AI기반 OCR 기술로 외부환경 요인 노이즈를 제거, 원본 영상의 문서 특징을 강화한 것이 특징\n",
163 | " - 저조도, 워터마크, 구겨진 이미지, 기울어짐 및 원근 등을 최적화해 정확하게 인식\n",
164 | " - 외환 수출입 심사 자동화, 기업 재무제표, 보험금 청구 자동화, 기업 소송자료 디지털 자산화 등 복잡한 업무처리에 활용될 전망\n",
165 | " \n",
166 | " \n",
167 | "- **네이버 클로버 OCR**\n",
168 | " - 네이버 클라우드 플랫폼 기반 OCR 서비스 공급 계약 체결\n",
169 | " - 다양한 언어 지원 및 문서별로 최적화된 모델제공\n",
170 | " - 네이버 OCR 기술은 단어가 아닌 글자를 하나씩 인식한 후 이를 합치는 방식을 채택\n",
171 | " - 특정 이미지의 글자 크기와 자간 등을 계산하는 기술을 개발\n",
172 | " - **OCR분야 가장 권위있는 글로벌 챌린지ICDAR2019 4개 분야에서 1위**\n",
173 | " \n",
174 | "- 신세계 SSG 닷컴\n",
175 | " - 이미지 상품 검색 서비스 (쓱렌즈)에 OCR 기술 적용\n",
176 | " - 일일이 입력하기 까다로운 상품 모델번호나 브랜드명의 사진을 통해 텍스트 추출, 검색 가능\n",
177 | "\n",
178 | "- 카카오 OCR\n",
179 | " - 사물 탐지모델 (YOLO)와 비슷한 구조를 가진 EAST(Efficient and accurate scene text detector) 기반 유사 모델\n",
180 | " \n",
181 | "
\n",
182 | " \n",
183 | "## # 활용분야\n",
184 | "\n",
185 | "### RPA & OCR\n",
186 | "- OCR 프로세스의 자동화(효율화) 측면 - RPA(Robotic Process Automation)\n",
187 | "\n",
188 | "\n",
189 | "\n",
190 | "\n",
191 | "\n",
192 | "### RealTime & OCR"
193 | ]
194 | },
195 | {
196 | "cell_type": "markdown",
197 | "metadata": {},
198 | "source": [
199 | "## # 참고문헌\n",
200 | "- http://jaynewho.com/post/6 // textbox 가장 기본.\n",
201 | "- https://medium.com/@msmapark2/character-region-awareness-for-text-detection-craft-paper-%EB%B6%84%EC%84%9D-da987b32609c // craft 논문 리뷰\n",
202 | "- https://www.kakaobrain.com/blog/50 // OCR기초 4단계 설명\n",
203 | "- https://github.com/Belval/TextRecognitionDataGenerator // python trdg 공식 git\n",
204 | "- https://github.com/tangzhenyu/Scene-Text-Understanding // ocr 관련 논문 list\n",
205 | "- https://github.com/tesseract-ocr // tesseract-ocr\n",
206 | "- https://theonly1.tistory.com/2291 // craft 기반 ocr 프로그램\n",
207 | "- https://velog.io/@vanang7/%EA%B5%AD%EB%AC%B8-%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-OCR // 국산 ocr 비교\n",
208 | "- https://brunch.co.kr/@kakao-it/318\n",
209 | "- https://www.2e.co.kr/news/articleView.html?idxno=203023\n",
210 | "- https://www.ncloud.com/product/aiService/ocr \n",
211 | "- http://m.ddaily.co.kr/m/m_article/?no=187628 // 네이버 클로버 ICCV 2019 OCR Paper 뉴스기사"
212 | ]
213 | }
214 | ],
215 | "metadata": {
216 | "kernelspec": {
217 | "display_name": "Python 3",
218 | "language": "python",
219 | "name": "python3"
220 | },
221 | "language_info": {
222 | "codemirror_mode": {
223 | "name": "ipython",
224 | "version": 3
225 | },
226 | "file_extension": ".py",
227 | "mimetype": "text/x-python",
228 | "name": "python",
229 | "nbconvert_exporter": "python",
230 | "pygments_lexer": "ipython3",
231 | "version": "3.7.5"
232 | }
233 | },
234 | "nbformat": 4,
235 | "nbformat_minor": 4
236 | }
237 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # # OCR (Optical Character Recognition)
2 | - 광학 문자 인식(OCR, Optical Character Recognition)은 사람이 쓰거나 기계로 인쇄한 문자의 영상을 이미지 스캐너로 획득하여 기계가 읽을 수 있는 문자로 변환하는 것
3 |
4 | ## # OCR 4단계
5 | - 1단계(Pre-processing, 전처리)
6 | - **2단계(Text Detection. 글자탐지)**
7 | - **3단계 (Text Recognition, 글자 인식)**
8 | - 4단계 (Post-processing, 후처리)
9 |
10 | 
11 |
12 |
13 |
14 | ## # 1. Pre-processing 단계
15 | - 문서를 디지털로 처리하는 과정에서는 잡음(noise), 왜곡(distort)으로 인해 인식률이 현저하게 낮아지는 경우가 많음. => **전처리 과정을 통한 인식률 개선 가능**
16 | - Grayscale 변환
17 | - 히스토그램 정규화
18 | - 밝기의 분포를 재분배해 명암 대비를 최대화하여 더 선명한 이미지를 가짐
19 |
20 |
21 |
22 | ## # 2. Text Detection 단계
23 | - **이미지에서 텍스트 영역을 골라내어 불필요한 계산을 줄임**
24 | - Convolution을 통한 FeatureMap 추출
25 | - rotation angle regression (회전 문제)
26 | 
27 |
28 | - text인지 text가 아닌지에 대한 segmentation (=classification 이기도 함)
29 | - Detection이 끝나면 TextBox에 대한 ROI들을 출력 및 Crop 작업 진행
30 |
31 | ### 2-1) three types of detection CNN
32 | - 1) type1 pyramid + multi prediction (ssd 같은)
33 | - 2) pyramid + feature fusion + multi-prediction
34 | - 3) pyramid + feature fusion + single prediction
35 |
36 |
37 |
38 | ## # 3. Text Recognition 단계
39 | - 이미지를 잘라낸 후 각 이미지가 어떤 글자를 포함하고 있는지 인식 필요
40 | - **Convolution layer Model과 Recurrent layer Model로 이루어짐**
41 | - language별로 당연히 모듈 따로 존재 / crop된 textbox를 언어별로 분류 실행 가능
42 |
43 | ### 3-1) Convolution layer Model
44 | - Convolutional, Normalization연산, maxpool 연산 3가지로 이루어짐
45 | - 2단계와 마찬가지로 CNN이 사용 Shared CNN도 가능함
46 | - CNN 이미지를 Vertical(세로로)로 쪼개며, 글자마다 여러개의 Feature가 나옴
47 | - 쪼갠 Feature들을 내부적으로 alignment라고도 함.
48 |
49 | ### 3-2) Recurrent layer Model
50 | - 그러한 alignment들을 sequence를 RNN을 통해 학습
51 | - 글자들이 쪼개진걸 다시 조합하기 위해서 decoder가 존재
52 | - decoder를 위해 CTC Loss(Connectionist temporal classification loss)
53 | - decoder를 위해 Attention도 사용가능
54 |
55 | 
56 |
57 |
58 |
59 | ## # 4. Post-processing 단계
60 | - 품질이 낮은 워드들 버리기
61 | - 워드들을 합쳐 Sentence 생성
62 | - 맞춤법체크 보완 등 (ex. oat -> cat )
63 |
64 |
65 | ## # OCR Paper
66 | - 크게 3종류
67 | - 1. TextDetection
68 | - 2. TextRecognition
69 | - 3. end to end ( 1. + 2. )
70 |
71 | ### 필수 논문 List
72 | - (2016)TextBoxes: A Fast Text Detector with a Single Deep Neural Network
73 | - (2017)EAST: an Efficient and Accurate Scene Text Detector)
74 | - (2017)AON: Towards Arbitrarily-Oriented Text Recognition
75 | - (2018)FOTS: Fast Oriented Text Spotting with a Unified Network
76 | - (2018)Multi-Oriented Scene Text Detection via Corner Localization and Region Segmentation
77 | - (2018)Geometry-Aware Scene Text Detection with instance Transformation Network
78 | - (2018)An end-to-end TextSpotter with Explicit Alignment and Attention
79 | - (2018)DocUNet: Document Image Unwarping via A Stacked U-Net
80 | - (2018)ASTER-An Attentional Scene Text Recognizer with Flexible Rectification
81 | - (2019)CRAFT: Character Region Awareness for Text Detection
82 | - (2019)What Is Wrong With Scene Text Recognition Model Comparisons? Dataset and Model Analysis(사진 내 문자 인식 분야의 모델 비교시의 문제는 무엇인가?, 데이터셋 및 모델 분석, 네이버 Clova - ICCV 2019 Oral)
83 |
84 | ### What Is Wrong With Scene Text Recognition Model Comparisons? Dataset and Model Analysis
85 | - 변환, 특성추출, 시퀀스, 예측 4개모듈로 구분
86 | - 변환 모듈은 TPS(Thin Plate Spline) 사용여부 (2)
87 | - 특성추출 모듈은 VGGNet, RCNN, ResNet (3)
88 | - 시퀀스 모듈은 BiLSTM 사용여부에 따라 (2)
89 | - 예측 모듈은 CTC(Connectionist Temporal Classification) 과 어텐션으로 구성 (2)
90 |
91 | - **따라서 4개 모듈조합은 전체 경우의 수가 2 x 3 x 2 x 2 = 24가지**로 모든 조합에 대한 실험을 진행
92 | - 논문에서 최고 정확도의 모델조합은 TPS-ResNet-BiLSTM-Attn (영문 단어기준 84%)
93 | - 한글문장 데이터로 실험한 결과 TPS-VGG-BiLSTM-Attn 으로 88.24% 의 정확도가 나왔다(박선우 님)
94 |
95 | ## # OCR 컴피티션
96 | - 국제패턴인식 협회인 IAPR 주관의 국제 컴퓨터 문자인식 대회인 ICDAR 로버스트 리딩 컴피티션(ICDAR Robust Reading Competition) 챌린지
97 |
98 |
99 |
100 | ## # OCR 국산 오픈소스 OCR
101 | ### Tesseract
102 | - Source Repository: https://github.com/tesseract-ocr/tesseract
103 | - 상대적으로 유구한 역사를 가진 Open Source OCR 툴
104 | - HP에서 개발을 시작해서 Open Source화 한 이후 Google의 개발자들이 유지보수
105 | - C기반 개발 및 여러 wrapper library들도 풍부하게 존재 / 다양한 option 제공됨
106 | - 국문 폰트 3~4가지 정도로만 학습되었기 때문에 다양한 폰트로 추가 학습시 성능향상 기대
107 |
108 | - 단점
109 | - 속도가 느린편
110 | - GPU 지원이 안됨
111 |
112 | ### EasyOCR
113 | - Source Repository: https://github.com/JaidedAI/EasyOCR
114 | - Tesseract보다 정확도 면에서도 향상
115 | - GPU 연산을 지원하기 때문에 성능(속도)면에서도 개선
116 | - 아파치 2.0으로 상용에도 이용 가능
117 | - 추가학습 용이 및 추가폰트 학습 가능
118 | - Naver에서 만들어 공개한 CRAFT라는 TextDetection 도구 이용
119 |
120 | ### ocr_kor
121 | - Source Repository: https://github.com/parksunwoo/ocr_kor
122 | - 박선우, Naver에서 연구하여 공개한 Deep-text-recognition-benchmark를 한국어로 학습시킨 OCR 툴
123 | - Text Detection 부분이 없기 때문에 일반 문서의 OCR은 수행하지 못함
124 | - 학습 데이터 생성기를 제공하는 등 추가 학습이 가능한 형태
125 |
126 |
127 |
128 | ## # OCR 국내 트렌드
129 |
130 | - 삼성 SDS (AICR, Nexfinance AICR)
131 | - 딥러닝 기반의 OCR 솔루션 삼성 넥스 파이낸스 (AICR)
132 | - 자체 개발한 AI기반 OCR 기술로 외부환경 요인 노이즈를 제거, 원본 영상의 문서 특징을 강화한 것이 특징
133 | - 저조도, 워터마크, 구겨진 이미지, 기울어짐 및 원근 등을 최적화해 정확하게 인식
134 | - 외환 수출입 심사 자동화, 기업 재무제표, 보험금 청구 자동화, 기업 소송자료 디지털 자산화 등 복잡한 업무처리에 활용될 전망
135 |
136 |
137 | - **네이버 클로버 OCR**
138 | - 네이버 클라우드 플랫폼 기반 OCR 서비스 공급 계약 체결
139 | - 다양한 언어 지원 및 문서별로 최적화된 모델제공
140 | - 네이버 OCR 기술은 단어가 아닌 글자를 하나씩 인식한 후 이를 합치는 방식을 채택
141 | - 특정 이미지의 글자 크기와 자간 등을 계산하는 기술을 개발
142 | - **OCR분야 가장 권위있는 글로벌 챌린지ICDAR2019 4개 분야에서 1위**
143 |
144 | - 신세계 SSG 닷컴
145 | - 이미지 상품 검색 서비스 (쓱렌즈)에 OCR 기술 적용
146 | - 일일이 입력하기 까다로운 상품 모델번호나 브랜드명의 사진을 통해 텍스트 추출, 검색 가능
147 |
148 | - 카카오 OCR
149 | - 사물 탐지모델 (YOLO)와 비슷한 구조를 가진 EAST(Efficient and accurate scene text detector) 기반 유사 모델
150 |
151 |
152 |
153 | ## # 활용분야
154 |
155 | ### RPA & OCR
156 | - OCR 프로세스의 자동화(효율화) 측면 - RPA(Robotic Process Automation)
157 |
158 | 
159 |
160 | 
161 |
162 | ### RealTime & OCR
163 |
164 | ## # 참고문헌
165 | - http://jaynewho.com/post/6 // textbox 가장 기본.
166 | - https://medium.com/@msmapark2/character-region-awareness-for-text-detection-craft-paper-%EB%B6%84%EC%84%9D-da987b32609c // craft 논문 리뷰
167 | - https://www.kakaobrain.com/blog/50 // OCR기초 4단계 설명
168 | - https://github.com/Belval/TextRecognitionDataGenerator // python trdg 공식 git
169 | - https://github.com/tangzhenyu/Scene-Text-Understanding // ocr 관련 논문 list
170 | - https://github.com/tesseract-ocr // tesseract-ocr
171 | - https://theonly1.tistory.com/2291 // craft 기반 ocr 프로그램
172 | - https://velog.io/@vanang7/%EA%B5%AD%EB%AC%B8-%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-OCR // 국산 ocr 비교
173 | - https://brunch.co.kr/@kakao-it/318
174 | - https://www.2e.co.kr/news/articleView.html?idxno=203023
175 | - https://www.ncloud.com/product/aiService/ocr
176 | - http://m.ddaily.co.kr/m/m_article/?no=187628 // 네이버 클로버 ICCV 2019 OCR Paper 뉴스기사
177 |
178 |
--------------------------------------------------------------------------------
/Tesseract-OCR.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "## Tesseract로 OCR 하기\n",
8 | "- 다양한 운영체제에서 사용가능한 광학 문자 인식 엔진, 무료 소프트웨어\n",
9 | "\n",
10 | "- https://github.com/UB-Mannheim/tesseract/wiki // Window 프로그램에 설치 및 환경변수 등록\n",
11 | "\n",
12 | "### # 1. Tesseract Windows 버전 설치\n",
13 | "- https://github.com/UB-Mannheim/tesseract/wiki\n",
14 | "- 설치시 한국어 버전 설치\n",
15 | "\n",
16 | "### # 2. 환경변수 등록\n",
17 | "- 설치 폴더 환경변수 등록\n",
18 | "\n",
19 | "### # 3. python, anaconda 명령어로 설치\n",
20 | "- conda install -c conda-forge pytesseract\n",
21 | "\n",
22 | "### # 4. 한글 OCR Trainin data 추가 다운로드\n",
23 | "- https://github.com/tesseract-ocr/ 링크 이용\n",
24 | "- testdata 레퍼지토리\n",
25 | " - 일반 trained 결과 (추후 재학습시 여기서)\n",
26 | " - testdata의 kor.traineddata와 kor_vert.traineddata 다운로드 \n",
27 | "- testdata_best 레퍼지토리\n",
28 | " - 최고의 accuracy 결과를 보임\n",
29 | " - testbest_data의 kor.traineddata와 kor_vert.traineddata 다운로드\n",
30 | "- C:\\Program Files\\Tesseract-OCR\\tessdata 링크에서 파일변경\n",
31 | "\n",
32 | "### # 주의사항\n",
33 | "- 고딕류 계열의 글씨만 정확도가 좋음.\n",
34 | "- 궁서 잘 안됨.\n",
35 | "\n",
36 | "### # 참조링크\n",
37 | "- https://www.youtube.com/watch?v=rNxMwtottmM"
38 | ]
39 | },
40 | {
41 | "cell_type": "code",
42 | "execution_count": 10,
43 | "metadata": {},
44 | "outputs": [
45 | {
46 | "name": "stdout",
47 | "output_type": "stream",
48 | "text": [
49 | "#ㅇ68(00403!다13136860090미400)\n",
50 | "\n",
51 | "문자인식(008,06013!다(3686009000))은사람이쓰거나기계로인쇄한\n",
52 | "자의영상을이미지스캐너로획득하여기계가읽을수있(로변환하는것\n",
53 | "\n",
54 | "글자영역탐지(@8허660007)와*글자인식6166090400)*의두단계과정을\n",
55 | "거침\n",
56 | "\f",
57 | "\n"
58 | ]
59 | }
60 | ],
61 | "source": [
62 | "# 기본 pytesseract 사용\n",
63 | "file_name = 'img/test_image.PNG'\n",
64 | "\n",
65 | "from PIL import Image\n",
66 | "import pytesseract\n",
67 | "\n",
68 | "# 젤먼저 pytesseract가 어딨는지 경로 설정 필요\n",
69 | "pytesseract.pytesseract.tesseract_cmd = r'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'\n",
70 | "\n",
71 | "img = Image.open(file_name)#.convert('L')\n",
72 | "\n",
73 | "text = pytesseract.image_to_string(img, lang='kor')\n",
74 | "\n",
75 | "print(text.replace(\" \", \"\").replace('\\n\\n','\\n'))"
76 | ]
77 | },
78 | {
79 | "cell_type": "markdown",
80 | "metadata": {},
81 | "source": [
82 | "--- \n",
83 | "\n",
84 | "## PDF OCR\n",
85 | "- pdf 한페이지씩 ocr 로 변환하여 진행\n",
86 | "\n",
87 | "### PDF to Image \n",
88 | "- pdf2image library 사용하여 변환\n",
89 | "\n",
90 | "### 설치 library\n",
91 | "- conda install -c conda-forge poppler\n",
92 | "- conda install -c conda-forge pdf2image"
93 | ]
94 | },
95 | {
96 | "cell_type": "code",
97 | "execution_count": 2,
98 | "metadata": {
99 | "scrolled": true
100 | },
101 | "outputs": [
102 | {
103 | "name": "stdout",
104 | "output_type": "stream",
105 | "text": [
106 | "path: pdf filename: 아이유노래가사_맑은고딕.pdf\n",
107 | "fileBaseName: 아이유노래가사_맑은고딕 fileExtension: .pdf\n",
108 | "Page # 0 - 1.아이유블루밍\n",
109 | "'뭐해?'라는두글자에\n",
110 | "\"네가보고싶어'나의속마음을담아우\n",
111 | "\n",
112 | "이모티콘하나하나속에\n",
113 | "달라지는내미묘한심리를알까우\n",
114 | "아니바쁘지않아001090000\n",
115 | "잠들어있지않아11500ㅁ71307303\n",
116 | "지금다른사람과함께이지않아\n",
117 | "응,나도너를생각중\n",
118 | "우리의네모칸은6000\n",
119 | "엄지손가락으로장미꽃을피워\n",
120 | "향기에취할것같아우\n",
121 | "오직둘만의비밀의정원\n",
122 | "|66.60001666.600001666101000\n",
123 | "너에게한송이를더보내\n",
124 | "밤샘작업으로업데이트\n",
125 | "흥미로운이작품의지은이1130506우\n",
126 | "\n",
127 | "\n",
128 | "어찜이관계의클라이맥스\n",
129 | "2막으로넘어가기엔지금이》0000409우\n",
130 | "같은맘인걸알아(63126131126\n",
131 | "고르지말아]4581601/13131/\n",
132 | "조금장난스러운나의은유에\n",
133 | "네해석이궁금히\n",
134 | "우리의색은0『3/300046\n",
135 | "엄지손가락으로말풍선을띄워\n",
136 | "금세터질것같아우\n",
137 | "호흡이가빠져어지러워\n",
138 | "|6616146.|76리이06.|(6리이66.\n",
139 | "너에게가득히채워\n",
140 | "띄어쓰기없이보낼게사랑인것같애\n",
141 | "백만송이장미꽃을,나랑피워볼래?\n",
142 | "꽃잎의색은우리마음가는대로칠해\n",
143 | "도예쁘게\n",
144 | "|네모칸은(100\n",
145 | "손가락으로장미3\n",
146 | "향기에취할것같ㅇ\n",
147 | "오직둘만의비밀의정원\n",
148 | "|66.60001666.600001666101000\n",
149 | "너에게한송이를더보내\n",
150 | "\n",
151 | "거무\n",
152 | "[|찌0|\n",
153 | "\n",
154 | "\n",
155 | "\n",
156 | "\n",
157 | "\n",
158 | "건민띠\n",
159 | "10\n",
160 | "3\n",
161 | "02ㅋ10\n",
162 | "0\n",
163 | "피\n",
164 | "ㅋ08\n",
165 | "고으\n",
166 | "\n",
167 | "\n",
168 | "\n",
169 | "\n",
170 | "\n",
171 | "\n",
172 | "\n",
173 | "\n",
174 | "\n",
175 | "\f",
176 | "\n",
177 | "Page # 1 - \n",
178 | "\n",
179 | "\n",
180 | "\n",
181 | "\n",
182 | "\n",
183 | "\n",
184 | "\n",
185 | "\n",
186 | "\n",
187 | "\n",
188 | "\n",
189 | "\n",
190 | "\n",
191 | "\n",
192 | "\n",
193 | "\n",
194 | "\n",
195 | "\n",
196 | "\n",
197 | "\n",
198 | "\n",
199 | "우리이별이꿈이아닌걸너무잘알고있는데\n",
200 | "왜난깨어나길비는지\n",
201 | "쏟아지는빗물은날한치앞도못보게해\n",
202 | "몰아치는바람은단한걸음도못가게히\n",
203 | "벼랑끝에서있는듯이난무서워떨고있지만\n",
204 | "작은두손을모은내기도는하나뿐이\n",
205 | "아픈내가슴도깊은상처들도나쁜널미워하는데\n",
206 | "사진을태우고기억을지워도널잊을수없나봐사랑해\n",
207 | "쏟아지는빗물은날한치앞도못보게해\n",
208 | "몰아치는바람은단한걸음도못가게히\n",
209 | "벼랑끝에서있는듯이난무서워떨고있지만\n",
210 | "작은두손을모은내기도는하나뿐이\n",
211 | "돌아와돌아와\n",
212 | "3.아이유-104680607\n",
213 | "누구를위해누군가기도하고있나봐\n",
214 | "숨죽여쓴사랑시가낮게들리는듯해\n",
215 | "너에게로선명히날아가\n",
216 | "늦지않게자리에당기를\n",
217 | "11661606홀로걷는너의뒤에\n",
218 | "5109109니!176600그치지않을이노래\n",
219 | "아주잠시만귀기울여봐\n",
220 | "유난히긴밤을걷는널위해부를게\n",
221 | "또한번너의세상에별이지고있나봐\n",
222 | "숨죽여삼킨눈물이여기흐르는듯해\n",
223 | "할말을잃어고요한마음에\n",
224 | "기억처럼들려오는목소리\n",
225 | "11661606홀로걷는너의뒤에\n",
226 | "5109109니!176600그치지않을이노래\n",
227 | "아주커다란숨을쉬어봐\n",
228 | "소리내우는법을잊은널위해부를게\n",
229 | "부를게\n",
230 | "르\n",
231 | "(다시사랑할수있도록)\n",
232 | "ㅁ1한6|300지켜봐나를,난절대\n",
233 | "5109109비!16600멈\n",
234 | "\n",
235 | "추지않아이노래\n",
236 | "너의긴밤이끝나는그날\n",
237 | "\n",
238 | "\n",
239 | "고개\n",
240 | "들어바라본그곳에있을게\n",
241 | "\n",
242 | "\f",
243 | "\n"
244 | ]
245 | }
246 | ],
247 | "source": [
248 | "## 맑은고딕 \n",
249 | "\n",
250 | "import os\n",
251 | "from PIL import Image\n",
252 | "from pdf2image import convert_from_path\n",
253 | "import pytesseract\n",
254 | "\n",
255 | "pytesseract.pytesseract.tesseract_cmd = r'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'\n",
256 | "\n",
257 | "filePath = 'pdf/아이유노래가사_맑은고딕.pdf'\n",
258 | "\n",
259 | "doc = convert_from_path(filePath) # doc는 PIL.PpmImageFile list\n",
260 | "\n",
261 | "# 파일 경로, 파일 이름(확장자포함) 구하기\n",
262 | "path, fileName = os.path.split(filePath) # path, 파일name.pdf\n",
263 | "print('path:', path, 'filename:', fileName)\n",
264 | "\n",
265 | "# 파일 이름, 파일 확장자 구하기\n",
266 | "fileBaseName, fileExtension = os.path.splitext(fileName)\n",
267 | "print('fileBaseName:', fileBaseName, 'fileExtension:', fileExtension)\n",
268 | "\n",
269 | "for page_number, page_image in enumerate(doc):#\n",
270 | " txt = pytesseract.image_to_string(page_image, lang='kor').replace(' ', '')\n",
271 | " print(\"Page # {} - {}\".format(str(page_number),txt.replace('\\n\\n','\\n')))\n"
272 | ]
273 | },
274 | {
275 | "cell_type": "code",
276 | "execution_count": 13,
277 | "metadata": {},
278 | "outputs": [
279 | {
280 | "name": "stdout",
281 | "output_type": "stream",
282 | "text": [
283 | "path: pdf filename: 아이유노래가사_궁서.pdf\n",
284 | "fileBaseName: 아이유노래가사_궁서 fileExtension: .pdf\n",
285 | "Page # 0 - 국\n",
286 | "12)\n",
287 | "개페급가.유\n",
288 | "풍큼2슈중구“\n",
289 | "니므212느은스스\n",
290 | "봉210데에제습이낭느사지주여시\n",
291 | "9혁종눔송종늦더그영입,주늦딕이\n",
292 | "악건。70디중누디6220이직(이\n",
293 | "8[이옥으더정숭더후고저그페킬기근다\n",
294 | "그아요님도6이에어긋곤머파마고가노기어않으\n",
295 | "ㅇㅇ@읍이으내머자머읽않아조그버니소\n",
296 | "이8넘@딱버이|스막버너휴버르28막기?\n",
297 | "악“[이]그은어3먹마버너주수매시기시이8팩\n",
298 | "(개업더06앙러점더안에시노후디23238애애딕객증오사버읍으습줄았2머\n",
299 | "은아ㅇ더--니이관아시\n",
300 | "점이음띠00-29000703;격0제제였산아2움수“이사동\n",
301 | "해종음티티호88=8다도더흡수업아의제데쩌입|)따염산며바가9에액조이망년배모\n",
302 | "“이그으41000“이덩규와6으리학우2허가<져,72으으|\n",
303 | "이이근자그ㅇ귀다궁으사(데슈이\"한움기240아비어212093212이27120\n",
304 | "호매음듬&입니240닌본30바기1사자아세담지가아=6600020909062어러딕큐염8언나\n",
305 | "세웅전더엉이으틸악운덧긍※ㅇㅇ디야.헌바00그8않지-으섰이녀떨이,이2이27읍슴8만타이주이빅뮤눔<금주이강\n",
306 | "중중6“0등)다설이이늘둥이2하얼바짝남틱엽고0버슈긋주이6[웅<긋\n",
307 | "송하세응임조바이아,인진움하께장선유아든마항소이아진조입능승'^'너망찌주이입나금송고념<굿주고능1\n",
308 | "으히세시요경조으주2호럴진눔하긍긍,눔영웅6퍼테나이것)버중중립승대8앤석22으수망간6=눌12|”조\n",
309 | "섯암+0퍼애9노적어|업끼박지오상아슬엄적안이버사아리슈이819.소기이하애농당석이1221244440허\n",
310 | "0고아수스담소9900,2너미06622에이조라우고이소너가수유8센먹숭꼭,,,29조우아쟁빠후하누으하빠눔\n",
311 | "슴0,승떠공상전주앙벅숨>틈승너짜하슨0마이즈드비|「움값이?\"머읍[70금견꽤,」.야의삽기기하백움이2앙이시요스긍긍급증\n",
312 | "짝박.9,/요음기였걱눔81901능족이자으시놀^달경주수수하버종즈자앙어유이바수잔바움이28께긍궁급0이제강긍\n",
313 | "막방,666이고0190113사한산소102,승승죽0바니은디아소90|2급좀쥬십”\"그급\n",
314 | "시기쇼쇼수먹후겹2끼승2빅감2자스언좁아석둥영종오쓴)긍갑0이2긍줌\n",
315 | "일으가옴제미궁자안60앙아다미0하스스주니64084도46388나트.\n",
316 | "할어입니)핀버스아능부덩웅짜머으멍위없그똥색2아농숭감8비었\n",
317 | "야미주갑회자중엄중인0/088역2시죽38\n",
318 | "오언입석기종기하이서종인중죽은즘으니\n",
319 | "이아%므심스세인중죽뮤\n",
320 | "공소머삽그끼먹으\".\n",
321 | "사1긍국접리벅가끔삼니\n",
322 | "10익익주적비매끈%1\n",
323 | ".11펑끼끔(1랙은익찌악-\n",
324 | "수아악수이줌제\n",
325 | "1중악먹미억니끄세쪼덱삭악1송팸8억[니그\n",
326 | "영미6자페석궁\n",
327 | "ㅠ2709어|,뀌주\n",
328 | "|가그검머갔다이0아-\n",
329 | "-~_…-\n",
330 | "\f",
331 | "\n",
332 | "Page # 1 - 늦지입이기를\n",
333 | "11186나1606흘로경는너의뒤에\n",
334 | "81091196111616628그치지않을이노래\n",
335 | "빈\n",
336 | "아주잠시만귀기글여봐\n",
337 | "규난히긴밤을걷는널위해뷰를게\n",
338 | "또한번너의세상에별이지고있나봐\n",
339 | "습즉여삼킨뉴들이여기흐르는듯해\n",
340 | "할말을잃어고요한마음에\n",
341 | "기억처럼들려오는목소리\n",
342 | "1111666606홀로걷는니의뒤에\n",
343 | "81991095911686609그치지않을이노래\n",
344 | "아즉란숨을쉬\n",
345 | "소리내우는범을잊은널위해뷰를게\n",
346 | "브를게\n",
347 | "(다시사랑할수있도록)\n",
348 | "브66612ㅁ지켜봐나를,난절대\n",
349 | "8119110961116166100멈축지않아이노래\n",
350 | "너의긴밤이끝나는그날\n",
351 | "고개를들어바라본그곳에있을게\n",
352 | "\f",
353 | "\n"
354 | ]
355 | }
356 | ],
357 | "source": [
358 | "## 궁서\n",
359 | "\n",
360 | "import os\n",
361 | "from PIL import Image\n",
362 | "from pdf2image import convert_from_path\n",
363 | "import pytesseract\n",
364 | "\n",
365 | "pytesseract.pytesseract.tesseract_cmd = r'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'\n",
366 | "\n",
367 | "filePath = 'pdf/아이유노래가사_궁서.pdf'\n",
368 | "# filePath = 'pdf/2020학년도_국어_홀.pdf'\n",
369 | "doc = convert_from_path(filePath) # doc는 PIL.PpmImageFile list\n",
370 | "\n",
371 | "# 파일 경로, 파일 이름(확장자포함) 구하기\n",
372 | "path, fileName = os.path.split(filePath) # path, 파일name.pdf\n",
373 | "print('path:', path, 'filename:', fileName)\n",
374 | "\n",
375 | "# 파일 이름, 파일 확장자 구하기\n",
376 | "fileBaseName, fileExtension = os.path.splitext(fileName)\n",
377 | "print('fileBaseName:', fileBaseName, 'fileExtension:', fileExtension)\n",
378 | "\n",
379 | "for page_number, page_image in enumerate(doc):#\n",
380 | " txt = pytesseract.image_to_string(page_image, lang='kor').replace(' ', '')\n",
381 | " print(\"Page # {} - {}\".format(str(page_number),txt.replace('\\n\\n','\\n')))\n"
382 | ]
383 | },
384 | {
385 | "cell_type": "markdown",
386 | "metadata": {},
387 | "source": [
388 | "---\n",
389 | "\n",
390 | "## PDF to TEXT\n",
391 | "- conda install -c conda-forge pdfminer3k\n",
392 | "- conda install -c conda-forge pdfminer.six"
393 | ]
394 | },
395 | {
396 | "cell_type": "code",
397 | "execution_count": 3,
398 | "metadata": {},
399 | "outputs": [],
400 | "source": [
401 | "from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter\n",
402 | "from pdfminer.converter import HTMLConverter\n",
403 | "# from pdfminer.converter import TextConverter\n",
404 | "from pdfminer.layout import LAParams\n",
405 | "from pdfminer.pdfpage import PDFPage\n",
406 | "from io import StringIO\n",
407 | " \n",
408 | "rsrcmgr = PDFResourceManager()\n",
409 | "retstr = StringIO()\n",
410 | "codec = 'utf-8'\n",
411 | "laparams = LAParams()\n",
412 | " \n",
413 | "f = open('result/out.html', 'wb')\n",
414 | "device = HTMLConverter(rsrcmgr, f, codec=codec, laparams=laparams)\n",
415 | " \n",
416 | "fp = open(filePath, 'rb')\n",
417 | "interpreter = PDFPageInterpreter(rsrcmgr, device)\n",
418 | "password = \"\"\n",
419 | "maxpages = 0 #is for all\n",
420 | "caching = True\n",
421 | "pagenos=set()\n",
422 | "for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):\n",
423 | " interpreter.process_page(page)\n",
424 | "fp.close()\n",
425 | "device.close()\n",
426 | "str = retstr.getvalue()\n",
427 | "retstr.close()\n",
428 | "f.close()"
429 | ]
430 | },
431 | {
432 | "cell_type": "code",
433 | "execution_count": null,
434 | "metadata": {},
435 | "outputs": [],
436 | "source": []
437 | }
438 | ],
439 | "metadata": {
440 | "kernelspec": {
441 | "display_name": "Python 3",
442 | "language": "python",
443 | "name": "python3"
444 | },
445 | "language_info": {
446 | "codemirror_mode": {
447 | "name": "ipython",
448 | "version": 3
449 | },
450 | "file_extension": ".py",
451 | "mimetype": "text/x-python",
452 | "name": "python",
453 | "nbconvert_exporter": "python",
454 | "pygments_lexer": "ipython3",
455 | "version": "3.7.5"
456 | }
457 | },
458 | "nbformat": 4,
459 | "nbformat_minor": 4
460 | }
461 |
--------------------------------------------------------------------------------
/img/Generate_Confidence_Score.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/img/Generate_Confidence_Score.png
--------------------------------------------------------------------------------
/img/OCR_Flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/img/OCR_Flow.png
--------------------------------------------------------------------------------
/img/OCR_RPA.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/img/OCR_RPA.png
--------------------------------------------------------------------------------
/img/OCR_RPA와연계_업무자동화_.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/img/OCR_RPA와연계_업무자동화_.jpg
--------------------------------------------------------------------------------
/img/confidence.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/img/confidence.png
--------------------------------------------------------------------------------
/img/connected_component_labeling.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/img/connected_component_labeling.png
--------------------------------------------------------------------------------
/img/craft.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/img/craft.png
--------------------------------------------------------------------------------
/img/craft2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/img/craft2.png
--------------------------------------------------------------------------------
/img/craft_loss.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/img/craft_loss.PNG
--------------------------------------------------------------------------------
/img/craft_model.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/img/craft_model.jpeg
--------------------------------------------------------------------------------
/img/craft_model_architecture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/img/craft_model_architecture.png
--------------------------------------------------------------------------------
/img/crnn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/img/crnn.png
--------------------------------------------------------------------------------
/img/easyocr_framework.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/img/easyocr_framework.jpeg
--------------------------------------------------------------------------------
/img/ocr_flow_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/img/ocr_flow_5.png
--------------------------------------------------------------------------------
/img/polygon_generate.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/img/polygon_generate.png
--------------------------------------------------------------------------------
/img/rotation.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/img/rotation.png
--------------------------------------------------------------------------------
/img/test_image.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/img/test_image.PNG
--------------------------------------------------------------------------------
/img/text_recogniton.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/img/text_recogniton.png
--------------------------------------------------------------------------------
/img/wordlevel_to_characterlevel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/img/wordlevel_to_characterlevel.png
--------------------------------------------------------------------------------
/ocr-image/2020-kor-1_crop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/ocr-image/2020-kor-1_crop.png
--------------------------------------------------------------------------------
/ocr-image/2020-kor-1_crop_result.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/ocr-image/2020-kor-1_crop_result.png
--------------------------------------------------------------------------------
/ocr-image/test1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/ocr-image/test1.PNG
--------------------------------------------------------------------------------
/ocr-image/test2.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/ocr-image/test2.PNG
--------------------------------------------------------------------------------
/ocr_paper/(2016)TextBoxes-A Fast Text Detector with a Single Deep Neural Network.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/ocr_paper/(2016)TextBoxes-A Fast Text Detector with a Single Deep Neural Network.pdf
--------------------------------------------------------------------------------
/ocr_paper/(2017)AON-Towards Arbitrarily-Oriented Text Recognition.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/ocr_paper/(2017)AON-Towards Arbitrarily-Oriented Text Recognition.pdf
--------------------------------------------------------------------------------
/ocr_paper/(2017)EAST-An Efficient and Accurate Scene Text Detector.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/ocr_paper/(2017)EAST-An Efficient and Accurate Scene Text Detector.pdf
--------------------------------------------------------------------------------
/ocr_paper/(2018)ASTER-An Attentional Scene Text Recognizer with Flexible Rectification.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/ocr_paper/(2018)ASTER-An Attentional Scene Text Recognizer with Flexible Rectification.pdf
--------------------------------------------------------------------------------
/ocr_paper/(2018)An end-to-end TextSpotter with Explicit Alignment and Attention.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/ocr_paper/(2018)An end-to-end TextSpotter with Explicit Alignment and Attention.pdf
--------------------------------------------------------------------------------
/ocr_paper/(2018)DocUNet- Document Image Unwarping via A Stacked U-Net.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/ocr_paper/(2018)DocUNet- Document Image Unwarping via A Stacked U-Net.pdf
--------------------------------------------------------------------------------
/ocr_paper/(2018)FOTS-Fast Oriented Text Spotting with a Unified Network.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/ocr_paper/(2018)FOTS-Fast Oriented Text Spotting with a Unified Network.pdf
--------------------------------------------------------------------------------
/ocr_paper/(2018)Geometry-Aware Scene Text Detection with instance Transformation Network.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/ocr_paper/(2018)Geometry-Aware Scene Text Detection with instance Transformation Network.pdf
--------------------------------------------------------------------------------
/ocr_paper/(2018)multi-oriented scene text detection via corner localization and region segmentation.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/ocr_paper/(2018)multi-oriented scene text detection via corner localization and region segmentation.pdf
--------------------------------------------------------------------------------
/ocr_paper/(2019)CRAFT-Character Region Awareness for Text Detection.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/ocr_paper/(2019)CRAFT-Character Region Awareness for Text Detection.pdf
--------------------------------------------------------------------------------
/ocr_paper/(2019)What Is Wrong With Scene Text Recognition Model Comparisons Dataset and Model Analysis(2019).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/ocr_paper/(2019)What Is Wrong With Scene Text Recognition Model Comparisons Dataset and Model Analysis(2019).pdf
--------------------------------------------------------------------------------
/pdf/2017학년도_국어_짝.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/pdf/2017학년도_국어_짝.pdf
--------------------------------------------------------------------------------
/pdf/2017학년도_국어_홀.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/pdf/2017학년도_국어_홀.pdf
--------------------------------------------------------------------------------
/pdf/2018학년도_국어_짝.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/pdf/2018학년도_국어_짝.pdf
--------------------------------------------------------------------------------
/pdf/2018학년도_국어_홀.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/pdf/2018학년도_국어_홀.pdf
--------------------------------------------------------------------------------
/pdf/2019학년도_국어_짝.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/pdf/2019학년도_국어_짝.pdf
--------------------------------------------------------------------------------
/pdf/2019학년도_국어_홀.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/pdf/2019학년도_국어_홀.pdf
--------------------------------------------------------------------------------
/pdf/2020학년도_국어_짝.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/pdf/2020학년도_국어_짝.pdf
--------------------------------------------------------------------------------
/pdf/2020학년도_국어_홀.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/pdf/2020학년도_국어_홀.pdf
--------------------------------------------------------------------------------
/pdf/아이유노래가사_궁서.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/pdf/아이유노래가사_궁서.pdf
--------------------------------------------------------------------------------
/pdf/아이유노래가사_맑은고딕.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SeonminKim1/Study-OCR/de5584b049928738ae31593e8925780320d4fa2c/pdf/아이유노래가사_맑은고딕.pdf
--------------------------------------------------------------------------------
/result/out.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 1. 아이유 블루밍
7 |
‘뭐해?‘라는 두 글자에
8 |
‘네가 보고 싶어’ 나의 속마음을 담아 우
9 |
이모티콘 하나하나 속에
10 |
달라지는 내 미묘한 심리를 알까 우
11 |
아니 바쁘지 않아 nothing no no
12 |
잠들어 있지 않아 insomnia nia nia
13 |
지금 다른 사람과 함께이지 않아
14 |
응, 나도 너를 생각 중
15 |
우리의 네모 칸은 bloom
16 |
엄지손가락으로 장미꽃을 피워
17 |
향기에 취할 것 같아 우
18 |
오직 둘만의 비밀의 정원
19 |
I feel bloom I feel bloom I feel bloom
20 |
너에게 한 송이를 더 보내
21 |
밤샘 작업으로 업데이트
22 |
흥미로운 이 작품의 지은이 that’s me 우
23 |
어쩜 이 관계의 클라이맥스
24 |
2막으로 넘어가기엔 지금이 good timing 우
25 |
같은 맘인 걸 알아 realize la lize
26 |
말을 고르지 말아 just reply la la ly
27 |
조금 장난스러운 나의 은유에
28 |
네 해석이 궁금해
29 |
우리의 색은 gray and blue
30 |
엄지손가락으로 말풍선을 띄워
31 |
금세 터질 것 같아 우
32 |
호흡이 가빠져 어지러워
33 |
I feel blue. I feel blue. I feel blue.
34 |
너에게 가득히 채워
35 |
띄어쓰기없이보낼게사랑인것같애
36 |
백만송이장미꽃을, 나랑피워볼래?
37 |
꽃잎의 색은 우리 마음 가는 대로 칠해
38 |
시들 때도 예쁘게
39 |
우리의 네모 칸은 bloom
40 |
엄지손가락으로 장미꽃을 피워
41 |
향기에 취할 것 같아 우
42 |
오직 둘만의 비밀의 정원
43 |
I feel bloom I feel bloom I feel bloom
44 |
너에게 한 송이를 더 보내
45 |
2. 아이유 미아
46 |
우리 둘 담아 준 사진을 태워
47 |
하나 둘 모아 둔 기억을 지워
48 |
그만 일어나 가야 하는 걸 너무 잘 알고 있는데
49 |
왜 난 주저앉고 마는지
50 |
쏟아지는 빗물은 날 한 치 앞도 못 보게 해
51 |
몰아치는 바람은 단 한 걸음도 못 가게 해
52 |
벼랑 끝에 서있는 듯이 난 무서워 떨고 있지만
53 |
작은 두 손을 모은 내 기도는 하나 뿐이야
54 |
돌아와
55 |
이제는 눈물도 나오지 않아
56 |
울먹일 힘마저 없는 것 같아
57 |
58 |
59 | 우리 이별이 꿈이 아닌 걸 너무 잘 알고 있는데
60 |
왜 난 깨어나길 비는지
61 |
쏟아지는 빗물은 날 한 치 앞도 못 보게 해
62 |
몰아치는 바람은 단 한 걸음도 못 가게 해
63 |
벼랑 끝에 서 있는 듯이 난 무서워 떨고 있지만
64 |
작은 두 손을 모은 내 기도는 하나 뿐이야
65 |
아픈 내 가슴도 깊은 상처들도 나쁜 널 미워하는데
66 |
사진을 태우고 기억을 지워도 널 잊을 수 없나 봐 사랑해
67 |
쏟아지는 빗물은 날 한 치 앞도 못 보게 해
68 |
몰아치는 바람은 단 한 걸음도 못 가게 해
69 |
벼랑 끝에 서있는 듯이 난 무서워 떨고 있지만
70 |
작은 두 손을 모은 내 기도는 하나 뿐이야
71 |
돌아와 돌아와
72 |
3. 아이유 - Love Poem
73 |
누구를 위해 누군가 기도하고 있나 봐
74 |
숨죽여 쓴 사랑시가 낮게 들리는 듯해
75 |
너에게로 선명히 날아가
76 |
늦지 않게 자리에 닿기를
77 |
I'll be there 홀로 걷는 너의 뒤에
78 |
Singing till the end 그치지 않을 이 노래
79 |
아주 잠시만 귀 기울여 봐
80 |
유난히 긴 밤을 걷는 널 위해 부를게
81 |
또 한 번 너의 세상에 별이 지고 있나 봐
82 |
숨죽여 삼킨 눈물이 여기 흐르는 듯해
83 |
할 말을 잃어 고요한 마음에
84 |
기억처럼 들려오는 목소리
85 |
I'll be there 홀로 걷는 너의 뒤에
86 |
Singing till the end 그치지 않을 이 노래
87 |
아주 커다란 숨을 쉬어 봐
88 |
소리 내 우는 법을 잊은 널 위해 부를게
89 |
부를게
90 |
(다시 사랑할 수 있도록)
91 |
Here I am 지켜봐 나를, 난 절대
92 |
Singing till the end 멈추지 않아 이 노래
93 |
너의 긴 밤이 끝나는 그날
94 |
고개를 들어 바라본 그곳에 있을게
95 |
96 |
97 |
--------------------------------------------------------------------------------