EASYOCR을 이용해서 글자인식을 해보자

이미지에서 글자를 자동으로 인식하려면

  • OCR(광학 문자 인식) 기술을 이용해서 이미지상의 글자를 인식해 보고자 합니다.
  • 여러가지 라이브러리가 있지만 저는 EasyOCR을 선택했습니다.
  • README만 봐서는 설치가 쉬울것 같은데, OPENCV 관련 의존성 문제가 발생하고 쉽지 않더군요.
  • 아나콘다를 이용해서도 해보고, 이것저것 방법을 찾아가면서 해봤지만 하나 해결하면 하나 터지고 하는 식이라 이러다 날이 새겠다 싶었습니다.
  • 그래서 속시원하게 도커로 해결했습니다. 도커파일을 제공하더라구요.
    • https://github.com/JaidedAI/EasyOCR/blob/master/Dockerfile
    • 빌드 : docker build -t easyocr:1 .
    • 컨테이너 실행 : docker run -d --name easyocr -it --rm easyocr:1
    • docker cp로 사용할 이미지시료 파일과 예제코드를 복사합니다.
    • docker exec로 컨테이너 내부로 접근해서 파이썬 예제코드를 실행하면 됩니다.
    • 실행속도가 빠르지는 않습니다.

테스트 결과

  • 시료1
    • 스마트폰 에뮬레이터에서 돌아가는 게임의 자막입니다.
    • 이미지1
    • [([[62, 401], [382, 401], [382, 433], [62, 433]], 'YMonsters from al', 0.45920909949028654), 
      ([[390, 400], [535, 400], [535, 430], [390, 430]], 'ouer the', 0.6884365613873595), 
      ([[92, 441], [535, 441], [535, 480], [92, 480]], 'world compete uith skill or', 0.521200997045897), 
      ([[92, 486], [294, 486], [294, 516], [92, 516]], 'sueat it out', 0.8942020647336351), 
      ([[302, 486], [488, 486], [488, 516], [302, 516]], 'here in the', 0.42585217998940594), 
      ([[496, 486], [630, 486], [630, 514], [496, 514]], 'Monster', 0.9837152453574232), 
      ([[94, 530], [202, 530], [202, 556], [94, 556]], 'Rrena', 0.9947436302295627),
      ... 
      
    • 원하는 결과
      • Monsters from all over the world compete with skill or sweat it out here in the Monster Arena!
      • 구글 번역기에 돌리면 나오는 해석
        • 몬스터 아레나에서 전 세계의 몬스터들이 실력을 겨루거나 땀을 흘려보세요!
    • 산출된 결과
      • YMonsters from al ouer the world compete uith skill or sueat it out here in the Monster Rrena!
      • 구글 번역기에 돌리면 나오는 해석
        • 전 세계의 YMonsters가 기술을 경쟁하거나 여기 Monster Rrena에서 겨루세요!
  • 시료2
    • 제 차의 앞 번호판 입니다.
    • 이미지2
    • 숫자부분은 모두 맞게 인식되었는데, 한글 부분이 4로 인식되었습니다.
  • 시료3
    • 제 차의 뒷 번호판 입니다.
    • 이미지3
    • 숫자부분은 모두 맞게 인식되었는데, 한글 부분이 로 인식되었습니다.
  • 추가적인 연구과제
    • 폰트를 지정해서 트레이닝 할 수 있는가? 그렇다면 정확도가 개선될것인가?
    • 한글과 숫자가 혼합되어있을 때와 그렇지 않을때의 정확도가 어떻게 될까?

IPTABLES에 관한 몇 가지 사실들

정의 가능한 최대 룰의 수

iptables를 아래와 같은 룰들로 정의해서 사용하는데요.

-A INPUT -p tcp -m tcp --dport 10021 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A INPUT -s 211.33.81.233 -j ACCEPT
-A INPUT -s 183.102.23.69 -j ACCEPT
-A INPUT -s 188.165.205.0/255.255.255.0 -j DROP
-A INPUT -s 62.210.167.0/255.255.255.0 -j DROP

과연 얼마나 많은 룰을 사용할 수 있는지 궁금했어요. 그래서 검색을 해봤습니다.

그 결과 25000개 까지 가능하다고 하네요.

특정 URL을 상대로 룰을 적용할 수 있는가?

불가능한 것으로 보입니다. 어찌보면 당연한 것 입니다. iptables는 레이어 3~4의 수준에서 관여합니다. 그런데 URL을 지정하는 패킷을 확인하고 관여하는것은 그것보다 더 고수준의 영역 입니다.

Flutter Logs는 얼마나 견고한가?

CLI로 flutter logs를 실행하면 flutter에서 print 명령으로 전달된 로그를 확인할 수 있습니다. 이건 너무 간단한 일인데, 사용하다보니 과연 끊김없이 잘 전달 될까 하는 고민이 들더라구요. 그래서 실험을 해봤습니다. 지난번에 메모리 체크를 위해 만들었던 HelloWord 앱을 조금 바꿔서 테스트를 해봤어요.

_timer = Timer.periodic(Duration(seconds: 10), (timer) {
    if (_counter < 2880) {
      setState(() {
        _counter++;
      });
      print("MyLog: ${_counter}");
    }
  });

10초에 한번씩 2880번, 그러니까 8시간동안 계속 로그를 남겨봤습니다.

flutter logs > mylog.log

PC에서는 이렇게 실행해놓고

앱을 킨 다음에 와이파이 켜놓고 8시간동안 잠을 자면 실험 끝인데요.

다음날 일어나서 로그파일을 확인하니, 2880번 실행된게 아니군요. 1770번 까지만 실행되어 있었습니다. 중간에 앱이 꺼져있기도 했고, PC의 절전모드를 끄는걸 깜빡했습니다. 뭐.. 아무튼 1770번 로그가 전달되는 동안 빠트림 없이 왔느냐를 체크해봅면 됩니다. 그런데 뭔가 이상하네요.

이미지1

1770개가 있어야 하는데 1771개가 존재한다고 나옵니다. 뭔가 중복된게 아닌지 의심됩니다. 거참 귀찮게 하는구먼~

스크립트를 짤까 하다가 자세히보니 오! 찾았다 요놈!! 중간에 26이 두번 왔네요.

  • 타이머가 2번 발생할리는 없겠죠?
  • 그렇다면 패킷이 두번 왔다는건가? 근데 그것도 타이머가 2번 발생할 확률만큼 낮지 않을까요?
  • print가 2번 데이터를 보냈다는게 합리적인 추론인데, 이게 print 자체의 문제인지 값을 받아들이는 flutter logs의 문제인지는 더 연구가 필요할 듯 합니다.

결론

상황에 따라서 flutter logs가 중복된 log를 받을 수 있으니 유의합시다