Flutter 에서 Google ML Kit으로 OCR 해보기

지난번에 EasyOCR을 이용해서 이미지에서 텍스트를 인식하는 시도를 해보았습니다.

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

오늘은 이러한 동작을 스마트폰에서도 수행할 수 있도록 간단한 앱을 만들어 보았습니다. Flutter에서도 Google ML Kit을 이용해서 이것이 가능한데요. 아래 링크를 참고하세요.

Google ML Kit for Flutter

저는 이중에서 Text Recognition V2를 이용했습니다. 이걸 써야 한글도 인식할 수 있어요.

사용한 주요 함수의 소스코드를 공유합니다. 이미지 선택하는 라이브러리는 아래 링크의 것을 이용했습니다.

Flutter Image Picker

주요 소스코드

  // 이렇게 하면 기본세팅인 영어 입니다.     
  final TextRecognizer _textRecognizer = TextRecognizer();
  // 아래 주석내용 처럼 해야 한국어 입니다.
  // final TextRecognizer _textRecognizer = TextRecognizer(script: TextRecognitionScript.korean);
        
  // UI에서 버튼 클릭했을 때 이벤트 함수  
  Future<void> textDetect() async {
    var image = await ImagePicker.platform.pickImage(source: ImageSource.gallery);
    String path = image!.path;
    await processImage(InputImage.fromFilePath(path));
  }

  // 실제 텍스트를 인식하는 함수
  Future<void> processImage(InputImage inputImage) async {
    if (!_canProcess) return;
    if (_isBusy) return;
    _isBusy = true;
    setState(() {
      _text = '';
    });
    final recognizedText = await _textRecognizer.processImage(inputImage);
    if (inputImage.inputImageData?.size != null &&
        inputImage.inputImageData?.imageRotation != null) {
    } else {
      _text = 'Recognized text:\n\n${recognizedText.text}';
    }
    _isBusy = false;
    if (mounted) {
      setState(() {});
    }
  }

recognizedText.blocks 를 이용해서 인식된 텍스트 영역을 알아낼 수 있습니다.

EasyOCR에서 사용했던 시료를 똑같이 써서 테스트 해봤습니다. 어떤 시료 였는지는 최상단 링크의 글을 확인해주세요.

테스트 결과

  • 시료1
    • 이미지1
    • EasyOCR 보다는 인식률이 좋습니다. 속도도 빠르구요. 특수문자도 인식하는군요.
  • 시료2
    • 이미지2
    • 이건 차이가 없습니다. 오히려 특수문자로 오인식되는 부분이 있네요.
  • 시료2
    • 이미지3
    • 이건 오히려 영어로 인식해 버리네요. EasyOCR은 로 오인식했는데, 이건 L4로 인식해 버립니다.

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
    • 숫자부분은 모두 맞게 인식되었는데, 한글 부분이 로 인식되었습니다.
  • 추가적인 연구과제
    • 폰트를 지정해서 트레이닝 할 수 있는가? 그렇다면 정확도가 개선될것인가?
    • 한글과 숫자가 혼합되어있을 때와 그렇지 않을때의 정확도가 어떻게 될까?