2021년 12월 13일 월요일

OCR 인식률 비교. 테서렉트 vs paddleocr vs easyocr vs 카카오 api vs < 네이버 api


최근 디아블로2 레저렉션을 시작 했다. 예전과 다르게 유니크 아이템 외에도 확인 해야 하는 아이템들이 많았다.

그런 정보를 다 찾고 확인 하는 게 힘들었다. 

디아블로 아이템의 아이템명이나, 속성들을 감별해서 미리 등록해 놓은 DB와 비교하여 가지고 있어야 할 아이템을 판별하는 프로그램을 만들고 싶었다.

결론은 실패. OCR 문자 인식부터 막혔다.

OCR 인식에 총 3일을 투자 했는데, 이틀을 테서랙트(tesseract)에 투자했다.  


테서렉트

인식률 향상을 위해 gray 변환, medianBlur로 노이즈 제거, thresholding, erosion, dilation 등 온갖 기법을 다 써도 인식률이 크게 향상되지는 않았다.

psm 옵션과 oem옵션을 아무리 조절해도 인식률은 크게 향상 되지 않았다.

디아블로2의 폰트 자체가 일반적인 폰트가 아니다 보니 인식률이 떨어 지는 것으로 보인다.

디아블로 폰트를 새로 학습하여 인식을 해 보기로 했다.

블리자드에서 공식적으로 제공하는 폰트는 없고 비슷하게 만든 폰트는 있었다.

이중에 kodia만 한글을 지원해서 사용했다.

학습에는 jTessBoxEditor를 사용했다. 

일단 학습완료는 되긴 하는 데, 오류가 나는 부분이 많다.

APPLY_BOXES: boxfile line 1/가 ((104,3153),(145,3193)): FAILURE! Couldn't find a matching blob

그래도 완료된 모델로 돌려 보았으나 여전히 인식률은 좋지 못했다.

학습이 제대로 안 된 것 같다.

이틀동안 이 삽질을 하고 있으니 저 오류 나는 것도 찾기 싫어졌다. 테서랙트는 포기.


EasyOCR

다음으로 시도한 건 EasyOCR. 이거 꽤 좋다. 설치도 쉽고, 사용법도 굉장히 쉽다. 인식률 자체도 테서렉트보다 확실히 좋다.

이미지 전처리를 시도한 거랑, 안한 거랑 크게 인식률 향상은 없었다.

다만 내가 원하는 정도의 인식률은 안 되었다.


API

이쯤되면 그냥 돈내고 사용하는 API를 사용해볼까하는 생각이 들었다.

테스트 해본 API는 카카오랑 네이버

카카오 ocr api 테스트

네이버 ocr 테스트 - CLOVA OCR

네이버는 테스트를 위해서 이름, 이메일, 사업체를 등록해야 한다. 좀 꺼림칙했지만 일단 테스트만 해보기 위해 넣었다.

결과는 네이버의 압승. 단 2군데만 조금 틀린 결과를 보여줬다.

카카오 OCR은 생각보다 좋지 않았다. EasyOCR보다 못한 것 같다.



주관적인 OCR 인식률 비교

테서렉트 == paddleocr < 카카오 api < easyocr < 네이버 api


인식에 사용한 이미지



@Scheduled 어노테이션 파라미터를 환경변수로 사용하기

@Scheduled  어노테이션으로 10초마다 실행하는 스케쥴은 아래와 같이 쉽게 만들 수 있다.

@Scheduled(fixedDelay = 10000)
public void scheduleTask() {


여기서 10000 값을 환경변수로 적용하려고 하면 fixedDelay는 final long 타입이여야 등록 가능한데,  환경변수로 가져오는 값은 final로 처리 할 수가 없다.

그럴때는 아래처럼 fixedDelayString을 사용하면 된다.

  @Scheduled(fixedDelayString = "${myscheduler.period}")
  public void scheduleTask() {