PlaydataFinal / Final_project

0 stars 1 forks source link

OCR issues #5

Open yousrchive opened 4 months ago

yousrchive commented 4 months ago
  1. 웹툰 번역 OCR 착안 https://www.youtube.com/watch?v=REFmxA9hUa4

image

가맹점이 한 박스, 이화약국이 한 박스로 다른 박스로 인식되면, '가맹점 : 이화약국'(가맹점이 이화약국에 해당함)이라는 것을 알 수 없다. 다만 easyocr 등 OCR 라이브러리들은 한 단어로 인식하는 박스의 네 모서리 좌표(min, max) (x, y)를 알려주므로, 이를 이용할 수 있다. 따라서, 이미지 전처리를 통해 박스를 평행하게 만들어 두 모서리의 Y값을 일치시킨 다음, min y, max y가 비슷하면서(평행하면서) x값이 너무 떨어져 있지 않은 경우, 하나의 박스로 취급하도록 코드를 짜 줄 수 있다.

image

그런데 이 경우에도 결국 박스를 추출한 다음에 하드코딩으로 'if '가맹점' in text 이런 식의 코드를 짜야 하는데, 한글을 완벽히 인지하지 않는 경우가 많아 그럴 수 없었다. 모든 경우의 수를 계산하기란. '가맹점' '가게' '가맴정' '가맴점' '가냉점'...

yousrchive commented 4 months ago
  1. OCR + LLM 따라서 OCR 모델에 LLM을 결합했다. 다른 모델에서 LLM을 썼었기에 모델 재사용성도 좋고 LLM은 오탈자를 보완할 수 있으며, 공백의 유무에 크게 구애를 받지 않으므로 현 상황에 적합하다고 판단했다. 처음 LLM을 도입했을 때 사용한 모델은 Paddle이었다. Paddle을 기반으로 설명하겠다.

image

1과 같이 전처리를 끝낸 객체는 numpy array 형태. paddleocr 객체로 결과를 찍어보면 다음과 같이 나온다.

image

키워드가 담기는 부분만 추출했고 image

공백을 기준으로 띄워줬다. image

text 부분을 하나로 모아 llm 모델에 입력하면 llm이 오탈자를 어느 정도 자동 검수하여 날짜/시간, 가맹점명, 가격을 알려줄 수 있다.

image

PADDLE OCR + GEMINI의 성능은 뛰어났다.

yousrchive commented 3 months ago
  1. 전처리 크게 전처리에서 두 가지 작업을 거친다. 1) 윤곽선에 따라 자르기 2) 흑백 조정하기

image

이렇게만 하더라도, 기존 파일에 ocr 적용하는 것보다 성능이 대폭 개선된다.

image

대비도 조정해보았는데, 이 경우 흑과 백은 뚜렷해지나

image

전: image 후: image

그러나 정작 글씨를 확인할 때의 성능은 떨어지는 것으로 나타났다._

yousrchive commented 3 months ago
  1. 라이브러리 선택 pytesseract, easyocr, paddle의 세 가지를 써 보았다. 서비스 구현이 목적이기 때문에, 1) 무결성 2) 속도 3) 다른 패키지와의 합응성 세 가지를 고려했다.

● PaddleOCR image image

가장 우수한 성능이었고, pytesseract에 비해서 코드 제작도 어렵지 않았다. 그런데 엔진을 따로 설치해서 사용해야하는데, 해당 엔진이 현재 다른 모델의 환경과 맞지 않았고, C++과 관련된 환경변수설정이 필요하는 등 환경 세팅에 어려움이 있었다. 게다가 모델 서빙 시간도 전체 30초 내외로 긴 편이었다.

● Pytesseract

모델의 기반이 되었던 타 깃허브의 영수증 OCR 분할 결제 서비스의 코드에서는 pytesseract를 사용했었다. 이 경우 응용프로그램설치가 필요하고, 서버에 응용프로그램이 있어야 돌아가며, 한국어 성능이 좋지 않았다.

image

놀랍게도 이게 결과다. 시간은 빨랐지만 내용에 아무것도 없었기에 가능했던 것. 왜 하다 말았는지 모르겠다. 가맹점명, 시간, 날짜, 금액 정보가 하나도 나오지 않았다.

● EasyOCR Pytesseract보다 훨씬 성능이 좋았으며, 라이브러리 설치와 불러오기가 간단하고 빨라 적합하다고 판단했다. 이미지 전처리를 잘 해 준다면 기능면에서 굉장히 탁월했음.

image image

paddle보다는 많이 떨어지는 결과이지만, LLM과 결합했을 때 나쁘지 않은 결과였다. 서빙까지 10초 안팎으로 걸렸다. GPU를 사용하면 성능이 대폭 향상할 것으로 보인다.

image

yousrchive commented 3 months ago

OCR 모델의 원리: OCR(Optical Character Recognition:광학 문자 인식)은 스캔한 이미지나 사진에서 문자를 인식하여 컴퓨터에서 사용 가능한 텍스트로 변환하는 기술입니다.

image

image

image

Text Detection Model image 텍스트 영역의 각도를 조절하고 이미지를 텍스트 단위로 분할함.

Text Recognition model image 텍스트 분할 후 글자 인식하는 과정

EasyOCR은 문자 영역 인식(Detection) + 문자 인식(Recognition)기능을 모두 하는 프레임워크입니다. image