Skip to content

philgineer/Math_OCR

 
 

Repository files navigation

부스트캠프 AI Tech - Team Project 수식 인식기

Task Date Team
수식 이미지를 latex 포맷의 텍스트로 변환하는 문제 2021.05.24 ~ 2021.06.15 5조 ConnectNet

P stage 4 대회 진행 과정과 결과를 기록한 Team Git repo 입니다. 대회 특성상 수정 혹은 삭제된 부분이 존재 합니다


✔️ OCR Task

  • Rank : 7
  • LB: 0.5639

📋 Table of content

Team 소개
Gound Rule
실험노트
설치 및 실행
ocRec 수식 인식 윈도우 프로그램

1.1 대회 전략
1.2 Model
1.3 Ensemble
1.4 실패한 부분


🌏Team - ConnectNet

  • 김현우 Github Badge
  • 배철환 Github Badge
  • 서준배 Github Badge Blog Badge
  • 윤준호 Github Badge Blog Badge
  • 임기홍 Github Badge
  • 조호성 Github Badge

Ground rule

  1. 공유 코드 작성 시

    • 작성자 표시
    • 함수 단위 작성
    • merge 시 .py 형식 사용
  2. 모델 로그 기록

    • Wandb 사용
  3. 회의 기록 작성

  4. 자료 공유 및 연락 - Slack

  5. Code review

    • Git에 code review 요청,
    • Peer session 활용
  6. 결과 제출 시

    • 실험 내용 결과 공유 및 기록

설치 및 실행

  • 소스 다운로드
git clone https://github.com/bcaitech1/p4-fr-connectnet.git
  • 설치
pip install -r requirements.txt
  • 학습

  • SATRN(LB:0.7888)

    python ./train.py --c config/SATRN.yaml
  • Aster(LB:0.7917)

    python ./train.py --c config/Attention.yaml
  • 평가

python ./inference.py --checkpoint aster.pth

🔍수식인식

1. 대회 전략

1.1 Task 분석과 접근법 도출

  • 유사한 task인 Scene Text Recognition을 참조하여 SOTA 논문 분석 및 리뷰
  • 동일한 task인 논문을 참고해 베이스라인 아키텍처 수정 방향 논의

1.2 다양한 실험을 통해 성능 향상 시도

  • 하이퍼파라미터 튜닝

    • SATRN의 hidden dimension, filter dimension증가
      • 0.01의 성능 향상
  • 모델 앙상블

  • Penalty 추가

    • \frac{1}} 처럼 괄호가 맞지 않지 않는 경우가 발생

    • 그러나, 이미 토큰단위에서 loss를 계산하기 때문에 2차적으로 stack을 이용해 1 - (짝이 맞는 괄호 쌍 / 전체 괄호 쌍)을 더해줌으로서 일종의 penalty 부여

      $Loss = 0.8CE + 0.2 ParenPenalty$

  • 데이터셋 추가

    • Aida Dataset을 추가적으로 학습(100000+100000)
    • 더 데이터를 추가하려했으나 서버용량 때문에 추가못함 10만개 == 약 12GB
    • 학습 시간이 오래 걸림
  • Data Augmentation

    • Image Binarization

      데이터의 noise가 매우 심하여 최대한 숫자와 배경만 남기는 Adaptive Threshold를 통해 노이즈를 감소

      _2021-06-16_18 12 31

      Original

      Untitled

      Binarization

    • Random Rotation / Affine(Shear)

      다양한 각도에서 촬영된 다양한 필체로 쓰인 손글씨 데이터를 잘 아우르는 분포를 학습할 수 있도록 다양한 변환을 적용

      _2021-06-16_18 12 43

      Rotation

      _2021-06-16_18 12 51

      Shear

    • ColorJitter (Bright / Contrast)

      _2021-06-16_18 13 00

      Random Brightness

      _2021-06-16_18 13 07

      Random Contrast

  • Outlier Correction

    Untitled 1

    • 가로/세로 가 0.75 보다 작은 경우 이미지의 내부의 글자가 세로로 출력되어 있음

    Untitled 2

    • 데이터의 종횡비 (가로 / 세로)가 0.75이하인 경우, 즉 세로가 지나치게 긴 이미지들은 일괄적으로 시계방향 90도 회전 → 0.051 상승
      • ex) 종횡비가 0.75 이상, 0.8이하인 데이터

        Untitled 3

  • Vertical Image는 못맞추는걸로...

    Untitled 4

  • Model

    Paperswithcode 사이트를 참고해 Scene Text Recognition의 SOTA 모델들을 선택해 테스트 진행

    • ScreenShot

      Untitled 5

2. Model

1) SATRN

  • DenseNet / Transformer (encoder + decoder)
    • LB: 0.7888
    • optimizer : Adam (learning_rate = 5e-4)
    • loss: CrossEntropyLoss
    • hyperparameters : batch : 16, epochs : 50
    • image_size: (128, 256)
    • 추가로 시도한 것
      • Dense layer depth 증가
      • 다양한 Augmentation 적용
      • positionalencoding2D 을 adaptive2DpositionEncoder로 개선
      • hidden dimension, filter dimension 증가

2) Aster

  • CNN / Bi-LSTM / LSTM
    • LB : 0.7917
    • loss : CrossEntropy
    • optimizer : Adam (learning_rate = 5e-4)
    • hyperparameters : batch : 32, epochs : 50
    • image_size: (80, 320)
    • 추가로 시도한 것
      • Deformable conv layer

        주어진 데이터셋에는 기울어진 수식들이 많이 들어있었음.

        기존의 논문에서는 STN을 통과하여 이미지를 정렬시킴 → 연산량이 많다

        마지막 3 block에서 conv layer를 Deformable conv layer로 바꾸어 성능 향상을 봄.

3) CSTR

  • Naive CNN / CBAM & SADM / Multiple Linear
    • LB : None
    • Valid Acc : 0.28 ~ 0.31
    • optimizer : AdaDelta (learning_rate = 0.0 ~ 1.0 CosineAnnealingWarmUp)
    • loss : LabelSmooth (ratio = 0.1)
    • hyperparameter : batch 100, epochs : 50
    • image_size : (48, 192)
    • 추가로 시도한 것
      • 실험초반 오버피팅 이슈 발생 → dropout(p = 0.1), weight_decay (1e-3) 설정
      • 이후 오버피팅은 일어나지 않았으나 성능 이슈 발생
      • CNN Layer의 dim을 2배씩 늘려 전체적 파라미터를 2배로 size up → 실패

3. Ensemble

  • 서로 다른 방향성을 가진 transformer기반의 Satrn과 attention기반 모델을 앙상블
    • SATRN, Attention
  • 멀티스케일 러닝의 효과를 보기위하 각 모델마다 다른 크기의 이미지입력을 사용
  • 서로 다른 seed를 이용하여 서로 다른 train셋으로 학습하는 효과를 이용
  • 앙상블1 : SATRN(128,384), SATRN(128,256), Aster(80, 320)
    • 싱글 모델 보다 성능이 떨어짐 (LB : 0.74)
    • 128, 128 이미지로 동일하게 inference 하여 성능이 떨어졌음
    • 앙상블1 의 문제점을 보완하기 위해 앙상블 2를 시도
  • 앙상블2 : SATRN(128,384), SATRN(128,256), Aster(80, 320) (TTA적용)
    • 입력 이미지를 학습시 입력한 이미지 크기에 맞게 inference
    • 메모리 폭파 → with torch.no_grad() 넣지 않아 발생한 문제
  • 앙상블3 : SATRN (128, 256) + Aster(80, 320)
    • 서버 문제 때문에 LB 점수를 알 수 없음

4. 잘되지 않았던 것

  • 앙상블
    • 제출방식에 있어 기존방식과 달라 예외를 완벽히 잡지 못함
    • 앙상블 1은 모델의 성능이 하락
    • 앙상블2와 앙상블3은 부스트캠프의 서버의 용량문제로 성능 측정 불가
  • 새로운 모델 구현
    • SRN, CSTR 구현 시도
    • Efficientnetv2 FPN Backbone 구현 시도
    • 기존 Attention 베이스라인에서 GRU 에러 fix 후 구현 → LSTM과 큰 차이 없음
  • Beam search
    • RNN, LSTM에 있어 각각 token 단위에서 예측하는 걸 보완해 top k개의 후보를 고려하는 알고리즘인데, 모든 word가 한 번에 입력되고 예측하는 transformer의 경우 성능 향상에 도움이 될지 미지수임
    • 같은 이유로 RNN, LSTM에서와 달리 transformer에서는 token 선택 시 사전 확률 - 사후 확률이 달라지기 때문에 구현 난이도가 상당하고, 한다고 하더라도 연산량이 큰 폭으로 증가함
  • 시각화
    • attention map을 시각화 하려했지만 못함
  • 데이터셋 추가
    • Aida dataset을 추가하여 하였으나 점수가 별로 안올라서 포기
    • Im2Latex를 추가하려고 하였으나 서버용량이 부족하여 추가하지 못함

Reference

Paper

GIt

Site & Kaggle

About

Math expression Image2Latex project

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 100.0%