728x90
반응형
이전 글에 이어서 EasyOCR을 저는 어떻게 사용했는지 설명하도록 하겠습니다.
이전 글
developer-youn.tistory.com/45
기본 코드 구조는 아래와 같습니다.
import easyocr
reader = easyocr.Reader(['ko','en']) # need to run only once to load model into memory
result = reader.readtext('./data/test.jpg')
print(result)
일반적으로 object detection을 하면 해당 object에 사각형을 그려주고 어떤 객체인지 text를 적어서 보여주는데 그 코드나 메서드가 존재하지 않습니다. 그래서 저는 그리는 코드를 추가했습니다.
1. OpenCV 사용
import easyocr
import numpy as np
import random
import cv2
reader = easyocr.Reader(['ko','en']) # need to run only once to load model into memory
result = reader.readtext('./data/test.jpg')
img = cv2.imread('./data/test.jpg')
np.random.seed(42)
COLORS = np.random.randint(0, 255, size=(255, 3),dtype="uint8")
for i in result :
x = i[0][0][0]
y = i[0][0][1]
w = i[0][1][0] - i[0][0][0]
h = i[0][2][1] - i[0][1][1]
color_idx = random.randint(0,255)
color = [int(c) for c in COLORS[color_idx]]
cv2.putText(img, str(i[1]), (int((x + x + w) / 2) , y-2), cv2.FONT_HERSHEY_SIMPLEX, 1, color, 2)
img = cv2.rectangle(img, (x, y), (x+w, y+h), color, 2)
cv2.imshow("test",img)
cv2.waitKey(0)
result list안에는 규칙에 맞춰서 저장이 됩니다.
index | value |
0 | bbox coordinates(min x1, min y1, max x2, max y2) |
1 | ocr result |
2 | score |
대략적인 순서는 다음과 같습니다.
- 랜덤한 RGB 조합을 가진 리스트를 생성한 후 그중에서 하나를 뽑아 각 텍스트와 boundary box마다 그 색상으로 설정해주도록 했습니다.
- putText에서는 ocr의 결과를 이미지에 그려줍니다. 위치를 어떻게 잡아야 할지는 사용자가 선택해야 하는데 저는 검출된 박스의 가운데에서 위로 2만큼 올라간 위치에 그려주도록 했습니다.
- opencv에서는 rectangle함수는 가장 왼쪽 가장자리 x,y좌표를 받고 가장 우측 상단에 있는 x, y좌표를 받습니다.
이러면 잘 될 것으로 보입니다.
근데 여기에 가장 큰 문제가 있습니다. opencv를 사용하면 영어 이외의 언어는 ????로 보이는 점입니다. (실제로 저 코드 실행하면 영어를 제외하고 다 그렇게 나옵니다.)
처음에는 인코딩 문제인가 싶어 설정을 해도 바뀌지가 않았습니다. 그래서 구글링을 해본 결과 Pillow를 사용하면 언어에 관계없이 잘 된다는 걸 보고 방향을 돌렸습니다.
2. Pillow 사용
import easyocr
import numpy as np
import cv2
import random
import matplotlib.pyplot as plt
from PIL import ImageFont, ImageDraw, Image
reader = easyocr.Reader(['ko','en']) # need to run only once to load model into memory
result = reader.readtext('./data/test.jpg')
img = cv2.imread('./data/test.jpg')
img = Image.fromarray(img)
font = ImageFont.truetype("fonts/HMKMRHD.TTF",20)
draw = ImageDraw.Draw(img)
np.random.seed(42)
COLORS = np.random.randint(0, 255, size=(255, 3),dtype="uint8")
for i in result :
x = i[0][0][0]
y = i[0][0][1]
w = i[0][1][0] - i[0][0][0]
h = i[0][2][1] - i[0][1][1]
color_idx = random.randint(0,255)
color = [int(c) for c in COLORS[color_idx]]
# cv2.putText(img, str(i[1]), (int((x + x + w) / 2) , y-2), cv2.FONT_HERSHEY_SIMPLEX, 1, color, 2)
# img = cv2.rectangle(img, (x, y), (x+w, y+h), color, 2)
draw.rectangle(((x, y), (x+w, y+h)), outline=tuple(color), width=2)
draw.text((int((x + x + w) / 2) , y-2),str(i[1]), font=font, fill=tuple(color),)
plt.imshow(img)
plt.show()
# cv2.imshow("test",img)
# cv2.waitKey(0)
Pillow를 이용해 텍스트를 그릴 때 사용자의 로컬에 있는 폰트를 고를 수 있습니다.
이러면 정상적으로 언어에 관계없이 그려지는 것을 확인했습니다.
이걸로 EasyOCR 사용기를 마치겠습니다.
수정해야 할 부분이나 피드백에 대해서는 댓글로 남겨주시면 참고하겠습니다.
728x90
반응형
'Python > 딥러닝 (Deep-Learning)' 카테고리의 다른 글
Product에 Object Detection을 도입하고 싶은데 딥러닝은 하나도 모를때 읽으면 괜찮을만한 글(1) (2) | 2022.02.28 |
---|---|
LeNet-5 Pytorch 코드 구현(이라 쓰고 질문이라고 읽는다.) (6) | 2021.08.28 |
우리 EasyOCR로 한번 가자(1) (2) | 2021.04.13 |
Tensorlfow Object Detection API 사용 중 발생한 에러 정리 (0) | 2021.03.25 |
눈물없이는 볼 수 없는 회사 딥러닝 프레임워크 업데이트 모험기(3) (0) | 2021.03.17 |