CRAFT — 네이버의 글자 찾는 AI

CRAFT Network Architecture 분석

강준영
8 min readFeb 10, 2020

CRAFT(Character Region Awareness for Text Detection; PAPER)는 NAVER의 Clova AI 연구팀에서 2019년에 발표한 Scene Text Detection 관련 눈문이다.

감사하게도, CRAFT 연구팀은 논문과 함께 실험 모델의 소스코드 및 사전학습된 네트워크 가중치를 Github로 공유하고 있다.

아쉽지만, Training 과정에 대한 소스코드는 Official Github에는 포함되어 있지 않다. (Training code는 guruL님의 github를 참고하자.)

https://demo.ocr.clova.ai/

제안하는 모델의 특성상 이미지 내 텍스트 영역 검출이 매우 유연하고 견고한 편이다.

CRAFT는 이미지에서 텍스트 영역을 검출하기 위해 다음과 같은 구성의 Segmentation-based 네트워크 구조로 설계되었다.

  • Batch-Norm이 포함된 VGG-16 모델을 네트워크의 기본 뼈대로 구성
  • U-Net처럼 얕은 레이어의 특징 맵을 깊은 레이어의 특징 맵과 결합하는 방식을 통해 Segmentation 정확성을 높임.

다음은 논문에 명시된 CRAFT Network 구조이다:

논문에서는 모델의 네트워크 구조에 대해선 비교적 가볍게 다루고 있다. 따라서 구조의 완전한 파악을 위해서는 소스코드를 들여다 볼 필요가 있다.

그런데 막상 공개된 소스코드를 분석하다보니 논문 상의 네트워크 구조와 소스코드 사이에 차이가 존재한다는 것을 발견했다.

CRAFT-pytorch/craft.py

논문에 명시된 네트워크 구조와 같이 CRAFT 코드에서도 VGG16-BN을 기본 틀로 사용한다.

우선 네트워크의 뼈대를 이루는 VGG16-BN에 대해 살펴보자.

Karen Simonyan, et al., VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION

Pytorch에서는 VGG를 기본 모듈로 포함하고 있으며 위의 구성에서 A, B, D, E에 해당하는 네트워크 및 각각에 Batch-Norm이 포함된 버전의 네트워크를 선택할 수 있다.

  • A: 11-layers [Batch-Norm]
  • B: 13-layers [Batch-Norm]
  • D: 16-layers [Batch-Norm]
  • E: 19-layers [Batch-Norm]

Pytorch에서 제공하는 VGG16-BN의 구성은 다음과 같이 도식화 할 수 있다:

VGG는 크게 Feature Extractor 부분과 Classifier 부분으로 나눌 수 있다.
VGG-16 with Batch-Normalization

CRAFT는 VGG16-BN의 Feature Extractor 부분을 변형하여 사용한다.

torchvision.models.vgg.vgg16_bn().features는 Feature Extractor 네트워크 부분에 해당한다.
VGG16-BN의 Feature Extractor 부분을 4 구간으로 나누어 사용한다.

여기서 [0:12], [12:19], [19:29], [29:39]는 VGG16-BN 의 Feature Extractor를 구성하는 모듈들의 부분집합으로 CNN, Batch_Norm, ReLU, MaxPooling들이 포함된다.

print(VGG16-BN Feature Extractor)
기존 VGG16-BN의 Feature Extractor 부분은 총 43개의 모듈로 구성되어 있다.

CRAFT는 VGG16-BN의 Feature Extractor 구성 중 앞의 39(0~38)개 모듈 뒤에 3개의 모듈(MaxPooling-Conv-Conv)를 붙인 변형을 뼈대로 사용한다.

slice5 부분에서 입력과 출력의 크기 변화가 없다는 점에 주목하자.
CRAFT’s Backbone

마지막에 이어붙인 MaxPooling-Dilated Conv-1x1Conv는 입력의 크기를 줄이지 않으면서 채널 수만 늘리고 있다. 또한 비선형 함수(ReLU)를 사용하지 않는다.

이미지 참조: https://towardsdatascience.com/review-dilated-convolution-semantic-segmentation-9d5a5bd768f5

이로써 앞에서 봤던 CRAFT basenet이 결정된다.

basenet에는 5개의 slice가 존재한다는 것을 기억하자. 각 부분의 출력은 Feature Extractor의 깊이 별 특징 맵에 해당한다.

해상도 및 추상화 정도가 서로 다른 특징 맵들 U-Net과 같이 결합하기 위해 CRAFT의 forward 부분은 다음과 같이 구현되어 있다.

이 때, UpConv는 Conv-BatchNorm-ReLu-Conv-BatchNorm-ReLU로 구성된다.

주목할 부분은 Up-Conv의 입력 채널 수와 출력 채널 수이다.

첫 번째 Conv2d의 입력 채널의 수는 파라미터로 전달받은 in_ch과 mid_ch의 합이다. 출력 채널은 out_ch이다.

따라서, UpConv는 (in_ch+mid_ch) 채널 수를 out_ch 채널 수로 바꾼다.

즉, upconv1를 거치면 특징맵의 (1024+512)채널은 256채널로 줄어든다.

실제 구현에서 Up-Conv 부분의 채널 수를 보면, 논문에 명시된 네트워크 구조 그림과는 차이가 있다.

Down Conv의 마지막 출력 채널 수는 1024

마지막으로 Feature Extractor의 특징 맵으로부터 Region score와 Affinity score의 Dense map을 추출하기 위한 Output Layer를 살펴보자.

그림에서는 마지막 출력층의 Conv[1x1x2] 레이어가 갈라지는 화살표로만 표시되어 있다.

공개된 소스코드를 기반으로 논문의 네트워크 구조 그림을 다음과 같이 재구성 할 수 있다.

각 Down-Conv Stage의 출력 이미지 사이즈도 논문과 차이가 있다.

--

--