tesseract
tesseract
문자인식tesseract
를 통해서 100개가 넘는 언어를 사용해서 문서에 포함된 문자를 인식시킬 있는 광학 문자 판독 (optical character recognition, OCR) 엔진이다.
tesseract
헬로월드tesseract 소품문에 포함된 영문 예제로부터 시작해보자. 아래 영문에서 텍스트를 추출할 수 있다.
library(tidyverse)
library(tesseract)
eng <- tesseract("eng")
text <- tesseract::ocr("http://jeroen.github.io/images/testocr.png", engine = eng)
cat(text)
This is a lot of 12 point text to test the
ocr code and see if it works on all types
of file format.
The quick brown dog jumped over the
lazy fox. The quick brown dog jumped
over the lazy fox. The quick brown dog
jumped over the lazy fox. The quick
brown dog jumped over the lazy fox.
tesseract
텍스트 위치상기 이미지에서 추출된 단어에 대한 위치정보가 포함되어 있다.
results <- tesseract::ocr_data("http://jeroen.github.io/images/testocr.png", engine = eng)
results %>%
DT::datatable()
가장 문자인식율이 높은 단어는 test
로 96.9844284057617, 가장 낮은 단어는 on
93.5358657836914으로 나타난다. 이를 bbox
정보가 함께 제공되니 이를 이미지에 겹쳐 보자. 이를 위해서 magick
팩키지를 활용하여 구현해보자.
동일한 문서를 가져와서 image_draw()
함수로 기존 이미지위에 도형을 올릴 수 있다. tesseract::ocr_data()
함수를 사용해서 이미지에서 인식한 텍스트 위치를 특정시킬 수 있고 그 정보는 bbox
칼럼에 저장된다. 앞서 가장 인식이 잘 된 것이라고 판단된 단어와 반대 단어를 추출하여 이를 단어 박스를 씌워보자.
library(magick)
document_ocr <- image_read('http://jeroen.github.io/images/testocr.png')
document_box <- image_draw(document_ocr)
results_df <- results %>%
mutate(loc = str_split(bbox, ",")) %>%
mutate(top_x = map_chr(loc, 1),
top_y = map_chr(loc, 2),
bottom_x = map_chr(loc, 3),
bottom_y = map_chr(loc, 4))
(most_conf <- results_df %>%
top_n(1, wt=confidence) )
# A tibble: 1 x 8
word confidence bbox loc top_x top_y bottom_x bottom_y
<chr> <dbl> <chr> <list> <chr> <chr> <chr> <chr>
1 test 97.0 474,93,526,116 <chr [4]> 474 93 526 116
# A tibble: 1 x 8
word confidence bbox loc top_x top_y bottom_x bottom_y
<chr> <dbl> <chr> <list> <chr> <chr> <chr> <chr>
1 on 93.5 445,132,478,150 <chr [4]> 445 132 478 150
rect(most_conf$top_x, most_conf$top_y, most_conf$bottom_x, most_conf$bottom_y, border = "blue", lty = "solid", lwd = 3)
rect(least_conf$top_x, least_conf$top_y, least_conf$bottom_x, least_conf$bottom_y, border = "red", lty = "solid", lwd = 3)
dev.off()
quartz_off_screen
2
# A tibble: 1 x 7
format width height colorspace matte filesize density
<chr> <int> <int> <chr> <lgl> <int> <chr>
1 PNG 640 480 sRGB TRUE 0 72x72
웹사이트에 공개된 국문계약서 샘플 - 14, 특허 및 기술 도입 라이선스 계약서 샘플 – License and Distribution Agre…을 다운로드 받아 한국어 문자인식 작업을 추진해보자.
먼저 tesseract ocr 한국어 데이터를 다운로드 받아 설치한다. tesseract_info()$available
명령어를 통해 한국어 엔진이 설치된 것을 확인한다.
[1] "eng" "kor" "osd"
tesseract::ocr
명령어에 더해서 engine = kor
을 설정하게 되면 문서의 한국어를 인식하게 된다.
kor <- tesseract("kor")
contract_text <- tesseract::ocr("fig/ocr-contract-sample.png", engine = kor)
contract_text
[1] "특허 및 기술 도입계약서\n기술정보제공자 스스스(이하 \"갑\"이라 한다)와(과) 기술정보수취자 ㅠㅇㅇ(이하 “을\"이라\n한다)은(는) 갑이 보유하고 있는 기술정보 및 산업재산권에 관하여 다음과 같이 라이센스\n계약을 체결한다,\n제1조 (목적) 본 계약은 제2조에 기재된 계약기술정보 및 계약지적재산권에 관하여 감이 을\n에게 독점적 라이센스를 부여하고 을이 로열티를 지급함에 있어 당사자간의 권리와 의무를\n규정하는 것을 그 목적으로 한다\n제2조 (정의) 본 계약에서 사용되는 아래의 용어는 각각 다음과 같은 의미를 갖는다\n1. 계약제품 : 계약제품이라 함은 아래에 기재된 계약기술정보를 사용하여 을이 제조하는\n제품을 의미한다,\n2. 계약기술정보 : 계약제품의 설계제조:사용과 관련하여 갑에 의해 개발되었거나 기타\n일반적으로 사용되고 있는 것으로서 갑이 알고 있는 모든 기술적 지식노하우자료 및\n정보를 의미한다. 이에 관한 기재는 별지목록에 의한다.\n3. 계약지적재산권 : 계약지적재산권이란 갑에 의해 현재 소유중이거나 또는 소유하게 될,\n그리고 계약제품의 제조에 사용 또는 적용되고 본 계약기간동안에 라이센스 관리 또는\n설정할 수 있는 특허, 실용신안, 줄원에 관한 모든 권한을 의미한다. 이에관한 기재는\n별지목록에 의한다,\n4. 계약명역 : 계약명역이란 대한민국 정부에 속하는 지역을 의미한다:\n"
영문과 동일하게 한국어 문자 인식 신뢰도를 파악한다.
인식된 문자에 대한 신뢰도 파악을 위해서 계약서 이미지에 가장 잘 인식된 문자와 그렇지 않는 문자를 시각화한다.
contract_ocr <- image_read('fig/ocr-contract-sample.png')
contract_box <- image_draw(contract_ocr)
contract_df <- contract_df %>%
mutate(loc = str_split(bbox, ",")) %>%
mutate(top_x = map_chr(loc, 1),
top_y = map_chr(loc, 2),
bottom_x = map_chr(loc, 3),
bottom_y = map_chr(loc, 4))
(most_conf <- contract_df %>%
top_n(1, wt=confidence) )
# A tibble: 1 x 8
word confidence bbox loc top_x top_y bottom_x bottom_y
<chr> <dbl> <chr> <list> <chr> <chr> <chr> <chr>
1 는 97.0 498,350,512,364 <chr [4]> 498 350 512 364
# A tibble: 1 x 8
word confidence bbox loc top_x top_y bottom_x bottom_y
<chr> <dbl> <chr> <list> <chr> <chr> <chr> <chr>
1 제 32.9 415,437,432,452 <chr [4]> 415 437 432 452
rect(most_conf$top_x, most_conf$top_y, most_conf$bottom_x, most_conf$bottom_y, border = "blue", lty = "solid", lwd = 3)
rect(least_conf$top_x, least_conf$top_y, least_conf$bottom_x, least_conf$bottom_y, border = "red", lty = "solid", lwd = 3)
dev.off()
quartz_off_screen
2
# A tibble: 1 x 7
format width height colorspace matte filesize density
<chr> <int> <int> <chr> <lgl> <int> <chr>
1 PNG 962 664 sRGB TRUE 0 38x38