[OCR] 1. OCR(Optical Character Recognition)


OCR

  • Optical Character Recognition
  • STR (scene text recognition) 이라고도 한다.
  • 이미지에 있는 글자들을 인식하는 기술이다. 최근 딥러닝 기술이 들어오면서 OCR 성능이 많이 올라갔다.
  • OCR 에 필요한 모듈들
    • 사람이 글자를 읽을 때 1) 글자를 먼저 찾고, 2) 찾은 글자를 인식한다.
    • OCR 은 크게 글자 영역을 찾는 모듈, 영역별로 글자들이 뭐가 있는지 인식하는 모듈 크게 2가지 모듈이 있다.
    • 처음은 글자 위치를 찾는다.

      Untitled

    • 이후 글자 영역 별로 글자를 인식한다.

      Untitled

    • OCR 이 끝나면 이미지 내 어떤 위치에 글자들이 있고, 그 위치에는 어떤 글자가 있는지를 알 수 있게 된다.
    • 이 접근 방식을 Offline Handwriting 이라고 부른다. 즉 이미지 입력, 글자값 출력 이다.
    • 반대로 Online Handwriting 도 있다. 적는 점들의 순서 즉 쓰여지는 글자의 좌표 시퀀스를 입력으로 받아서 글자값을 출력할 수도 있다.
    • 이러한 방식에 따라 OCR 모듈 이나 구조 형식이 달라진다.
    • 여기서 다룰 OCR 은 이미지 입력에 해당되는 Offline OCR 이다. 좌표 시퀀스를 입력으로 받는 Online OCR 은 여기서는 다루지 않는다.

Text Detector

  • OCR 의 첫 모듈로, 글자 영역을 검출한다.
  • Computer vision 에서 객체 검출은 object detection task 에서 이뤄진다. 이 객체 검출과 글자 검출은 뭐가 다를까?
  • 객체 검출(object detection)

    Untitled

    • 단일 객체 검출은 이미지 내 객체 한 개를 가정한다. 그 객체가 어떤 클래스인지는 이미 정의되어 있다.
    • 이미 정의된 클래스 외에 다른 클래스는 알지 못한다. 정의된 클래스 내에 해당하는 객체가 있는데, 그 객체가 어디에 있고 무슨 객체인지를 파악하는 task 를 단일 객체 검출이라고 한다.
    • 출력은 클래스에 해당되는 정해진 길이의 벡터와 위치 정보(x,y,w,h) 가 나온다.

    Untitled

    • 반면에 다수 객체 검출은 이미지 내 객체가 여러 개 있다. 각각 어디에 있는지, 그리고 각각 어떤 클래스에 해당되는지가 출력된다.
    • 출력은 객체 별로 어떤 클래스이고 어디에 있는지 즉 객체 별 Class, bbox 묶음 벡터 가 한 객체를 표현하게 된다.
  • 글자 검출(text detection)

    Untitled

    • 하나의 이미지에 글자가 여러 개 있으므로 다수 객체 검출에 해당한다.
    • 또한 글자 검출에서 클래스를 보면 여러 클래스가 있는 것이 아니라 글자인지 아닌지가 문제된다.
    • 왜냐하면 영역이 있으면 이 영역의 클래스는 모두 글자이기 때문이다. 즉 굳이 클래스가 뭐인지를 표시할 필요가 없다. 따라서 단일 클래스를 다루는 문제가 된다.
    • 즉 글자 검출은 일반적인 다수 객체 검출과 비교하면, 글자만 관심이 있기 때문에 클래스가 하나인 다수 객체 검출에 해당한다.
    • 따라서 출력은 각 글자 영역별 위치 정보(x,y,w,h)만 나온다.

    Untitled

    • 이미지가 입력으로 들어올 때, 글자 영역이 어딘지를 출력한다.
    • 그러나 일반 객체 검출과 뭐가 다르냐면, 글자 검출에서의 영역 표시는 영역의 종횡비(가로세로 비율)가 굉장히 다르다.
    • 일반 객체는 1:1 에 가까운 경우가 많다. 그러나 글자의 경우 글자 특성상 종횡비가 큰 경우가 많다. 보통의 언어에서는 가로가 긴 형태를 띈다.
    • 따라서 일반 객체 검출에 사용하는 모델 구조를 그대로 쓰지 않고 이 특징을 살릴 수 있는 구조를 새로 만들게 된다.
    • 두번째 특징은 객체의 밀도가 다르다. 즉 이미지 내 글자는 밀도 자체의 정도가 다르다. 객체 영역 내 빽빽하게 글자가 들어서있다.
    • 이 특징도 잘 살리기 위해서 모델 구조가 변경된다.
    • 글자 영역 검출을 해서 글자 영역이 나오고, 그 다음은 글자 영역 별로 입력을 받아서 그 안에 있는 글자가 무엇인지 알아내는 recognizer(Text Recognizer)가 돌아간다.

Text Recognizer

  • 글자 영역 박스가 입력으로 들어가서 recognizer는 그 결과값으로 영역 안에 글자를 뽑아낸다.

    Untitled

  • 주의해야할 것은 detector(Detector)는 이미지 전체가 입력인 반면 recognizer(Recognizer)는 이미지 전체가 아니고 이미지 전체에서 찾은 글자 영역별로 이미지를 잘라서 recognizer에 넣어주게 된다.
  • recognizer 모델 구조를 짤 때도 이미지 전체가 들어온다고 가정하지 않고 아주 일부분이 들어온다고 가정해서 모델 구조를 짜게 된다.
  • 즉 Text Recognizer 는 CV 와 NLP 의 교집합 영역이다. 왜냐하면 입력은 이미지인데 출력이 글자이기 때문이다.

    Untitled

  • 일반적 구조를 봤을 때 이미지가 입력이기 때문에 AI 모델 구조의 앞쪽에는 이미지를 다루는 구조가 들어간다. 보통 쓰는 CNN 같은 구조들이 앞 쪽에 많이 배치된다.
  • 뒤쪽은 출력물이 텍스트이기 때문에 NLP 에서 다루는 모델 구조가 많이 들어간다.
  • 이런 특징을 갖는 유사한 task 가 captioning 이다. image captioning 은 이미지가 들어오면 이미지에 대한 내용을 서술하는 문장을 뱉어내는 task 다. 약간 OCR 과 유사한 형태의 모델 구조를 따르고 있다.

Serializer

  • detector 와 recognizer 를 거치면 이미지가 들어왔을 때 글자 영역을 다 찾고, 영역 안에 있는 글자값도 다 찾게 된다. 여기까지 OCR 이라 해도 괜찮다.
  • 그러나 하나가 더 붙어야 하는데, 그것이 Serializer 다. 이 Serializer 까지 해서 OCR 최종 결과값을 얻는다.

    Untitled

  • Serializer 는 글자 recognizer 까지 돌려서 얻은 결과값들을 일렬로 정렬해준다.
  • recognizer 결과가 나오면 어느 위치에 어떤 글자가 있다는 정보만 있다. 이를 사람이 읽는 순서대로 일렬로 정렬해서 하나의 시퀀스, 하나의 문장처럼 만들어내는 작업을 하는 것이 Serializer 다.
  • 이를 굳이 왜 하냐면, OCR 에서는 글자를 찾고 인식한 후 뒤에 다른 기능을 가진 모듈을 많이 추가한다. 특히 텍스트를 뽑기 때문에 NLP 관련 모듈을 많이 붙인다. 그래서 Serializer 를 붙이게 되는 것이다.
  • 현재 Serializer 의 상용화된 기술은 아직까지는 AI 모델로 하지 않고 SW 1.0 방식으로 열심히 생각해서 rule based 로 짜는 경우가 대부분이다.
  • 즉 Serializer(serializer)는 rule 을 가지고 OCR 결과값을 자연어 처리하기 편하게 일렬로 정렬한다.

    Untitled

  • Serializer 를 통해서 이미지 상의 검출되어 인식된 글자들을 사람이 읽는 순으로 정렬한다.
  • 이 때 위 예시와 같이 Grouping(단락끼리 묶음), 단락 간 정렬, 단락 내 정렬(좌상단에서 우하단으로) 의 순으로 이루어진다.
  • 이후 serializer 결과값을 입력으로 받는 자연어 처리 모듈을 뒤에 붙여서 사용하기 쉬워진다. 왜냐하면 NLP 는 텍스트를 입력으로 받기 때문이다.
  • 자연어 처리 모듈은 금칙어 처리, 요약, 글자 의미 파악 등등의 서비스 시나리오가 가능하다.
  • 따라서 Serializer 는 인터페이스에 가까운 모듈이다.
  • 여기까지 포함된 OCR 엔진을 돌리면 아래와 같은 결과값이 나온다. Grouping, box 위치, box 내 글자값의 결과를 얻을 수 있다.

    Untitled

Text Parser

  • 글자 영역을 찾고(detector), 영역 별 글자값을 인식 한 뒤(recognizer), 일렬로 정렬(serializer) 하면 OCR 결과값을 얻을 수 있다. 이 뒤에 의미있는 활용을 위해서 NLP 모듈을 붙일 때, 상업적으로 제일 많이 쓰는 NLP 모듈은 key 에 대한 value 를 추출하는 것이다.
  • 즉 이미 뽑고 싶은 정보들(key)이 정해져 있고 그 정보가 무엇인지 value 를 추출하는 모듈이 보통 많이 사용된다.

    Untitled

  • 명함을 예로 들어보자.
  • 명함 이미지에서 사람이 뽑고 싶은 정보는 정해져 있다. 회사명, 이름, 포지션, 핸드폰 번호, 이메일 주소 등 정해진 key 들이 있다. 이 key 에 대한 value 가 뭔지를 찾아내는 것이 Text Parser 가 하는 일이다.
  • Parsing 의 역할을 수행하는 NLP 모듈이 붙으면 key-value 가 자동으로 AI 가 뽑아줄 수 있는 것이다.

    Parser 가 동작하는 원리

    • Parser 에서 key-value 를 뽑을 때 여러가지 접근론이 있는데 한 가지 주요 접근론은 BIO 태깅을 활용하는 것이다.
    • BIO 태깅을 활용한 개체명 인식은 문장에서 기 정의된 개체에 대한 값을 추출한다.
    • 개체명 인식이란 어떤 문장이 들어왔을 때 이미 정의된 개체, 사람 이름, 주소, 나라명 등 이미 정의를 해놓은 것에 해당되는 것이 무엇인지 추출하는 task 다.
    • BIO 는 Begin(어떤 개체명의 시작 토큰), Inside(해당되는 개체의 중간에 해당하는 토큰) Outside(정의된 개체와 상관없는 토큰)의 의미다.

    Untitled

    • 문장을 먼저 토큰화한다. 이 토큰들은 BIO 태깅의 대상이 되는 기본 아이템들이다. 위 예시에서 BIO 태깅된 결과를 보면 알 수 있다. “해리포터” 에서 “해” 는 영화명의 시작 토큰이고 “리포터” 는 중간에 해당하는 토큰이다.
    • 즉 토큰이 들어오면 토큰이 B, I, O 중 어느 것인지 분류하는 문제가 된다. 위 예시처럼 annotation(labeling) 해서 학습을 시키면, 문장이 들어오면 BIO 태깅을 예측한다. 그리고 그 예측값을 가지고 후처리를 진행한다.
    • 간단한 후처리로 이미 정의된 개체명에 대한 값을 뽑아낼 수 있다.
  • OCR 에서도 key-value 를 뽑는데 BIO 태깅과 유사하게 동작한다.

    Untitled

    • 먼저 영수증 이미지를 OCR 을 돌리면 글자 위치와 글자 값을 얻을 수 있다.
    • 이를 Serialization 하여 자연어 처리 모듈에 넣기 편하도록 일렬로 정렬한다.
    • Serialization 후 BIO 태깅을 예측한다. 실제 추론을 할 때 박스 별로 어떤 tag 에 해당하는지 추론을 하게 되는 것이다. 즉 OCR 의 글자 영역 레벨이 token 이 되어 글자 영역 별로 BIO 태깅을 달아준다.
    • 이후 후처리를 통해서 영수증에 대한 기 정의된 key-value 값을 뽑아낸다.
    • 아래는 OCR + Text Parsing 의 결과이다.

    Untitled

OCR services

  • OCR 이 서비스로 사용되는 예시를 살펴보자.
  1. Text Extractor

    Untitled

    • 글자를 뽑는 것만 해도 서비스로 많이 쓰일 수 있다.
    • 이미지에서 글자가 뽑힌다는 것은 copy & paste 가 될 수 있다.
    • 즉 이미지를 대상으로 OCR 을 돌리면 이미지 속의 원하는 글자를 복사 붙혀넣기할 수 있다.
    • 외국어 타이핑, 다량의 글자 입력, GetWiFiPassword 등에 응용될 수 있다.
  2. Text Extractor + Natural Language Processing
    • 글자를 뽑고 NLP 엔진을 붙여 서비스하는 예시다.
    • Google photo 처럼 이미지 내에서 글자를 뽑고 검색에 활용할 수 있다.

    Untitled

    • 이미지에 있는 글자는 텍스트가 아니고 이미지이기 때문에 검색이 안된다.
    • 그러나 OCR 을 돌려놓으면 검색할 때 그 글자를 보고 검색하게 되니까 이미지가 검색이 된다.
    • 텍스트로 검색하면, 해당 텍스트가 들어있는 이미지도 같이 검색될 수 있음.
    • 이미지를 OCR 을 통해서 글자를 얻어놓고, 검색엔진이 그것을 보고 검색 결과로 띄워내줄 수 있다. 그렇게 되면 검색의 품질을 올릴 수 있다.
    • 또한 플레이리스트를 캡쳐하고 그 이미지를 업로드 하면 OCR 을 돌려서 그 플레이리스트에 있는 가수명, 노래명을 얻을 수 있다. 그리고 DB 에 매칭해서 플레이리스트를 옮길 수도 있다.
    • 블로그 등 광고성 / 혐오성 이미지 제거에도 OCR 이 사용될 수 있다. 이미지 → OCR → 금칙어 처리의 순서로 적용되는 것이다.
    • 번역 → 외국어 입력 대체, 이미지 위에 번역 결과 표시 등에도 응용될 수 있다.
  3. Key-value Extractor
    • 상업적으로 가장 많이 쓰이는 서비스다.
    • Parser 엔진을 학습 시켜서 OCR 하면 서비스에 사용될 key-value 를 얻어낼 수 있다.
    • KYC(know your customer) → 신분증 정보의 유효성(OCR), 동일 인물(얼굴 인식), 미션 수행(liveness. 살아있는 사람이 하고 있는지 행동 인식 알고리즘)
    • 수기 입력 대체 (명함에서 원하는 정보 추출, 영수증)

정리

  • OCR 에 필요한 모듈은 글자의 위치를 감지하는 text detector, 해당 위치의 글자를 읽어주는 text recognizer, 이렇게 읽은 글자들을 사람이 읽는 순서대로 정렬해주는 serializer 로 구성된다.
  • 그리고 글자들 중에서 유의미한 정보만을 추출해주는 text parser 를 뒤에 많이 붙인다.
  • 엄밀히 얘기하면 OCR을 수행하기 위한 모듈은 글자 영역을 찾기 위한 detector, 영역 내 글자를 인식하기 위한 recognizer 2가지이다. Serializer는 OCR 결과값을 자연어 처리하기 편하게 일렬로 정렬하는 모듈이다.
  • Text detector 는 이미지 전체를 입력으로 받아 글자 영역 위치를 출력한다. 글자 영역이냐 아니냐의 단일 클래스 문제로, 글자에 대한 클래스 정보 없이 글자 영역에 해당하는 객체 위치만을 추정한다.
  • Text recognizer 는 이미지 전체가 아니라 하나의 글자 영역에 해당하는 이미지의 일부를 입력으로 받아 해당 글자를 출력한다. 즉 Text recognizer 는 computer vision 과 natural language processing 의 교집합 영역에 있다.
맨 위로 이동 ↑

Tag :

Category :

Last Modified :

댓글 남기기