테키테크 TEKITECH

EasyOCR 돌려보기 본문

Tech/ML·DL

EasyOCR 돌려보기

TEKI 2022. 3. 3. 18:36

MLOps를 하다가 문득 모델에 대해 좀 더 알아야겠다고 생각했다. 개인적으로 궁금하기 때문이기도 하지만 내가 어느 정도 모델을 돌려볼 줄 알아야 모델러와 협업 시 더 효율적으로 일할 수 있을 것 같았기 때문이다. 테스트는 아래 순서로 진행해보았다.

  1. 웹에서 모델 테스트해보기
  2. Conda 가상환경 준비
  3. EasyOCR 테스트 코드 작성 및 실행
  4. 결과 분석

OCR 중에서 가장 유명한 모델이 EasyOCR이라고 한다. 특히 한글은 좋은 모델이 별로 없는데 EasyOCR은 정확도가 상당히 높은 축에 속한다고 한다. 한국인 Contributer가 열심히 개선해주시고 계셔서 그렇다고 들었다. 사실 Clova OCR같이 기업에서 만든 모델도 성능이 좋은 게 있다고 하는데 유료...라서 이번엔 오픈소스인 EasyOCR을 돌려보았다.

코드와 데이터셋: https://github.com/lagunerio/ML-Practice/tree/main/EasyOCR

 

GitHub - lagunerio/ML-Practice

Contribute to lagunerio/ML-Practice development by creating an account on GitHub.

github.com

 

 

1. 웹에서 모델 테스트해보기

EasyOCR은 Jaided AI에서 만들었는데, 모델을 간단하게 돌려볼 수 있도록 데모 툴을 제공한다. 궁금하니까 한 번 해보자.

https://www.jaided.ai/easyocr/

 

Jaided AI: EasyOCR demo

EasyOCR is a python module for extracting text from image. It is a general OCR that can read both natural scene text and dense text in document. We are currently supporting 80+ languages and expanding. Supported Languages LanguageCode Name Abazaabq Adyghea

www.jaided.ai

 

위 사이트로 들어가면 된다. 툴 자체는 굉장히 단순하다. 이미지 파일을 업로드하고, 인식할 언어 코드를 입력해주면 된다. 다만 데모 버전인 만큼 제약이 있다.

  • 업로드 가능한 파일: png, jpg, tiff
  • 파일 크기: 2mb 이하
  • 이미지 픽셀: 1500픽셀 이하

 

Jaided AI의 EasyOCR 데모 툴 화면 스크린샷을 모델에 돌릴 수 있도록 1024*1024로 조정한 사진

 

툴을 캡쳐한 위 사진을 모델에 돌려보자. 이미지를 먼저 올려주고, 영어와 한글이 섞여있으니까 Step 2에는 en과 ko를 입력해준다. 그리고 Process 버튼을 누르면 아래와 같이 결과가 나온다. 글자 위치는 잘 인식했지만, OCR 결과는 조금 실망스럽다.

왼쪽 사진은 결과 화면이고, 오른쪽 표는 화면 아래쪽에 출력된 결과를 가져온 것이다

 

 

 

2. Conda 가상 환경 준비

모델마다 요구하는 라이브러리 종류와 버전이 다르므로 conda와 같은 툴로 가상 환경을 구성해서 모델을 돌리는 게 편하다. miniconda를 미리 설치해두어서 easyocr이라는 가상 환경만 새로 만들어주었다. 안정적으로 사용하려면 파이썬 버전을 3 이상으로 설정해야 한다고 알고 있다. 정확하게 버전 몇 이상이어야 하는지는 잘 모르겠다.

$ conda create -n easyocr Python=3.8 -y

 

그다음 새로 만든 환경에 들어가서,

$ conda activate easyocr

 

pip로 easyocr를 설치해주었다.

$ pip install easyocr

 

easyocr은 OpenCV를 사용하는데, 이게 버전이 안 맞아서 Segmentation Fault 오류가 생겼었다. 찾아보니 known issue인 것 같다. 필요한 버전에 맞게 미리 설치해주자.

$ pip install opencv-python-headless==4.5.4.60

 

참고: https://github.com/JaidedAI/EasyOCR/issues/633

 

segmentation fault (core dumped) · Issue #633 · JaidedAI/EasyOCR

I get this error out of nowhere for some reason python version is 3.9.4 Fatal Python error: Segmentation fault Current thread 0x00007fdc6aa93b80 (most recent call first): File "/home/linuxbrew...

github.com

 

준비 끝!

 

 

3. EasyOCR 테스트 코드 작성 및 실행

기본 코드는 아래와 같다. 모델을 실제로 돌릴 땐 필요에 맞게 코드를 수정했다.

import easyocr

reader = easyocr.Reader(['en'], gpu=False)
DATAPATH = "/이미지/파일/경로.jpg"
result = reader.readtext(DATAPATH)
print(result)

 

1. 언어 모델 선택

EasyOCR은 기본적으로 80개가 넘는 언어를 지원한다. 각 언어는 소문자 알파벳과 언더바(_)로 이루어진 코드 이름으로 Reader에게 알려준다.

reader = easyocr.Reader(['en'], gpu=False)	# English
reader = easyocr.Reader(['ko'], gpu=False)	# Korean
reader = easyocr.Reader(['en', 'ko'], gpu=False)	# English and Korean
reader = easyocr.Reader(['en', 'ko', 'es', 'de'], gpu=False)	# English, Korean, Spanish, and German

 

2. 컴퓨팅 리소스 선택: CPU 또는 GPU

GPU가 없어도 EasyOCR 돌릴 수 있다. 뭘로 할지에 따라 gpu 파라미터를 바꿔주면 된다.

reader = easyocr.Reader(['en'], gpu=False)	# CPU 사용
reader = easyocr.Reader(['en'], gpu=True)	# GPU 사용

 

3. 데이터셋 준비

다양한 형식으로 글자가 들어가있는 이미지를 준비해보았다.

모두 여러 웹사이트에서 직접 캡쳐한 데이터이다.

 

4. 사용한 코드

테스트 환경에는 GPU가 없어서 CPU를 사용했고, 영어와 한글을 인식하도록 세팅했다. 또, 결과 분석을 위해 데모 툴에서와 같이 이미지에 인식한 결과(글자)를 써주는 로직을 추가했다.

  • 글자 폰트는 네이버에서 제공하는 나눔고딕체를 사용
  • 폰트 크기는 직접 테스트해본 후 적당한 크기(30)로 설정
  • 모델에서 detect 한 바운딩 박스의 좌상단 좌표를 기준으로 왼쪽으로 10픽셀, 오른쪽으로 10픽셀 이동한 위치에 글자를 입력
  • 글자 색은 눈에 잘 띄도록 붉은색(255,0,0)으로 설정
import os
import easyocr
from PIL import Image, ImageDraw, ImageFont

reader = easyocr.Reader(['en', 'ko'], gpu=False)
DATAPATH = "/이미지파일이/저장된/위치"

font_size = 30
font = ImageFont.truetype("/폰트파일이/있는/위치/NanumGothic.ttf", font_size, encoding="UTF-8")

for image in os.listdir(DATAPATH):
	image_path = os.path.join(DATAPATH, image)
	if os.path.isfile(image_path):
		result = reader.readtext(image_path)
		img = Image.open(image_path)
		for r in result:
			x, y = min(list(_[0] for _ in r[0])), min(list(_[1] for _ in r[0]))
			text_data = r[1]
			d = ImageDraw.Draw(img)
			d.text((x-10,y-10), text_data, font=font, fill=(255,0,0))
		img.save(image_path+"-result.png")

 

 

 

4. 결과 분석

아래와 같이 위 프로그램으로 만든 이미지와 원본 이미지를 비교해보았다.

 

결과를 보니 한글 모델은 아인슈타인을 '야이숙타인'처럼 읽는 등 이중 모음에 약하긴 하지만 그래도 정확도가 높은 편이다. 특히, 논문 초록이나 위키피디아처럼 줄글로 되어있으면 오타를 충분히 인지할 수 있을 만큼 정확도가 높다. 하지만 따옴표 같은 특수문자는 "를 66으로 읽는 등 거의 인식하지 못하는 것 같다. 영어는 그 수가 많지 않아서 평가하기 어렵지만, 일반적인 글씨는 상당히 잘 인식하는 것 같다.

회사 상표 인식 결과가 가장 정확도가 낮은데, 폰트가 일정하지 않고 디자인 요소가 많다보니 오류가 많다. 글자를 특수문자로 인식하거나, 언어를 잘못 인식하는 경우, 또는 글자를 아예 인식하지 못하는 경우 등 정확도가 많이 떨어진다.

이미지만 보면 Confident Score까지 비교하지 못하기 때문에 찍어서 맞춘 비율이 얼마나 있는지 확인하지 못했다. 다음에 좀 더 상세하게 분석해보아야겠다.

반응형
Comments