DeepLearning/Computer Vision

[CV] OCR - 글자 영역 검출

yooj_lee 2021. 11. 9. 23:56
300x250

upstage 이활석님의 부스트캠프 AI Tech OCR 강의를 듣고 정리한 글입니다.


1109

OCR

  • 글자 객체

    • 고밀도
    • 위치 잡는 것 only (classification은 필요가 X → objectness만 잡는다고 생각하면 쉬움)
  • 글자 영역 표현법

    • 직사각형 (RECT)

      : (x1, y1, width, height) or (x1, y1, x2, y2)

    • 직사각형+각도 (RBOX, Rotated Box)

      : (x1, y1, width, height, $\theta$) or (x1, y1, x2, y2, $\theta$)

    • 사각형 (일반 사각형; QUAD, Quadrilateral)

      : (x1, y1, ..., x4, y4)

      →첫 글자의 좌상단이 (x1, y1) 그 후 시계방향으로

    • 다각형 (polygon)

      : 일반적으로 2N개의 점을 이용하고, 상하 점들이 쌍을 이루도록 배치 (위의 두 점과 쌍이 되는 아래의 두 점을 잡으면 특정 글자 영역이 되도록)

Taxonomy

  • SW 1.0 vs SW 2.0

    SW 2.0, 즉 딥러닝 기반 솔루션에서는 ICDAR11, ICDAR13 데이터셋의 경우 0.93, 0.952로 sw 1.0 방식으로 개발된 솔루션에서 각각 17%, 13% 향상시킬 수 있었음.

  • Regression-based vs Segmentation-based

    1. Regression

      • 이미지를 입력 받아 글자 영역 표현값들을 바로 출력으로
      • TextBoxes '18
        → ssd를 ocr에 맞게 바꿈. 글자에 맞게 앵커 박스 종횡비 수정. 앵커와 gt box 간의 차이점을 추정하는 방식으로 글자박스 위치 추정.
      • 한계
        • regression base 같은 경우에는 불필요한 영역을 포함함 (bounding box 표현 방식의 한계) → arbitrary-shaped text에 유연하게 대응하기가 어려움.
        • Extreme aspect ratio → Bounding box 정확도 하락 (Receptive Field의 한계, 즉 기존의 anchor box에서 사전에 정의한 종횡비와 매우 동떨어진 극단적인 종횡비의 텍스트가 나타날 경우에는 detection 성능이 매우 떨어질 것)
    2. Segmentation (Instance Segmentation)

      • 화소 단위로 글자인지 아닌지 판단하고, 후처리를 통해서 최종 글자 영역 표현 값들을 출력

      • PixelLink '18

        전체 모델은 두 가지 별도의 header를 갖고 있는데, 하나는 text/non-text prediction을 위한 것이고, 하나는 link prediction(3x3 픽셀 영역이 있다고 가정했을 때 가운데 픽셀을 제외한 8개의 이웃 픽셀이 가운데 픽셀과 같은 instance, 즉 같은 글자 영역 내에 있는지)을 위한 것. 전자의 경우 2개의 채널을 갖게되고 후자의 경우 8개의 채널을 갖게 됨. (Softmax 연산을 통해 최종 prediction을 수행)

        1) 각 화소 별로 글자 영역에 속할 확률 (text/non-text prediction)

        2) 인접한 8개 화소가 글자 영역에 속하는지 판단 (link prediction)

        3) 후처리 작업

        • 이진화

          : 확률에서 라벨 생성

        • CCA (Connected-component labeling; Connected-component Analysis)
          : 약간 알고리즘 문제 중에서 동서남북 방향으로 이동해서 섬 개수 찾기와 비슷(대신 동서남북의 경우에는 adjacent의 정의를 4개로 정의하는 거고 여기서는 8개로 정의하는 거고)

          서로 연결된 지점을 찾으면서 몇 개의 instance가 있는지를 확인하는 작업 (즉, CCA를 통해서 별도의 RoI prediction을 하지 않으면서 instance segmentation을 하게 되는 거)

        • RBOX 정합

          : 검출된 영역에서 Box를 그려주는 연산 (or Box의 좌표값을 계산)

      • 한계

        • 복잡하고 시간이 오래 걸리는 post-processing이 필요할 수 있음
        • 서로 간섭이 있거나 인접한 개체 간의 구분이 어려움 (원래의 별도의 영역인데 매우 인접해있기 때문에 같은 영역으로 판단할 가능성이 높다)
    3. Hybrid

      • MaskTextSpotter '18
        • Regression-based로 대략의 사각영역 + segmentation-based로 해당 영역에서 화소 정보 추출
  • Character-based vs Word-based

    1. Character-based methods
      • 글자 단위로 검출하고 이를 조합해서 word instance를 예측, 이렇게 할 경우 라벨링 비용이 커진다는 단점이 발생.
      • CRAFT '19
        • character region과 affinity(연결성; 글자 간에 연결이 되어 있는지)을 예측 → Word로 조합
        • 글자별 위치에 대한 라벨링이 필요하다는 한계점을 Weakly-Supervised Learning (단어 단위 라벨링 → 글자 단위 라벨링 추정) 을 통해 해결하고자 함.
    2. Word-Based Methods
      • 단어 단위로 예측, 대부분의 모델이 여기에 속함

Baseline Model - EAST

  • EAST: An Efficient and Accurate Scene Text Detector. (CVPR, 2017)

    • SW 2.0 방식으로 개발되어 제대로 성과를 낸 첫 연구.

    • Idea

      네트워크가 2가지 정보를 pixel-wise로 출력

      1. 글자 영역 "중심"에 해당하는지: score map
      2. 어떤 화소가 글자 영역이라면 해당 bounding box의 위치는 어디인지: geometry map
    • Architecture

      3가지 부분으로 구성

      1. Feature extractor stem (backbone)

        PVANet(고속처리 가능), VGGNet, ResNet50

      2. Feature Merging branch

        feature map의 크기를 키워 가며 여러 레벨의 특징들을 merge하는 브랜치

        unpool로 크기 맞추고 concat, 1x1 3x3 convolution으로 channel 수 조절

      3. Output: H/4 x W/4 x C maps

    • Scrore map: 글자 영역 중심에 해당하는지

      H/4 x W/4 x 1 binary map - 글자 영역의 중심이면 1, 배경이면 0

      GT bounding box를 줄여서 생성 (글자 높이의 30%만큼 end points를 안쪽으로 이동)

    • geometry map (RBOX): 어떤 화소가 글자 영역이라면 해당 bounding box의 위치는 어디인지 (직사각형에 대한 정보와 각도 값에 대한 정보가 필요하므로 총 4+1 채널이 필요함)

      직사각형에 대한 정보는 ch1) 직사각형 좌변까지의 거리 값, 2) 우변까지의 거리 값, 3) 상변까지의 거리 값, 4) 하변까지의 거리 값

      • then, QUAD 형식은?

        bounding box의 4개 점까지의 offset을 예측 → 8 channels (각각 x, y 변화량을 담아야 하므로)

    • Post-processing: RBOX 기준

      1. Score Map 이진화

      2. 사각형 좌표값 복원

        1. 회전된 좌표값을 구함. (새로운 좌표축을 설정함 → 이후 복원이 쉽도록 설정)
        2. d-p 간의 변환행렬 계산
        3. 역변환을 좌표값들에 적용해서 원 이미지에서의 좌표값을 찾음.
      3. NMS (Locality-Aware NMS)

        • b-box 개수를 줄이려고 NMS

        • 근데 b-box 너무 많으면 NMS 연산량 급증

        • 따라서 제안한 것이 locality-aware nms

          인접한 픽셀에서 예측한 b-box들은 같은 text instance일 가능성이 높으므로, 위치 순서로 탐색하면서 비슷한 것들을 하나로 통합하자. (IoU 기반)

          통합 시 score map 값으로 weighted merge

    • Loss

      $$L = L_s + {\lambda}_g L_g, \ {\lambda}_g = 1$$

      $L_s$: Loss for Score Map

      $L_g$: Loss for Geometric Map

      • $L_s$: Score map loss (class-balanced CE)
      • $L_g$: Geometric Map loss (직사각형에 대한 loss, 각도값은 cosine loss → 각각 IoU loss와 cosine loss를 사용함)
    • evaluation metrics

      • F-score (정확도)
      • Speed (얼마나 빠르게 예측이 이루어지는가)
300x250