
서론
오늘은 챗봇 AskUp을 이용하여 OCR(Optical Character Recognition)을 자동화 하는 방법을 연구해보도록 하겠습니다. 챗봇 AskUp에 이미지를 업로드하면 이미지의 글자를 텍스트로 변환해 줍니다. 이것을 광학 문자 인식, OCR이라고 합니다. 기존 파이썬 모듈에도 easyocr이나 pytesseract같은 OCR 모듈이 이미 존재하지만 최근에 사용중인 캡챠(Captcha)를 변환하는데는 많이 부족합니다. 따라서 파이썬으로 개발한 자동화 프로그램에서 어떤 캡챠를 변환해 낼 수 있다면 높은 경쟁력을 확보하게 되는 것입니다.
하이어시스템 소개 feat.김프로
소개 안녕하세요, 저는 하이어시스템의 김프로입니다. 여러분들이 어려움을 겪고 계신 일상 업무를 저의 안정적이고 빠른 소프트웨어로 자동화하는 것, 그것이 저의 목표입니다. '하이어시스템
wise-office-worker.tistory.com
본문
저는 OCR의 경쟁력을 높이기 위해 다양한 파이썬 모듈을 테스트해 보았고, 웹사이트 형식으로 제공해주는 서비스들도 이용해 보았습니다. 하지만 아쉽게도 성능이 많이 부족하였습니다. 결국 도서관에서 공부하며 직접 개발하는 것도 고민하던 상황가지 왔습니다. 단순 패턴 분석 방식의 OCR은 필기체라던가 글자가 회전되어 있다면 변환 성공율이 급격하게 낮아 졌습니다. 그러던 중 뛰어난 OCR툴을 몇개 발견했는데요 그것들은 대부분 AI-딥러닝 기반으로 변환하는 서비스였습니다.
딥러닝 기반으로 실행되는 OCR이 성능이 뛰어났으며 그중 제일 변환이 잘 되었던 제품이 synampsoft의 사이냅 OCR Pro로 분석되었습니다. 하지만 웹상에서 제공하는 서비스는 시연 및 학습 성격의 서비스였으며 정상적으로 서비스를 이용하려면 기업용 라이센스가 필요합니다. 웹상의 서비스는 사용량이 제한되어 있는듯 주기적으로 서비스가 중단되는 문제가 있습니다.

그 다음으로 성능이 좋았던 솔루션이 챗봇 AskUp였습니다. 사이냅 OCR Pro에 미치지 못하는 성능이지만 접근하기 쉬운 카카오톡을 통해 안정적으로 서비스가 제공된다는 장점이 있습니다. 하지만 AskUp도 사용에는 한계가 있었습니다. AskUp은 크레딧이라는 제도를 운영하고 있으며 하루에 100 크레딧이 모두 소진되면 OCR기능을 사용할 수 없습니다. OCR(=이미지에서 글자읽기 기능)은 1 크레딧이 소진되므로 하루에 100건의 OCR 판독만 가능합니다. 그러므로 OCR 판독이 하루 100건 이내인 경우에만 자동화 프로세스에 연계할 수 있다는 한계가 있습니다. 찾아보았으나 크레딧을 충전할 수 있는 방법은 존재하지 않았습니다.
만약 AskUp을 자동화 프로세스에 적용하고자 한다면 아래의 코드가 도움이 될 것입니다. 아래의 코드는 AskUp 채팅창을 찾아서 파일을 업로드 하고 채팅창을 읽어 결과를 파싱해 내는 코드입니다. 이 때 주의할 점은 AskUp 채팅창이 실행되어 자동화 프로그램이 식별 가능한 상태이어야 한다는 점입니다. 또한 VS Code 또는 패킹된 *.exe 프로그램은 관리자 권한을 보유해야 합니다.
import time
import pyperclip
import pyautogui
import win32gui, win32api, win32con
import const
from common_module import write_log
def find_and_click_image(image_name, timeout=const.TIMEOUT):
################################################################################
# Copyright 2023. Highersystem All rights reserved.
################################################################################
# 이미지를 찾아서 클릭
# 2023/08/07 : Initial Release
################################################################################
write_log(f'Start looking for image:{image_name}')
if timeout:
max_try = timeout
try_count = 0
while(try_count < max_try):
# 이미지 찾기
location = pyautogui.locateOnScreen(r'.//images//'+image_name+'.png', confidence=0.90)
# 이미지를 찾은 경우 클릭
if location is not None:
center_x, center_y = pyautogui.center(location)
write_log(f'Found matched image:{image_name}')
pyautogui.click(center_x, center_y)
return True
# 이미지를 찾지 못한 경우 대기
else:
try_count += 1
write_log(f'Retry {try_count}, looking for image_name:{image_name}..')
time.sleep(1)
write_log(f'Can not find image:{image_name}')
return False
def convert_img_to_text(image_path):
################################################################################
# Copyright 2023. Highersystem All rights reserved.
################################################################################
# 이미지의 Text를 읽어서 string으로 반환(AskUp 자동화 활용)
# 2023/08/07 : Initial Release
################################################################################
handMain = win32gui.FindWindow(None, 'AskUp')
if handMain == 0:
raise Exception('Can not find AskUp. Activate AskUp and try again.')
handEdit = win32gui.FindWindowEx(handMain, None, "RICHEDIT50W", None)
win32api.SendMessage(handEdit, win32con.WM_SETFOCUS, 0, 0)
win32gui.SetForegroundWindow(handEdit)
find_and_click_image('send_file')
pyperclip.copy(image_path)
pyautogui.hotkey('ctrl', 'v')
pyautogui.press('enter')
pyautogui.press('enter')
time.sleep(0.5)
while(True):
chatContents = win32gui.FindWindowEx(handMain, None, "EVA_VH_ListControl_Dblclk", None)
win32api.SendMessage(chatContents, win32con.WM_SETFOCUS, 0, 0)
win32gui.SetForegroundWindow(chatContents)
pyautogui.hotkey('ctrl', 'a')
pyautogui.hotkey('ctrl', 'c')
time.sleep(0.5)
split_text = pyperclip.paste().strip().splitlines()[-1].replace(' ', '').split(']') # 마지막 라인이 사진인 경우 컨버전 미완료
if len(split_text) == 3 and split_text[2] == '사진':
continue
break
substr_start_index = pyperclip.paste().rfind('글자를 읽었습니다.')+len('글자를 읽었습니다.')
result = pyperclip.paste()[substr_start_index:].strip()
return result
'파이썬코드공유' 카테고리의 다른 글
pyautogui.locateOnScreen 의 한글 경로 한글 파일명 문제 (0) | 2023.09.03 |
---|---|
Selenium ActionChains - 보다 확실한 동작 수행이 필요할 때 (0) | 2023.09.02 |
파이썬 셀레니움 파일 드래그 앤 드랍(selenium file drag and drop) (0) | 2023.08.21 |
구글 시트 API 연결하기 (0) | 2023.08.07 |
셀레니움 find_element XPath 완벽 해설 (0) | 2023.08.04 |