부스트 캠프 ai tech 13~14주 OCR - 1


OCR

  • Text라는 단일 Class에 대하여 예측을 하는 Task
  • 위치를 검출하는 Text Detection과 내용을 인식하는 Text Recognization으로 나뉠 수 있다

일반적인 Object Detection Task와의 차이

Text Image Data의 특성상 일반적인 Object Detection과는 아래과 같은 차이를 가진다

  • Object의 높은 밀도
    • Data 특성 상 연속적인 Line에 여러가지 word가 존재하고 그 line이 붙어서 반복하기 때문에 일반적인 Object Detection에 비해 매우 높은 밀도를 가진다
  • 극단적인 Ratio
    • 언어에 따라서 띄어쓰기가 아에 존재하지 않거나 긴 단어들이 존재하기 때문에 Ratio가 극단적이다
  • 특이한 모양
    • 구겨짐
      • 글자들이 종이같은 평면에 존재하는 경우가 많고, 휘어지거나 구겨지는 경우도 다수 존재하기 때문에 object의 영역도 구겨지면서 특이한 모양을 가진다
    • 휘어짐
      • 간판등 디자인적 부분으로 인하여 휘어진 영역을 가지는 경우도 존재한다
    • 세로 쓰기
  • 객체의 특징
    • 같은 글자라도 큰 크기편차가 존재할 가능성이 높음
    • 객체 영역이 모호함

OCR 모델은 위의 특징들을 고려하여 만들어 져야 한다

OCR Model

Base Model

OCR 모델은 크게 2가지 방법으로 글자 영역을 예측한다

  1. Regression-based
    • 이미지를 입력받아서 글자영역 표현값을 출력하는 단순한 방식
    • 사각형으로 출력하기 때문에 불필요한 영역을 포함하고, 정확도가 떨어지는 한계가 존재
    • Anchor Box의 범위를 벗어나는 영역에 경우 측정 정확도가 떨어진다
      • 글자 객체가 가지는 극단적인 Ratio를 제대로 반영하지 못하는 경우가 많음
  2. Segmentation-based
    • 이미지를 입력받아서 화소단위로 정보를 뽑고 후처리를 통하여 글자 영역의 표현값을 확보
    • Post-processing과 후처리가 필요하기 때문에 Regression-based에 비하여 연산량이 많다
    • 서로 간섭이 있거나 인접한 개체간의 구분이 어렵다
  3. Hybrid 방식
    • 위의 두가지 방법을 혼합하여 예측하는 방식
    • Regression을 통하여 대략적인 영역을 탐색하고, Segmentation-based로 화소정보를 추출하여 세부적인 영역을 결정하는 방식을 취한다
    • MaskTextSpotter

Task Based

  1. Character-Based
    • Charater 단위로 검출
  2. Word-Based
    • Word 단위로 검출

reference

Week13 - Day 4 Review


오늘 한 일

  • batchsize에 따른 모델 성능변화 실험
    • Batch normalize가 존재해서 batchsize에 영향을 받을 것이라고 생각
    • 실제로 좋은 결과는 나오지 않았다
  • 알고리즘 1문제 풀기

2. 피어세션에서 한 것

  • Augmentation 선택에 관하여 팀원들과 회의

3. 하루 느낀점

  • 이번에는 신박한 결과를 찾으면 좋겠다

4. 앞으로 해야 하는 일

  • 삶의지도 작성
  • 이력서 초안 완성하기!! (5월 1일 전까지)
  • 카카오 인턴 대비 코테 공부 다시 시작하기
  • 해야하는일 우선순위를 정해서 정리해보기

Week13 - Day 1~3 Review


1~3일 동안 한 일

  • 대회 준비
  • WarmUpMultiScale lr Scheduler 코드 작성
  • 공개데이터셋 수집
  • East 모델 개요 학습
  • 라벨링 70장정도 한 것 같음

2. 피어세션에서 한 것

  • 내일 대회 준비를 위한 사전 회의

3. 하루 느낀점

  • 이번에도 Data Centric 하게 한번 놀아보자
  • 다양한 방식을 시도해 보고싶다.

4. 앞으로 해야 하는 일

  • 삶의지도 작성
  • 이력서 초안 완성하기!! (5월 1일 전까지)
  • 카카오 인턴 대비 코테 공부 다시 시작하기
  • 해야하는일 우선순위를 정해서 정리해보기

Week12 - Day 4 Review


오늘 한 일

  • 대회 마무리
  • github 코드 정리
  • 작업한 내용 정리 및 글 작성

2. 피어세션에서 한 것

  • 마지막 제출을 앞두고 정리

3. 하루 느낀점

  • 아쉽게 4등으로 끝났다
  • 다음 대회에서는 더 좋은 성적을 거두고 싶다
  • 적당히 작은 모델로 학습을 진행했지만 그래도 시간이 많이 걸렸기 때문에 완전히 작은모델 + image size를 줄여서 빠른 학습을 시키고 학습시간을 줄이는 전략으로 수정할 생각이다

Week12 - Day 3 Review


오늘 한 일

  • Efficient Det mmdetection에 넣어서 실행
  • Bifpn 버그 수정

2. 피어세션에서 한 것

  • Efficient Det TTA에 대해서 조원들과 이야기
  • 사이즈가 고정된 모델이기 때문에 Multi scale이 불가능하다

3. 하루 느낀점

  • 컨디션이 나가버려서 몸상태가 상당히 좋지 않은 하루였다
  • 내일은 마저 p-stage에 대해서 정리를 해야겠다

Week12 - Day 1~2 Review


오늘 한 일

  • YoloV5모델에서 다양한 이미지 사이즈와 배치사이즈로 학습 실험
  • 추가로 학습시킨 Yolo를 통해서 Weight Box Fusion 실험
  • Swin Transformer 논문과 mmdetection 내의 구현 코드를 공부 및 확인

2. 피어세션에서 한 것

  • 각자 진행한 실험에 대해서 결과 보고
  • Swin Transformer 구현 코드에 대해서 토론
  • Efficient Det 학습을 진행하면서 발생했던 Error를 공유하고 해결했다

3. 하루 느낀점

  • P-stage를 진행하면서 스코어에 매우 많이 신경쓰고 있다는것을 발견하고 신경안쓰려고 최대한 노력한 하루였다

4. 오늘의 팁

  • DropPath를 통하여 skip Connection을 진행하는 Layer에서 일부 레이어 자체를 스킵하고 넘어가도록 구현 할 수 있다.
    • Timm 모듈로 구현이 되어있다!

Week11 - Day 5 Review


오늘 한 일

  • OpenCV를 이용한 Background mask 생성 및 이미지 변환
  • 위의 Backgrond Sample을 이용하여 oversampling
  • 학습시킨 데이터로 추가적인 앙상블을 시도하여 0.7118 스코어 달성!
    • 1등이지만 새로운 시도는 계속된다

2. 피어세션에서 한 것

  • 각자 진행한 실험에 대해서 결과 보고
  • 다들 마음에 여유가 생겨서 최종 프로젝트를 위해 전 기수의 프로젝트 탐방

3. 하루 느낀점

  • DeepLearning 못지않게 Huristic한 알고리즘에 대한 공부또한 많이 필요하다고 느낀 하루였다
    • Opencv 강의 사두었었는데 이거 보면서 공부좀 더 해야겠다
    • Mask 다루는 마스터가 되기 위하여

4. 오늘의 팁

  • cv2.copyto와 image, mask, 합칠 이미지만 있다면 얼마든지 합성할 수 있다

Week11 - Day 1~4 Review


1~4 일간 한 일

  • 단일 모델의 최적화를 위한 여러가지 실험
    • scheduler
    • Data augmentation
    • anchor ratio에 관한 실험
      • scale에 변화를 주었을 때는 score의 상승은 없었고 오히려 하락하는 모습을 볼 수 있었다
      • 모델 자체에서 생성하는 총 anchor 개수는 2000개의 상한이 존재하는데 scale을 늘렸을 경우에 생성되는 anchor의 개수는 배로 늘어나고, 작은 박스에 대해서 어느정도 박스 생성을 하지만, 기본적으로 데이터 자체에 small object의 비율이 매우 적고, 그만큼 줄어든 큰 object를 추측하지 못하게 되어서 감소하는것으로 추측한다
  • ensemble에 관한 실험
    • nms -> score 상승
    • soft nms -> score 하락
    • soft nms는 겹치는 box를 삭제하지않고 confident를 낮추어서 뽑아내는데 여기서 생성된 어중간한 score의 box들이 weight box Fusion을 거치면서 점수를 하락시키는 원인이 되는것으로 추정된다
  • tile ensemble에 관한 실험
    • 작은 object에 박스를 생성한다
    • 기본적으로 생성되는 박스의 양이 매우 많아졌다
    • tile끼리 겹치는 경계에 생성되는 bbox에 대한 처리가 매우 힘들고, 이 생성된 bbox로 인하여 합치기 전보다 score가 떨어지는 현상이 발생한다

2. 피어세션에서 한 것

  • 팀원들과 실험 설계

3. 멘토링 시간에 한 것

  • Yolo를 사용한 실시간 웹캠 Detection Model 미니 프로젝트 마무리
  • 대회에 관한 질문

4. 하루 느낀점

  • 대회를 진행하면서 정신없이 보내다보니 어느세 스코어에 집중하고있는 나 자신을 발견했다. 공부하는 느낌으로 해야하는데 너무 집착하는 느낌이 들어서 남은 일주일은 새로운 시도를 해보려고 한다

Week10 - Day 3~4 Review


3~4 일간 한 일

  • mmdetection을 이용한 loss 실험
    • CIoU
    • DIoU
    • GIoU
  • anchor 변경을 통한 실험

2. 피어세션에서 한 것

  • 데이터 클랜징
    • 4883장의 데이터를 직접 눈으로 보고 맞는지 비고
    • 역할분담을 통해서 인당 약 1000장의 이미지를 살펴 보았다
    • 약 10%의 갯수의 수정점이 제안 되었고 이를 이용하여 4개정도의 dataset을 제작할 예정이다
  • Base 모델의 학습시간이 너무 오래걸려 일단 더 작은 small 모델로 먼저 실험을 진행하여 성능이 좋았던 모델만 적용하기로 결정

3. 하루 느낀점

  • 가장 힘들지만 성능이 좋을거라 예상되는 data cleansing을 팀원들과 어느정도 완료했다
  • 이제 약 500항목의 라벨 수정만 가하면 끝난다! 행복!

4. 미세 꿀팁

  • mmdetection config 파일에 다음과 같이 넣으면 class mAP를 epoch마다 출력해준다
    1
    evaluation = dict(classwise=True)

Week10 - Day 1~2 Review


1~2 일간 한 일

  • 강의 후딱 듣기
  • mmdetection Base Config file 만들기
    • Swin Transformer
    • Cascade RCNN
  • Multilabel StratifiedKFold을 통한 Cross Validation 데이터 제작
  • github Template 만들기
    • PR Template Error 발생 - 아직 원인 모름

2. 피어세션에서 한 것

  • mmdetection에 대한 설명

3. 멘토링 시간에 한 것

  • CUDA에 대한 이야기
    • nvcc
    • gcc
    • cuda toolkit
  • Yolo를 사용한 실시간 웹캠 Detection Model 미니 프로젝트

4. 하루 느낀점

  • 하루종일 P-stage 관련해서 코드를 제작하고 Github에 올리고 정신없이 보냈다
  • 깔끔한 github를 보니 기분이 좋아진다

5. 미세 꿀팁

  • mlflow를 외부 호스팅을 해서 사용할 경우 다음과같이 설정하면 된다
    1
    mlflow ui --host 0.0.0.0 --port [PORT NUMBER]