2024. 5. 3. 00:41ㆍ머신러닝&딥러닝/OCR
지난 번 pytesseract로 휴대폰으로 촬영한 병원차트 OCR을 시도해 본 결과, foundation model로는 인식 성능이 매우 나쁘게 나와서 fine tuning을 시도해 보았다. 그러나, 이미지 퀄리티가 너무 안 좋아서 bounding box도 못 잡길래, 병원 측에 이미지 촬영본 말고 캡처본으로 다시 데이터를 달라고 요청드렸다.
기존 데이터는 이렇게 생겼다. (개인정보는 모두 블러 처리했다.) 위아래, 양옆으로 잘린 글씨 및 불규칙한 촬영 각도로 인해 전처리도 까다로웠고 bbox 잡는 것도 어려웠다.
새로운 데이터는 위와 같이 차트 전체 모습이 캡쳐된 형태여서 훨씬 규칙적이었다. 이 이미지 332장, 총 8,567명의 환자 데이터를 OCR하는 task를 수행하기 위해 전처리를 아래와 같이 진행하였다.
bbox 표시
첫 번째 이미지에서 unique 한 색깔로 점을 찍어서, numpy로 불러 온 이미지에 해당 컬러의 점이 어디에 위치해 있는지를 반환해 bbox로 사용할 두 점의 좌표를 반환하는 코드를 먼저 작성했다.
from PIL import Image
import cv2
import numpy as np
img_path = #이미지 경로
target_color = np.array([81, 0, 193])
img = cv2.imread(img_path)
print(img.shape)
matches = np.where(np.all(img == target_color, axis=-1))
matching_pixels = list(zip(matches[1], matches[0]))
print(matching_pixels)
이때 점 하나에도 여러 픽셀이 들어가므로, 출력된 결과를 보고 대략적인 값을 선택하면 된다.
이미지 자르기 & 콘트라스트 증가
인식 성능을 높이기 위해 OpenCV의 메소드인 cv2.convertScaleAbs를 이용하여 콘트라스트를 높였다.
import cv2
import numpy as np
import os
pth = #경로
for title in os.listdir(pth):
img_path = os.path.join(pth, title)
print(img_path)
image = cv2.imread(img_path)
print(image.shape)
x1, y1 = 415, 120
x2, y2 = 1610, 920
cropped_image = image[y1:y2, x1:x2]
adjusted_image = cv2.convertScaleAbs(cropped_image, alpha=1.5, beta=0)
cv2.imwrite(title.replace('.png', '_cropped.png'), adjusted_image)
이때 새로운 이미지가 원하는 폴더에 저장되도록 하기 위해서는, cmd 에서 경로를 destined folder로 변경하고 실행해야 한다.
'머신러닝&딥러닝 > OCR' 카테고리의 다른 글
Windows에서 tesseract OCR, pytesseract 환경설정하는 법 (2) | 2024.04.26 |
---|