Optical Character Recognition

비교

  • easyocr: 정확도 매우 높음. 매우 느림.
  • kerasocr: 정확도 낮음. 매우 매우 느림
  • pytesseract(선택): 정확도 적절, 약간 부족. 실행속도 매우 빠름
  • paddleocr: 설치 에러 ERROR: Failed building wheel for PyMuPDF

성능 개선 방법

결과적으로, pytesseract + 모폴로지 필터로 원하는 속도, 정확도를 얻을 수 있었음.

  • 데이터 전처리 개선:
    • 이미지 품질 개선: 이미지의 대비를 조정하거나, 잡음을 제거하여 글자를 더 명확하게 만듭니다.
import cv2
import numpy as np

# 이미지 불러오기
image = cv2.imread('image.jpg')

# 그레이스케일 변환
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 히스토그램 이퀄라이제이션 적용
equalized = cv2.equalizeHist(gray)

# 가우시안 블러 적용
blurred = cv2.GaussianBlur(equalized, (3, 3), 0)

# 이진화
_, binary = cv2.threshold(blurred, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

# 모폴로지 연산을 위한 구조 요소 생성
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))

# 열기 연산 적용: 침식 후 팽창을 적용하여 작은 객체나 잡음 제거
opened = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)

# 닫기 연산 적용: 팽창 후 침식을 적용하여 내부 빈 공간을 메움
closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel)

# 결과 보기
cv2.imshow('Original', image)
cv2.imshow('Binary', binary)
cv2.imshow('Opened', opened)
cv2.imshow('Closed', closed)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 이진화: 글자와 배경을 뚜렷하게 구분하기 위해 이진화를 적용합니다.
import cv2

# 이미지 불러오기
image = cv2.imread('image.jpg')

# 그레이스케일로 변환
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 글로벌 임계값 적용
_, binary_global = cv2.threshold(gray_image, 128, 255, cv2.THRESH_BINARY)

# 적응형 임계값 적용
binary_adaptive = cv2.adaptiveThreshold(
    gray_image, 255, 
    cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
    cv2.THRESH_BINARY, 11, 2)

# 결과 보기
cv2.imshow('Global Thresholding', binary_global)
cv2.imshow('Adaptive Thresholding', binary_adaptive)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 크기 조정: OCR 엔진이 인식하기 쉬운 표준 크기로 이미지를 조정합니다.
    • DPI를 300 이상
    • 각 글자의 높이가 최소 10~15 픽셀 이상
  • 회전 교정: 이미지의 회전을 교정하여 텍스트가 올바르게 정렬되도록 합니다.
  • 모델 학습 개선:
    • 데이터셋 확장: 인식률을 향상시키기 위해 더 많은 훈련 데이터를 사용합니다.
    • 데이터 다양화: 다양한 글꼴, 크기, 배경에서 텍스트를 포함하는 이미지로 모델을 학습시켜 일반화 능력을 향상시킵니다.
    • 파인 튜닝: 특정 도메인에 맞게 사전 훈련된 모델을 추가 학습시킵니다.
  • 하이퍼파라미터 조정:
  • OCR 엔진의 하이퍼파라미터를 조정하여 최적의 결과를 얻습니다. 예를 들어, 글자 인식 임계값을 조정할 수 있습니다.
  • 포스트 프로세싱 개선:
    • 언어 모델 사용: 언어 모델을 사용하여 인식된 텍스트의 문맥적 정확성을 높입니다.
    • 규칙 기반 교정: 특정 패턴이나 규칙을 사용하여 인식된 텍스트의 오류를 교정합니다.
  • 앙상블 기법:
  • 여러 OCR 엔진의 결과를 조합하여 정확도를 향상시키는 앙상블 방법을 사용할 수 있습니다.
  • 신경망 구조 개선:
  • OCR 엔진이 신경망 기반일 경우, 신경망의 구조를 변경하여 성능을 향상시킬 수 있습니다. 예를 들어, 더 깊은 네트워크를 사용하거나, attention 메커니즘을 도입할 수 있습니다.
  • 전문화된 OCR 소프트웨어 사용:
  • 상업적으로 사용 가능한 전문 OCR 소프트웨어를 사용할 수도 있습니다. 이들은 종종 추가적인 최적화와 기능을 제공합니다.
  • 사용자 피드백 시스템 구축:
  • 사용자 피드백을 수집하고 분석하여 OCR 시스템의 오류를 지속적으로 수정합니다.

예제

Install tesseract engine

Ubuntu

sudo apt update
sudo apt install tesseract-ocr
sudo apt install libtesseract-dev

window

Install pytesseract wrapper

pip install pytesseract

Sample code

  • 유튜브 오토코더
    • 이미지로부터 글자를 읽어서 텍스트 파일로 저장하기
from PIL import Image
import pytesseract
path = r'D:\GitHub_Project\koyumi0601.github.io\_posts\Python\OCR\img.tif'
pytesseract.pytesseract.tesseract_cmd = r'D:\Program Files\Tesseract-OCR\tesseract.exe'
text = pytesseract.image_to_string(Image.open(path), lang='eng')
print(text)

with open(r'D:\GitHub_Project\koyumi0601.github.io\_posts\Python\OCR\text.txt', 'w', encoding='utf8') as f:
    f.write(text)

Youtube Transcription

00:03 이제 라이브러리 2개를 쓰는데요 pil은 저희가 예전부터 파이선서 전통적으로 이미지 모듈을 이미지 처리할 때 굉장히 많이 했었던 라이브러리 이름이고요 파이썬 이미지 라이브러리의 약자로 알고 있습니다. 이거와 더불어 쓰고 있는 게 요즘에 이제 오픈 cv도 많이 쓰고 있는데요 최근에 이제 ai 머신러닝 딥러닝에서 이제 딥러닝의 이미지

00:27 관련된 레슨이나 아니면 연구가 많이 활발하게 이루어지고 있기 때문에 이러한 지금 모듈들이 좀 다시 각광받고 있는 것 같습니다. 그리고 이제 ocr을 지원해 주는 이제 파이테스트 서렉트라는 라이브러리를 저희가 이제 사용할 건데요. 저도 이 부분은 이제 공부를 하면서 좀 알게 되었어요. 그래서 제가 이 알게 된 내용을 여러분들과 함께 공유를 하고자

00:53 이번 시간을 준비했습니다. 굉장히 코드는 간단하고요 라이브러리를 불러오고 제가 여기는 따로 안 썼습니다. 물론 이제 인포트 pil 그리고 파이트 설렉트라는 이 인포트를 써는 게 필요한데 저는 이 라이브러리 가져오는 거는 가장 간단한 부분이고 당연하다고 생각해서 안 썼고요.

01:13 대신 이제 저희가 이제 이미지를 추출한 거를 이제 텍스트 파일 txt 파일로 아니면은 엑셀 x라는 이제 엑셀로 추출도 가능하고 저는 이제 여기서 이제 이미지 샘플링을 통해서 이 텍스트 파일로 추출할 건데 이 익스포트하기 위해서 이제 윈드 오픈에 쓰는 쓸 거고요. 특히 위드는 지난 예전 시간에 설명드렸듯이 저희가

01:39 자동으로 클로즈 기능이 있기 때문에 파일을 열고 닫는 거에 대한 따로 명시할 필요 없이 위드 오픈을 한꺼번에 쓰면은 이 파일이 자동으로 열리고 그 선언문이 이제 이제 닫기면은 그 뒤로 이제 위드 오픈 문을 빠져나가면 그 파일 자체도 자동으로 닫겨서 나중에 오류가 나는 것을 방지하는 것을 이전 시간에 설명드렸던 기억이 있습니다.

02:04 에서 복습 차원에서 다시 말씀드렸고요. 그러면 이번 시간에 이제 pil이랑 이제 ocr이 어떤 건지 제가 이제 이제 여기서 확인을 좀 여러분들께 공유를 드리고자 지금 여기 구글링을 했는데요.

02:20 자

02:21 파이썬 이미지 처리 이제 필로우 pil이라는 걸로 이제 많이 쓰고 있는데 파이썬 이미지 라이브러리 필로우 모듈로 많이 쓰는데 이거는 한번 여러분들 좀 한번 한번 좀 재밌는 것들이 많아요. 그래서 직접 한번 테스트를 어떤 거 한번 샘플링으로 한번 잡고 한번 해보시는 거를

02:45 추천드려요. 이게 굉장히 이미지 처리하는 데 예전부터 굉장히 유명했던 라이브러리이기 때문에 한번 사용하는 것을 권장을 드립니다. 그리고 파이테스트 설라이트는 ocr에 대해서 정의를 한번 모르시는 분들을 위해서 제가 한번 찾아봤는데요. 옵티컬 캐릭터 레코그네이션 즉 광학 이제 캐릭터에 대한 인식을 하겠다는 걸로 이제 수동적인 이제 풀이는 되어 있고요.

03:12 여기서 가장 중요한 거는 이제 ocr을 통해서 사용되는 pdf 문서 내에서 검색하고 텍스트를 편집하고 문서를 다시 포맷할 수 있습니다. pdf 문서뿐만 아니라 이제 라이트가 안 되는 일반적인 리드하고 있는 이미지에서도 이거를 사용할 수 있습니다. 이번 테스트는 이제 이미지 사진 이제 이미지에서 그 텍스트를 뽑아내는 것을 테스트를 한번 해볼 거고요.

03:42 일단 ocr의 기능이 이런 부분이 있다는 걸 제가 설명을 드리고 있습니다. 그리고 이제 닫고요. 그러면 이제 파이 t s렉트 이걸 한번 보여드릴게요. 이게 이제 저희가 ocr 기능을 구현하기 위해서 직접 이제 필요한 이제 라이브러리고 여기 보이시죠? 이제 공식 다큐멘테이션 다큐멘트로 왔습니다. 파이썬 테스트 서백트는 이제 oh r 툴 파이썬의

04:11 이 라이브러리는 이제 ocr 툴이다. 파이썬을 위한이라고 이제 딱 처음부터 이렇게 명시해놨습니다. 그래서 여기 보이시죠? 이 레코나이스 앤 텍스트 인벤디드 이메이지 이미지 안에 있는 삽입돼 있는 텍스트를 읽을 수 있게 인식하는 게 이제 이 라이브러리의 목적이고요.

04:33 밑으로 내려보시면 이 퀵 스타트로 해가지고 언제나 이제 가장 빠르게 시작할 수 있는 간단한 샘플 코드가 나와 있습니다. 저는 이 샘플 코드를 참고를 한 거고요. 샘플 코드를 참고해서 이제 제가 한번 진행을 해보도록 하겠습니다. 근데 저희가 이 파이 테스트 서 서트 이거를 설치를 하려면

05:00 기본적으로 저희가 일단은 설치가 필요한 게 있어요. 보통 여기서도 설치가 가능하고 이제 기에서도 설치가 다 가능하지만 제가 찾아봤던 거는 한번 보여드리죠. 제가 찾아봤던 건 이제 기타 업에 여기서 설치를 했던 건데요. 여기 이제 기업에 지금 올려놓은 것 중에 이제 ocr 이거를 통해가지고 설치를 했었습니다.

05:28 만약에 이게 설치해서 여러분들의 pc에서 구현이 안 될 경우에는 이제 올드 버전으로 체크를 들어가시면 그래도 한 1년 정도 이전에 안정화된 버전을 사용하시는 것을 권장드립니다. 이제 21년도에서 아마 선택을 하면 될 것 같고요. 이 정도에서 만약에 설치를 하고 여러분들이 이미지를 제가 미리 준비를 해놓은

05:58 사진은 이게 설치가 오래 걸려요. 꽤 컴퓨터 환경에 따라 다른데 그래서 제가 지금 여러분들께 딱 이것만 확인하시면 돼요.

06:09 자

06:10 저희가 이미지를 여러 개 모듈을 쓸 건데 어디셔널 이미지 데이터 다운로드 이 모듈만 이 지금 체크 박스만 체크하고 다 넥스트 넥스트 넥스트에서 설치하면 시간이 걸리고 좀 기다리면 이제 완료가 되고요. 이게 설치가 됐다는 가정 하에 저희가 이제 파일 참으로 이제 시작을 할 거예요.

06:34 자

06:34 이제 바로 이제 들어가볼게요. 여러분들께 부연 설명은 다 드린 것 같고.

06:40 참고로 저희는 이 샘플이라는 텍스트가 적혀 있는 이미지 파일에서 제가 텍스트를 추출을 해올 거예요. 이게 저도 이제 다른 분들 이미지 파이터스 설렉트라는 ocr 테스트를 할 때 사용했던 이미지를 제가 그분들 건 참고해가지고 가져온 건데요. 어차피 이거는 이제 뉴스에서 이미지를 이제 추출을 한 거기 때문에

07:06 문제는 없을 거라고 판단이 되어서 일단 가져왔습니다. 그래서 지금 이걸 저희가 이제 테스트를 이제 ocr로 기능을 추출 글자를 추출을 할 거예요. 이제 바로 여기다 시작을 할 건데 저희는 이제 프럼 pi에 저희가 파이썬 이미지 라이브러리를 가져와야죠. 그래서 이미지를 쓸 거고요. 여기 이제 라이브러리 호출이고

07:32 인포트에서 파이 테스트 서렉트를 가져올 거예요. 저희 참고로 설치는 여러분들 제가 설치도 하셔야 되잖아요. 이걸 그냥 이렇게 설치를 하면 돼요. 여기다가 p 인스툴 파이 테스 서브렉트 이걸 그냥 설치해서 이미지 라이브러리를 이제 이제 ocr 라이브러리 설치하시면 됩니다.

07:59 전 이미 설치를 했기 때문에 지금 바로 시작하는 거고요. 여기서 이제 패스를 넣어줄게요. 저희 자주 쓰는 건데 오토 코더에 이제 샘플의 png를 쓸게요. 이 아까 제가 보여드린 이미지 파일이 샘플 png 파일이고요. 파이테스 서렉트해서 파이테스 서렉트 테스트 서렉트 cmd에서

08:25 여러분들이 설치가 되면은 보통 요즘에는 x86 x86 64비트 32비트 중에 보통은 다 64비트로 요즘에는 설치가 돼요. 그래서 이제 프로그램 프로그램 파이즈 테스 서렉트 oc 다시 어시발 테스 ocr입니다. 죄송합니다.

08:50 네 지금 여기서 이렇게 지금 경로가 이렇게 잘 잡아놨는데요. 여기 이제 이게 기본 경로로 설치돼요. 보통 32비트는 여기에 이제 x86이라는 거를 이제 괄호 열고 적어주면 될 것 같습니다. 그리고 이제 랭귀지가 있는데 참고로 여러분 저희가 이거를 지금 어디서 참고하냐면 여기에 다 샘플 코드에 다 나와 있어요.

09:18 샘플 코드에 나와 있는 걸 저희가 경로만 바꾸고 사용하는 겁니다. 한번 볼까요? 제가 이거 쓰려고 하는 거거든요. 지금 랭귀지가 어떤 게 있는지 우리가 지금 구현을 할 수 있는 랭귀지가 어떤 게 있는지 한번 체크를 해볼게요. 여기서 시작을 한번 해보면

09:39 자

09:40 ocr에서 지금 인식할 수 있는 파이테스 서렉트에서 인식할 수 있는 언어 랭귀지가 이렇게 많습니다. 이 중에 저희 것도 하나 있겠죠 저희 코리안 한국어도 있을 거예요. ko로 시작되는 jp에는 일본어 같죠 kkor 여기 있네요. 저희 한국어는 여기 있어요. 이 한국어를 쓰기 위해서 이제 마지막에

10:02 저희가 구현을 할 때 랭귀지를 kor로 지정을 해줄 겁니다. 그러면 이제 이거는 저희가 랭귀지가 어떤 게 있는지 확인을 했고 그럼 이제 저희가 코리안을 쓸 거니까 코리안에 이제 변수를 할당을 해줄 거예요. 이거는 이미지 2 스트링 이것도 역시 여러분들 다큐멘테이션 보면 나와 있어요. 샘플 코드 전 거기서 그대로 활용을 한 거고요.

10:24 이미지에 오픈을 할 건데 그 파일의 오픈은 위에서 지정해 놓은 이 이 패스 이 패스를 여기다 넣어줄 거예요. 이 패스를 여기다 넣어주면 패스 해주고 랭기지는 저희 아까 kor인 거 보셨죠? 한국어는 kor을 넣어줄 거고요. 여기서 이제 추출을 한번 해볼게요. 추출을 이제

10:49 이미지에서 글자를 ocr 기능을 이용해서 한번 추출해보겠습니다. 추출하면 지금 잘 됐죠? 제가 여러분들께 다시 샘플 이미지를 가져와서 보면 근데 어느 정도 좀 일부의 차이는 있어요. 그게 왜 그러냐면 사실 이 ocr은 굉장히 기술력이 뛰어난 그 이미지

11:15 광학 기술력이 들어가는 부분이 있기 때문에 이거는 이제 기업에 다 자산이고 기술력입니다. 그렇기 때문에 ocr 기능을 활용한 제품을 만들고 그 제품을 유료로 판매를 하고 있는 거고요. 다만 저희는 이거는 간단한 이미지 같은 경우는 이렇게 추출을 해보면 어떨까 해서 텍스트로 여러분들께 지금 보여드리는 건데

11:38 사실상 상용적으로 여러분들이 현업에서 쓰기에는 조금은 무리는 있지 않을까라는 제 개인적인 생각은 있습니다. 저희 일단은 보시면 여기 잠시만요. 지었지 커서 이상하다. 여기서 그냥 이스 이거랑 여러분 그리고

12:06 저 이미지 열린 거 이거랑 지금 동일하죠 거의 비슷해요. 한 한 명이 없네. 한 한 명이 없고 klpg kapdga가 없네. 시상식 잠깐만요. 이게 아마 영어랑 한국어랑 같이 쓰려면 제가 지난번에 테스트했을 때

12:28 잉글리시를 플러스 했던 것 같은데 한번 제가 여기다 한번 해볼까 플러스 해볼게요. 이건 제가 한번 좀 찾아봐야 될 거야. 근데 일단 kor로 하는 게 맞는 것 같네요. 이게 영어랑 섞여 있으면 지금 추출이 ocr이 제대로는 다 안 되는 것 같은데 어쨌든 제가 일단은 이

12:54 어

12:55 ocr 자체에 대한 기능을 구현을 하는 걸 여러분들께 보여드리기 위해서 일단 제가 한번 3고차 실행을 했고요. 이걸 저희가 파일로 추출할 건데 리더 오픈 오픈을 해서 여기에 저희가 or ocr로 읽은 파일들을 한번 어디다 추출할 건지 여기다가 적을 거예요. 저는

13:18 경로를 샘플 언더바 ocr에 cxd 파일로 추출할 거고 여기 이제 라이트 모드를 넣을 거예요. 라이트 모드를 이제 리드가 아닌 라이트 모드로 w 썼고 인코딩은 utf 8일로 할게요. 왜냐면 한글은 utf 파일 형식이기 때문에 utf8로 인코딩을 해서 이제 라이트를 할 거고

13:38 sf로 해서 이 윈도 오픈 전체를 sf로 받겠습니다. 그걸 받은 거를 이제 f 라이트로 코리안 위에서 지금 추출된 이 내용들을 여기다가 이제 라이트론 하겠습니다. 보세요. 여기 이제 이 내용들을 이제 이 일 이 파일에 있는 여기 tft 파일에 이 경로에 설치하도록 하겠습. 라이트를 하도록 하겠습니다.

14:06 자

14:08 실행을 해볼게요. 실행을 하면 일단은 저희가 여기는 이제 글자는 출력이 된 걸 확인을 했고 보시면 같은 경로에서 제가 한번 이렇게 가져왔습니다. 샘플이 여기 있고 샘플 ocr이 여기 지금 새롭게 생겼어요. 방금 보세요. 테스트로 지금 넣어놓은 거를 지금 방금 생겼는데 여기 보시면

14:35 자

14:36 저희가 동일하게 지금 추출한 게

14:39 자

14:40 여기에 나오죠 오늘 왜 이렇게 안 먹지 지금 이렇게 보시면 여기 지금 여기 지금 이미지에 있는 글자들이 이렇게 여기에도 지금 이렇게 글자가 추출이 출력이 된 것을 확인하실 수 있습니다. 이제 정리할게요. 이번 시간 정리하면

15:05 처음에 여러분들은 p 인스트로 타이트스 서렉트 즉 ocr에 라이브러리를 설치를 해주고요. pil의 이미지를 가져오기 위해서 이 pil 파이썬 이미지 라이브러리를 가져올 겁니다. 그리고 설치한 라이브리 파이텍스 설렉터를 다시 인포트해서 가져오고요. 저희가 이미지를 불러온 이미지를 이제 추출할 이미지의 경로를 여기다가 적어줍니다. 적어주고 지저분하게 파란색으로 할게요.

15:35 페리터 서렉트를 설치한 경로를 여기다 이렇게 적어줍니다. 여기다 적어주는데 제가 밑에 주석 처리한 거는 여러분들께 랭귀지에 대한 모든 종류를 확인하기 위해서 저희는 이걸 가져온 출력을 한 건데 필요 없기 때문에 다시 주석으로 넣어준 거고요. 다시 이제 코리안으로 변수를 가져오는데 저희가 위에서 불러온 이미지를

16:00 가져오고 경로를 그 경로를 렌디즈 kkor 한국어로 추출해서 이 코리안의 변수에 담습니다. 담고 출력을 해봅니다. 출력을 했을 때 여러분들이 아까 여기서 이렇게 출력이 되는 걸 보셨죠 그리고 그 출력된 거를 c 오토 코더의 샘플 언더바 ocr txt 파일에

16:23 어

16:23 이제 라이트 모드로 저장을 해주는데 한국어이기 때문에 utf8로 저장을 해주는 겁니다. 그래서 이렇게 지금 종료가 된 거고요. 어떻게 이번 시간이 도움이 되셨는지 모르겠네요. ocr을 제가 한번 만들어본 거는 어제 제가 이제 주변에서 한번 ocr 기능에 대해서 한번 얘기를 한번 들은 적이 있어요.

16:47 그래서 한번 이거 한번 재밌겠다 해가지고 만들어본 거고요. 물론 실제는 현실적으로 쓰기에는 어려운 감은 있지만 직접 여러분들이 ocr이 어떤 거고 그리고 내가 이 파이썬으로 구현을 할 수 있고 그리고 경우에 따라서는 이제 글자 폰트나 글자 양식 그리고 간격에 따라 ocr에 완벽히 들어맞는 경우도 있습니다.

17:11 이게 이제 특히 한글만 쓰고 이런 제약 조건이 좀 많긴 하지만 그러한 것들이 잘 조건이 갖춰졌을 때 여러분들이 이제 무료로 상용 소프트웨어를 쓸 필요 없이 무료로 ocr 기능이 있는 것을 여러분이 직접 구현을 해서 쓸 수 있는 것을 보여드리고 싶었습니다. 제가 준비한 시간은 여기까지고요 이번 시간이 도움이 되셨다면 좋아요와 구독 알림 설정을 해주시면 제가 이 채널을

17:37 지속적으로 유지하고 콘텐츠를 개선하는 데 큰 힘이 될 것 같습니다. 이번 시간 긴 영상 봐주셔서 감사합니다.

clovanote.naver.com