OCR Wrap up

신형환·2022년 4월 21일
0
post-thumbnail

📑 Summary


스마트폰으로 카드를 결제하거나, 카메라로 카드를 인식할 경우 자동으로 카드 번호가 입력되는 경우가 있습니다. 또 주차장에 들어가면 차량 번호가 자동으로 인식되는 경우도 흔히 있습니다. 이처럼 OCR (Optimal Character Recognition) 기술은 사람이 직접 쓰거나 이미지 속에 있는 문자를 얻은 다음 이를 컴퓨터가 인식할 수 있도록 하는 기술로, 컴퓨터 비전 분야에서 현재 널리 쓰이는 대표적인 기술 중 하나입니다.
(출처 : 위키피디아)
OCR task는 글자 검출 (text detection), 글자 인식 (text recognition), 정렬기 (Serializer) 등의 모듈로 이루어져 있습니다. 본 대회는 아래와 같은 특징과 제약 사항이 있습니다.

  • 본 대회에서는 '글자 검출' task 만을 해결하게 됩니다.
  • 예측 csv 파일 제출 (Evaluation) 방식이 아닌 model checkpoint 와 inference.py 를 제출하여 채점하는 방식입니다. (Inference) 상세 제출 방법은 AI Stages 가이드 문서를 참고해 주세요!
  • 대회 기간과 task 난이도를 고려하여 코드 작성에 제약사항이 있습니다. 상세 내용은 베이스라인 코드 탭 하단의 설명을 참고해주세요.
  • Input : 글자가 포함된 전체 이미지
  • Output : bbox 좌표가 포함된 UFO Format (상세 제출 포맷은 평가 방법 탭 및 강의 5강 참조)

Dataset

학습 데이터는 기본적으로 "ICDAR17_Korean"이라는 이름의 데이터셋이 제공됩니다. input/data/ICDAR17_Korean 의 경로에 위치하고 있으며 하위에는 UFO 형식의 annotation 파일인 ufo/train.json 과 이미지 파일들이 포함되어있는 images/ 폴더로 구성되어 있습니다.

ICDAR17_Korean 데이터셋은 ICDAR17-MLT 데이터셋에서 언어가 한글인 샘플들만 모아서 재구성한 것으로 원본 MLT 데이터셋의 부분집합입니다. 원본 데이터셋인 ICDAR17-MLT는 아래 사이트에서 제공받을 수 있으며, 여기서 언어에 대한 필터링을 적용해 새로운 데이터셋을 생성하는 스크립트는 convert_mlt.py라는 파일로 베이스 코드에 포함되어 있습니다.
https://rrc.cvc.uab.es/?ch=8

본 대회는 데이터를 수집하고 활용하는 방법이 주요 내용이기 때문에, 성능 향상을 위해 공공 데이터셋 혹은 직접 수집한 데이터셋을 추가적으로 이용하는 것을 제한하지 않습니다. 예를 들어 ICDAR17-MLT 원본 데이터셋은 총 9000개의 샘플(training 7200 + validation 1800)로 구성되어 있으며 ICDAR17_Korean은 이 중 536개의 샘플로만 구성된 부분 데이터셋입니다. 원본 데이터셋을 받고 convert_mlt.py의 필터링 조건을 변경해 새로운 데이터셋을 만들어 이용할 수도 있습니다. 또한 강의에서 제공되는 annotation tool을 이용해 직접 생성한 데이터를 함께 이용하는 것도 좋은 방법이 될 수 있습니다. (모델 및 기학습 가중치는 이미지넷으로 고정됩니다)

아래는 학습 데이터셋의 샘플 이미지입니다.

annotation file

inference.py의 결과로 생성되는 output.csv의 형식은 UFO로 작성되도록 해야합니다. (UFO에 대한 설명은 5강을 참조) 단, inference에서는 글자 영역에 대한 bounding box 정보 외의 다른 정보는 필요로 하지 않기 때문에 전체 UFO 형식 중 "points"에 해당하는 값들만 포함하고 있으면 됩니다.

베이스 코드로 제공되는 inference.py는 기본적으로 평가 데이터에 대한 output.csv를 출력하도록 작성되어있으며 아래 이미지는 결과물의 예시를 보여줍니다.

EDA

Attempts for Competition

Transformation_option

crop_size



OCR 데이터셋을 load 할 경우, 1에서 0.2 사이의 다양한 crop_size를 선택한 다음ComposedTransformation을 진행하여 모델을 일반화 시켰습니다.

partial_occurrence

crop 시에 발생할 수 있는 글자 잘림 현상을 막아주는 옵션이지만 해당 옵션을 비활성화 할 경우(글자가 잘리지 않음) crop 사이즈에 따른 변화가 거의 없어지는 의도하지 않은 결과를 발생시켜 오히려 모델의 일반화를 방해하는 결과를 가져온다.

 allow_partial_occurrence=False

일 경우 crop_size를 변경하였음에도 불구하고 다양한 augmentation이 발생하지 않는 것을 확인 할 수 있었다.

 allow_partial_occurrence=True

일 경우 crop_size에 따라 다양한 augmentation결과를 얻을 수 있어 모델이 더 일반화되었다.



General

Conclusion

Public

mAP score : 0.7354

Private

mAP score : 0.7109

Rank

1st (total 19 teams)

Retrospection

이번 P-stage는 평소 생각하지 않았던 데이터에 관한 대회입니다. 일반적으로 딥러닝 대회에서는 주워진 데이터를 기반으로 알맞은 모델을 튜닝하여 점수를 올리는것이 목표인 반면, 이번 대회에서는 모델은 손대지 않으면서 데이터에만 수정을 가해 점수를 끌어올리는것이 목표였습니다.
따라서 대회를 시작하자 마자 시작한것은 어느 데이터셋을 추가할 것인가 였습니다.

베이스라인에 사용한 ICDAR2017의 데이터셋과 이후 대회인 ICDAR2019의 데이터셋을 활용했습니다. 추가적으로 캠퍼분들이 라벨링한 데이터가 Private 데이터와 가장 유사한 가이드라인을 가지고 작성되었으리라 생각하여 다른 캠퍼분들이 직접 라벨링한 사용자 데이터셋 역시 추가했습니다.
대회를 진행하는 베이스라인 모델은 EAST(An Efficient and Accurate Scene Text Detector) 로써 텍스트 탐색에 자주 사용되는 모델을 사용했습니다.

기존에 사용하던 데이터에 17,000장 정도의 데이터를 추가하였고 그저 데이터만 추가하고 Transform만 추가하였을 뿐이었는데 상당한 성능 향상이 있다는것을 결과로써 알게 되었습니다.
평소 가지고 있었던 생각인 "좋은 결과를 가져오기 위해선 좋은 모델이 필요하다" 라는 고정관념을 없에버릴 수 있는 좋은 대회였다고 생각합니다.

이번 대회를 진행하면서 높은 점수를 기록하고 이에 대해 정리, 발표하면서 많은 것들을 배웠다고 생각합니다.

바로 이전에 진행하였던 쓰레기 분류 Detection 대회와 비교하여 개선된 부분은 많이 있지만 특히 Github에 있는 기능인 Project와 issue를 사용한 점을 높이 평가하고 싶습니다.
Gitflow를 사용하면서 프로젝트의 전체적인 모습을 개략적으로 파악할 수 있었고 Project의 issue 관리를 통해 대회를 진행하면서 어떤 문제가 발생하였고 이를 어떻게 해결하였는지, 어디에서 해결하였는지를 한눈에 파악 할 수 있어서 기존에 사용하던 Trello에 비하여 많이 간편해진 것을 확인할 수 있었습니다.

이번에 얻을수 있었던 경험을 정리하여 다음에 진행되는 segmentation 대회에 활용한다면 좋은 결과를 얻어낼 수 있으리라 생각합니다.

0개의 댓글