광학문자인식 (OCR, Optical Character Recognition)은 이미지 혹은 사진 속에 담긴 텍스트를 기계가 읽을 수 있는 형태(Machine-Readable Format)로 변환시켜 텍스트를 선택, 편집, 검색 가능하게 만드는 일련의 작업을 지칭한다.
OCR 응용분야로 다음을 들 수 있다.
OCR 작업흐름은 텍스트가 담긴 이미지를 바로 OCR 작업을 돌릴 경우 정확도가 떨어지기 때문에 이미지 전처리 작업(회전, 노이즈 제거 등)을 수행하고 텍스트 추출작업을 수행한다. 그리고 나서 추출된 텍스트를 후처리 작업을 통해서 재구조화시키고 나서 텍스트를 저장하는 과정을 거치게 된다.
텍스트가 포함된 이미지가 있는 상태에서 이미지 전처리(이미지 정규화, 그레이스케일 변환, 이미지 크기 변환, 노이즈 제거, 기울어진 보정 등) 작업을 수행한 후에 이미지 속 텍스트를 탐지하기 위한 알고리즘과 이미지에서 텍스트를 인식하고 추출하는 과정이 핵심적인 과정으로 이에 따라 OCR 성능이 많이 좌우된다.
텍스트 탐지 (Text Detection)
텍스트 인식/추출
Total Text Dataset은 다양한 형태 OCR 대상 이미지 데이터를 상황별로 모아놨다.
문자수준 (character recognition accuracy - CRA)과 단어수준 (word recognition accuracy - WRA) 지표를 통해 OCR 성능을 평가할 수 있다.
\[\text{WRA} = \frac{W_r}{W}\] \[\text{WER} = 1 - \text{WRA} = 1 \frac{W_r}{W}\]
그외 NED(Normalized Edit Distance), F-Score, AED(Average Edit Distance) 등이 있다.
ICDAR 2019 Robust Reading Challenge on Scanned Receipts OCR and Information Extraction 경진대회를 통해 영수증 등 스캔된 문서의 OCR 성능을 파악할 수 있다.
CTPN, EAST 등과 같은 전통 알고리즘이 약 90%를 보였다면 TLGAN은 99% 텍스트 탐지 정확도를 보이고 있다.
library(tidyverse)
library(rvest)
library(reactable)
<- read_html(x ="https://rrc.cvc.uab.es/?ch=13&com=evaluation&task=1")
ocr_task_1_html
<- ocr_task_1_html %>%
ocr_text_detection html_node(xpath = '//*[@id="table-1-1"]') %>%
html_table() %>%
::clean_names() %>%
janitoras_tibble()
%>%
ocr_text_detection select(team = method, recall, precision, hmean) %>%
mutate_at(vars(recall:hmean), parse_number) %>%
mutate_at(vars(recall:hmean), ~ ./100) %>%
reactable(columns = list(
recall = colDef(format = colFormat(percent = TRUE, digits = 1)),
precision = colDef(format = colFormat(percent = TRUE, digits = 1)),
hmean = colDef(format = colFormat(percent = TRUE, digits = 1))))
<- read_html(x ="https://rrc.cvc.uab.es/?ch=13&com=evaluation&task=2")
ocr_task_2_html
<- ocr_task_2_html %>%
ocr_text_reconition html_node(xpath = '//*[@id="table-1-1"]') %>%
html_table() %>%
::clean_names() %>%
janitoras_tibble()
%>%
ocr_text_reconition select(team = method, recall, precision, hmean) %>%
mutate_at(vars(recall:hmean), parse_number) %>%
mutate_at(vars(recall:hmean), ~ ./100) %>%
reactable(columns = list(
recall = colDef(format = colFormat(percent = TRUE, digits = 1)),
precision = colDef(format = colFormat(percent = TRUE, digits = 1)),
hmean = colDef(format = colFormat(percent = TRUE, digits = 1))))
OCR 된 텍스트로부터 company, address, total, date 등 중요정보 추출하여 알고리즘 성능을 비교합니다.
<- read_html(x ="https://rrc.cvc.uab.es/?ch=13&com=evaluation&task=3")
ocr_task_3_html
<- ocr_task_3_html %>%
ocr_info_extraction html_node(xpath = '//*[@id="table-1-1"]') %>%
html_table() %>%
::clean_names() %>%
janitoras_tibble()
%>%
ocr_info_extraction select(team = method, recall, precision, hmean) %>%
mutate_at(vars(recall:hmean), parse_number) %>%
mutate_at(vars(recall:hmean), ~ ./100) %>%
reactable(columns = list(
recall = colDef(format = colFormat(percent = TRUE, digits = 1)),
precision = colDef(format = colFormat(percent = TRUE, digits = 1)),
hmean = colDef(format = colFormat(percent = TRUE, digits = 1))))
데이터 과학자 이광춘 저작
kwangchun.lee.7@gmail.com