본문 바로가기
TIL _Today I Learned/2024.12

[DAY 108] 최종 프로젝트_ 모델 추가 학습

by gamdong2 2024. 12. 20.
[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 9기
학습일 : 2024.12.20

📕 프로젝트 작업 내역

  • OCR 모델 Fine Tuning 결과
  • 모델 추가 학습 계획

 

📗 수행 결과

1. OCR 모델 Fine Tuning 결과

1) 훈련/검증 결과 분석

(1) 두 가지 학습 방식 에 대한 결과 분석

학습 방식  (i) 원본 이미지를 리사이징하여 상대좌표 계산 (ii) 원본 이미지에서 상대좌표 계산 후,
텍스트 영역을 크롭하여 리사이징
예측 모델     team-lucid/trocr-small-korean
사용한 데이터      - AI HUB의 수학 과목 자동 풀이 데이터 (초등 3~6학년)
    - 데이터 수: 15,224개 (훈련:검증 = 8:2)
    - 입력 데이터(X): 이미지와 이미지 내 텍스트 영역 좌표 (bboxes)
    - 텍스트 라벨(Y): 해당 영역에서 추출된 텍스트
평가 지표     Validation Loss, Character Accuracy, Word Error Rate (WER)
하이퍼파라미터     - Epochs: 10
    - Batch Size: 1
    - Learning Rate 5e-5
결과 분석     - Epoch를 거듭할수록 한국어 문자를 일부 읽어냄
    - 숫자 · 수식 · 기호는 잘 읽어내지 못함
    - Epoch를 거듭할수록 한국어 문자 · 숫자 · 수식 · 기호를 잘 읽어냄
    - 문자 뿐만 아니라 문맥을 학습하는 경향을 보임
보완점 과적합에 취약함

    - 다른 종류의 라벨링 데이터에 대해, 동일한 한가지 문장을 예측할 때가 있음

    - 문장 앞머리를 모두 동일하게 '다음은', '길이가', '직사각형' 등으로 예측할 때가 있음
    - 평가 지표 확인이 필요 없음
문맥 의존성

    - 앞부분을 읽어내는건 잘하지만 문장 길이의 1/3 ~ 2/3 이후는 읽어내지 못하는 경우가 대부분
   - 문맥을 기반으로 텍스트를 예측하기 때문에, 한 문장을 여러 부분으로 나누어 저장하면 뒷부분의 텍스트를 예측하기 어려움

    - 평가 지표의 신뢰성이 떨어짐

 

(2) 학습 결과 요약

  • 원본 이미지를 리사이징하여 상대좌표 계산
    • 성능이 좋지 못함
      • TroCR 모델은 전체 이미지를 분석하여 텍스트를 추론하지만, 특정 텍스트 영역을 포커싱하거나 좌표를 기반으로 처리하는 기능이 내장되어 있지 않음
      • 즉, 주어진 이미지를 전체적으로 분석하여 텍스트를 추론하기 때문에 모델이 텍스트를 올바르게 인식하지 못함
      • 텍스트 외의 불필요한 정보가 포함되어 노이즈로 작용
  • 원본 이미지에서 상대좌표 계산 후, 텍스트 영역을 크롭하여 리사이징
    • 모델 성능 개선 가능성을 확인
      • 텍스트 영역만 모델에 입력하여 노이즈를 제거: 크롭된 이미지로 텍스트 간 간섭을 줄여 인식 성능 향상 기대
      • 문맥이 없는 텍스트를 학습시켜 모델의 문맥 의존성을 개선

 

2. 모델 추가 학습 계획

1) 기존 학습 방식의 보완점 분석

  • 과적합 예방
    • 초등 수학 문제 텍스트 데이터에만 의존하지 않고, 오픈 소스 소설 텍스트를 추가 학습 데이터로 선정하여 다양성 확보
      • 공유 마당_ 한국 문학 텍스트 파일 14개(.txt) 에서 랜덤하게 단어 추출 → 문맥 없는 단어 모음 라벨 생성
  • 문장 뒷부분 인식 문제
    • 문장의 뒷부분을 읽어내지 못하는 문제 발생
      • 일부 bbox가 인식되지 않더라도, 단순히 공백으로 이어붙이면 뒤에 있는 bbox 텍스트를 합칠 수 있음. 하지만 모델이 첫 번째 bbox 이후 텍스트를 생성하지 못하거나, 뒤 bbox에서 텍스트가 비어 있음
      • 문맥 의존성에 의해 "뒤에 있는 bbox는 문장의 앞부분이 없으니 생성하지 못한다"고 판단
        • 문맥이 이어지지 않는 단어 조합으로 구성된 텍스트를 생성하여 학습
        • 다양한 품사로 구성된 관계없는 단어들의 나열을 학습 데이터에 포함
# 총 3개의 이미지로 잘려서 리사이징된 문장을 각 구간 별로 예측시킴
"학생들이 탁자 $7$개에 똑같이 나누어 앉으려고 합니다. 탁자 한
개에 $6$ 명씩 앉았다면 학생은 모두 몇 명인지 $ㅁ$를 사용하여 나
눗셈식으로 나타내고 전체 학생 수를 구해 보세요." 

# 1번 이미지 예측 결과
"학생들이 탁자 $7$ 개에 똑같이 나누어 앉으려고 합니다. 탁자 한 개에"

# 2번 이미지 예측 결과
"$재형$ $6$ 명이와 $7$ 중 직각삼각형 $2$를"

# 3번 이미지 예측 결과
"눗셈식으로 나타내고, $4$를 구해 보세요."

[문제 원인]
- 문맥 단절로 인해 이전/다음 문장과의 연관성을 이해하지 못해, 문장 뒷부분은 텍스트를 제대로 예측하지 못함
- TrOCR 모델은 완전한 텍스트 이미지에서 학습되었으므로, 이미지가 불완전하거나 문장이 끊긴 데이터에 대해 성능이 저하됨

[해결 방안]
- 모든 이미지를 가로 병합하여 리사이징: 가로로 너무 길어져 텍스트가 심각하게 찌그러질 수 있음
- 모델의 문맥 의존성 희석: 모델이 독립적인 텍스트 조각을 예측하도록 유도****
  • 숫자, 수식, 기호 예측 성능 향상
    • 텍스트에 초등 1~6학년 수준의 수식을 포함
    • 과적합 방지를 위해 수식 내 숫자를 랜덤 생성
    • 분수는 모델이 인식하기 어렵다고 판단하여 포함하지 않음
  • 문제 데이터 이미지의 글꼴 다양성 부족
    • 대표적인 한글 글꼴(바탕, 맑은 고딕, 굴림체)을 활용해 텍스트 이미지를 생성하여 학습 데이터 다양화
  • 텍스트 영역만 입력
    • TroCR 모델의 한계점 보완: 텍스트 영역만 크롭하여 노이즈 제거 후 모델에 입력

 

2) 모델 추가 학습 데이터 생성

  • 텍스트 → 이미지 생성
    • Python 라이브러리: trdg (Text Recognition Data Generator)의 GeneratorFromStrings 기능 활용
  • 문제 텍스트 길이
    • 텍스트 길이를 5~30자로 제한하여 데이터 생성
    • 생성된 텍스트를 기반으로 이미지화
  • 리사이징된 이미지 생성을 통한 훈련 시간 단축
    • 모델 입력 크기에 맞게 이미지를 384x384 픽셀로 리사이징
  • 추가 학습 데이터 개수 계산
    • 문맥 없는 데이터가 문맥 데이터의 30~50% 정도여야 모델의 문맥 의존성 희석 효과를 기대할 수 있음
    • 문맥 의존성을 줄이는 것이 목적이지만, 모델이 문맥 있는 데이터에서의 성능도 유지해야 함. 문맥 없는 데이터 학습이 너무 많으면 모델이 문맥 의존성을 완전히 잃을 수 있음
    • 문맥 데이터 총합
      • 사전 학습(사전 학습된 모델): 6,000,000개
      • 추가 학습(내가 학습시킴): 15,224개 (Training:validation = 8:2)
      • 총합: 6,015,224개
    • 문맥 없는 데이터 개수 계산
      • 문맥 없는 데이터 (30%): 6,015,224 × 0.3 ≈ 1,804,567개 (약 180만 개)
      • 문맥 없는 데이터 (50%): 6,015,224 × 0.5 ≈ 3,007,612개 (약 300만 개)
      • 결론: 문맥 없는 데이터는 180만 ~ 300만 개가 적합(리소스 제약이 있을 경우, 10만 ~ 30만 개로 시작하여 점진적으로 늘리는 방식이 효과적) "글꼴 별 100만 개 데이터, 총 300만 개 추가 학습 데이터 생성" 

trocr-small-korean 모델 사전 학습 정보

 

3) 모델 추가 학습

(1) 학습 환경

  • 학습 데이터 저장소: S3 버킷 (big9-project-02-training-bucket)
    • 리사이징된 이미지: processed_data/ocr/images/
    • 라벨: processed_data/ocr/labels/
  • 추가 학습 데이터 생성 스크립트: EC2
  • 추가 학습 스크립트: EC2
  • 모델 저장소: S3 버킷 (big9-project-02-model-bucket)
    • 베스트 모델: ocr/best_ocr/
    • 학습 완료된 모델: ocr/trained_ocr/

(2) 학습 방식

  • Timestamp 기반 저장
    • 각 에포크 종료 시, 타임스탬프를 포함한 체크포인트 파일을 저장
    • 중간에 학습이 중단되더라도, 이전에 저장된 체크포인트를 로드하여 중단된 지점부터 이어서 학습 가능
  • 베스트 모델 및 최종 모델 저장
    • 검증 손실(Validation Loss)이 가장 낮은 모델을 best_model 폴더에 별도로 저장
    • 최종 학습 완료 시, 전체 학습 결과를 반영한 모델을 OCR_MODEL_SAVE_PATH에 저장
  • 하이퍼파라미터
    • 배치 크기: 16
      • GPU 사용 시: 더 큰 배치 크기 설정 가능 (e.g., 64, 128)
      • CPU 사용 시: 배치 크기를 작게 설정 (e.g., 16, 32)
    • 에포크 수: 5 (추후 성능에 따라 조정)
      • 데이터가 크기 때문에 에포크가 지나치게 많으면 과적합 위험이 있음
    • 샘플링: 데이터 로드를 활용한 배치 로드
      • 300만 개의 데이터를 모두 학습에 사용하면서도 데이터 로딩과 훈련 시간을 효율적으로 관리하기 위해, 데이터 로드를 활용한 배치 로드 방식을 채택
      • 배치 로드 방식은 학습 중에 데이터를 배치 단위로 동적으로 로드하며, 매 epoch마다 데이터를 셔플링하여 학습 데이터의 다양성을 확보
    • 옵티마이저: Adam
      • 가장 널리 사용되는 옵티마이저 중 하나로, 학습률을 자동으로 조정
      • 각 가중치에 대해 적응적 학습률(Adaptive Learning Rate)을 사용하여, 기울기 변화가 큰 방향에서는 학습률을 줄이고, 변화가 작은 방향에서는 학습률을 높이는 방식으로 동작
      • Learning Rate Scheduler 도입(학습이 진행됨에 따라 학습률을 줄임. 특히 ReduceLROnPlateau 스케줄러를 사용하면 성능이 정체되는 시점에서 학습률을 자동으로 낮춰줌)
    • Early Stopping 도입 X
      • 텍스트 데이터에서 Loss의 한계
        • Loss 값이 낮아도 품질이 좋지 않을 수 있음: 텍스트 데이터는 정확한 단어 순서와 문맥을 고려해야 하기 때문에 Loss가 낮아져도 실제 예측 품질이 떨어질 수 있음
        • 평가 메트릭과의 차이: Loss는 학습의 내부적인 지표일 뿐, 실제 성능(예: BLEU, CER, WER 등)과는 상관관계가 약할 수 있음
[tip] 랜덤 샘플링 vs 데이터 로드
  랜덤 샘플링 데이터 로드를 활용한 배치 로드
데이터 접근 시점 학습 이전에 고정된 샘플 추출 학습 중 동적으로 배치를 생성
전체 데이터 사용 일부 데이터만 사용 전체 데이터를 사용
샘플링 방식 전체 데이터에서 무작위 추출 셔플링 옵션으로 배치 생성 시 무작위 섞기 가능
메모리 사용 샘플링된 데이터를 메모리에 올림 배치 단위로 처리하여 메모리 사용 효율적
다양성 데이터 다양성이 제한될 수 있음 모든 데이터를 사용할 수 있으므로 다양성 확보 가능
적용 시점 전처리 단계에서 고정 학습 루프에서 동적으로 처리

 

 

 

 

📙 내일 일정

  • 라벨링 파이프라인 자동화