일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 국비지원
- 업스테이지패스트캠퍼스
- golang array
- 상수
- scope
- 패스트캠퍼스업스테이지부트캠프
- method
- 메서드
- slice
- 타입
- receiver method
- golang pointer
- 스코프
- keyword
- 패스트캠퍼스
- 패스트캠퍼스업스테이지에이아이랩
- receiver
- golang slice remove
- Pointer
- 변수
- 함수
- array
- Interface
- UpstageAILab
- struct
- golang
- 패스트캠퍼스AI부트캠프
- package
- golang slice
- golang interface
- Today
- Total
느리지만 꾸준히, 코딩
업스테이지 CV 경진대회 정리 본문
업스테이지 Computer Vision
대회 개요
대회명
- 문서 타입 분류를 위한 이미지 분류 대회
대회 일정 (Timeline)
- 프로젝트 전체 기간: 2월 14일 (금) ~ 2월 25일 (화)
팀:
- 팀명: 오합지존 Idle
대회 소개
- Computer Vision에서 가장 중요한 태스크 중 하나인 이미지 분류 문제.
- 문서 타입 분류를 위한 이미지 분류 대회.
- 금융, 의료, 보험, 물류 등 다양한 산업에서 활용됨.
- 대량의 문서 이미지를 식별하고 자동화 가능.
데이터 개요
- 총 17종의 문서 클래스
- 입력 (Input): 3,140장의 이미지
- 출력 (Output): 각 이미지의 문서 클래스 예측 (CSV 파일 제출)
기술적 기대 효과
- 딥러닝 기반 이미지 분류 모델 구축
- Backbone 모델 활용 및 성능 최적화
- 현업에서 사용하는 실 데이터 기반 학습
- 다양한 테크닉 적용 가능
나의 역할
- 팀장 / 이미지 전처리 / 모델링 / 환경구축
팀 규칙
- 대회성적보다는 개인의 성장 & 팀의 성장을 우선시한다.
- 상호간의 지식 & 인사이트를 공유하며 함께 발전해나가는 경험을 한다.
- 철저한 가설 검증을 프로세스를 반복하며 성장하는 경험을 한다.
지속 가능한 성장 환경 구축
- 회의시간 활용하기
- 학습 내용 공유
- 부족한 학습내용 보완하기
- 기록하기
- TIL (Today I Learned)
- 철저한 가설 검증 단계를 통한 모델 개선 경험 해보기
- 실험 기록하기
- Wandb 팀 프로젝트를 활용
- 팀원간 실험 상황을 실시간으로 공유
- 좋은 모델 & 파라미터를 실시간으로 시각화하고 인사이트를 얻음
EDA
1. Target 종류
- 특이사항: Target 별로 40~100개의 분포를 가지는 데이터 불균형이 존재
2. 실제 이미지 형태
- 훈련이미지: 특별히 변형이 되어있지 않지않음
- 테스트 데이터: 회전, 컷믹스, 믹스업, 노이즈, 밝기조절, 재질 변형 등
Preprocessing
3개의 라이브러리를 활용해 전처리 진행
1. Albumentations
2. Augraphy
3. Open CV
다양한 메소드를 통한 전처리 진행
Mixup
믹스업은 유리재질, 반사재질의 경우 존재하므로 특정 target끼리 믹스업을 진행
이미지 사이즈 분포
- "443*591" 사이즈가 대부분
- 특이 사항으로 테스트 이미지는 회전으로 인해 가로로 긴 "591*443"사이즈가 많음.
가설 검증
가설1. Padding 처리를 일괄되게 처리한다면 학습추론시 도움이 될것이다.
- 기본 세로이미지가 대부분이기때문에 전체이미지를 세로로 변환 후 모델링 진행
실험 파라미터
{
epochs: 2,
batch_size: 100,
learnning_rate: 0.001,
model: ResNet18
}
실험 결과
F1 Score
Valid: 0.926
Public: 0.3549
결론:
세로 변환후 padding 처리만으로 public f1 score 0.35는 의미있는 점수라고 판단.
입력을 일관되게 처리하는 전처리가 학습/추론시 도움이 된다.
가설2. 이미지 사이즈가 작아지면 정보손실로 성능에 악형향이 있을것이다.
실험: 원본이미지의 1/10사이즈로 학습/추론
결론:
- 0.3549 -> 0.0334 (-0.0209)하락
- 정보손실로 인해 예측 악영향 가능성 확인
가설3. 훈련 이미지에 회전 이미지를 추가하면 성능이 향상될 것이다.
실험A:
1. 훈련 이미지: 원본100%
2. 검증 이미지: 쉬프트 회전 3400개
실험B:
1. 훈련 이미지: 원본 100% + 회전이미지 1700개
2. 검증 이미지: 쉬프트 회전 3400개
결과:
- Valid : 0.33 -> 0.58( + 0.2524)
- Public: 0.35->0.78( + 0.4262)
- 추론하고자하는 이미지의 상태(노이즈, 회전 등)을 훈련시에 포함시키는 것이 중요하다.
새로운 발견 (1)
특정 Target에 대한 오탐률이 집중되어있다.
(비슷한 문서는 예측에 어려움이 있다.)
새로운 발견 (2)
Epoch마다 오탐 Target의 분포가 변한다
적절한 시점에 학습을 중단이 중요할수있다.
추론시 각 Epoch 모델 Voting 전략 가능성 확인
가설4. 더 많은 데이터를 학습하면 학습에 도움이 될 것이다.
실험:
- 회전이미지 1700-> 3400개 증강
결론: F1 Score 향상에 도움이 된다.
그렇다면, 데이터를 계속해서 증가시킨다면 F1 Score는 계속해서 향상될것인가?
실험: 회전이미지 3400 -> 6800개 증강
결과: 임계점이 존재한다.
가설5. 모든 이미지 전처리 + 데이터 증강을 적용하면 성능 향상될것이다.
지금까지의 실험을 바탕으로 이미지 전처리 및 데이터 증강은 모델성능형능 향상에 도움이 된다는것을 알게되었습니다.
그렇다면, 다양한 이미지 전처리 와 이미지를 증강시킨다면 성능 향상될것이라고 생각했습니다.
Train F1: 0.95
Valid F1: 0.78
- 이미지 노이지 전체 적용
- 데이터 114610개 증강
결과:
Train F1: 0.99
Valid F1: 0.98
Public F1: 0.90
검증하고자 하는 이미지(테스트이미지)와 유사한 환경의 이미지가 필요하며 다양한 이미지 셋이 필요하다
가설6. 각 모델의 장점을 활용하여 모델앙상블을 한다면 성능향상될것이다.
실험: ResNet + Efficientnet 앙상블
결과:
- 성능향상 : 0.90 -> 0.94
- 각 모델의 장점을 활용한 앙상블은 효과가 있다.
- hard voting, soft voting 의 성능은 큰 차이가 있지 않다.
사람은 어떻게 문서를 인식할까?
가설7. 타이틀을 탐지 할 수 있다면 문서를 전체를 보지 않아도 문서 분류가 가능 할 것이다
모델: YOLOv12
데이터라벨링: Label Studio
1540개 훈련데이터에 대한 라벨링 진행
결과: 불규칙적이고 일관성이 부족한 라벨링으로 인해 성능에 큰 도움이 되지 않음
BBox라벨링 재처리가장많이 틀리는 문서들만 YOLO탐지로 변경
1. 입퇴원확인서
2. 진단서
3. 외래_진료확인서
4. 소견서_진료소견서
- 가장 많이 틀리는 4개의 Target만 객체탐지 진행
- ResNet + Efficientnet + YOLOv12 앙상블
결론: 전체를 보는 Stage_2 모델과 일부를 탐색하는 Stage_1 모델의 앙상블은 성능 향상에 도움이 된다.
성능 극대화 시도
TTA
- 테스트 데이터에서 가장 많이 틀리는 문서를 탐색해본결과,
- 회전되어있거나 반전된 이미지에 대한 오탐률이 높은것을 확인
- 90도 회전, 좌우반전, 상하반전 테스트 타임 증강을 시도
결과: 0.9617 -> 0.9691 로 소폭의 성능향상을 볼 수 있음
이슈,
YOLO학습시 Target 전체 데이터를 보지 않다보니, 비슷한 글자에 대한 오탐이 발생
오탐이 발생하는 Target에 대해 학습 데이터 추가
가설8. 처방전, 자동차등록증, 이력서를 학습에 포함시킨다면 분류성능 향상될것이다.
- 입퇴원확인서
- 진단서
- 외래_진료확인서
- 소견서_진료소견서
- 처방전 (추가)
- 자동차등록증 (추가)
- 이력서 (추가)
결론 :
- 많은 오탐이 줄어들었음을 확인
- 문서의 글자 패턴:
- 흰색 바탕 + 곡선 & 직선 조합이 많음
- 다양한 문서 유형 추가 및 균형 잡힌 데이터셋 필요
최종채택:
Efficientnet + ResNet + SWIN + YOLO 앙상블
최종회고
지난 대회 "아파트경진대회"에서의 최종 점수는 거의 최하위권이었으며, Base Codeline의 성능을 크게 벗어나지 못했습니다. 대회 종료 후 Submission 제출이 불가능해졌지만, 이후에도 혼자 실험을 지속하며 문제점을 회고했습니다.
주요 회고 내용
1. Base Codeline에 집착하여 새로운 접근을 시도하지 못함
- 기존 코드에 의존하다 보니 새로운 피처 엔지니어링 및 모델링 아이디어를 적용하지 못함
- 창의적인 접근보다는 기존 프레임워크를 개선하는 것에 초점을 맞춤
2. 기록 부족으로 실험 과정이 명확하지 않음
- 실험 결과를 정리하지 않아 어떤 시도가 효과적이었는지 분석하기 어려움
- 같은 실험을 반복하는 비효율적인 상황 발생
3. 가설 기반 검증 부족으로 지속적인 모델 성능 향상이 어려움
- 데이터 분석 및 가설 검증 과정 없이 여러 방법을 시도함
- 모델 성능 개선이 체계적이지 못하고, 랜덤한 시도에 의존
개선 방향
1. Base Codeline을 참고하되, 독자적인 모델 개선 시도
→ 다양한 피처 엔지니어링, 모델 구조 변경, 새로운 접근법 실험
2. 실험 기록을 철저히 관리
→ Weights & Biases(wandb) 활용하여 실험 로그를 체계적으로 기록
3. 가설 기반 실험 설계
→ 데이터 탐색 후 명확한 가설 수립 → 검증 → 피드백 반영 과정 수행
지난 대회를 바탕으로 한 이번 목표 & 결과
- 실험을 체계적으로 기록하고 분석하는 습관을 들여 재현 가능성을 높이기
- 다양한 모델링 기법을 적용하며 자신만의 최적화 전략 개발
- 다음 경진대회에서는 단순 점수 개선이 아닌, 문제 해결력 자체를 키우는 것에 집중
도전과 성장
- 운 좋게도 좋은 팀원분들을 만나게 되었고, 팀장을 맡아 협업을 주도
- TIL(오늘 배운 것, Today I Learned) 공유 및 상호 피드백을 통해
- 개인의 성장뿐만 아니라 팀의 성장도 함께 이루는 경험
- 실험 과정과 문제 해결 방식에 대한 깊이 있는 논의 진행
결과: 전기수 최고 점수 달성
지난 대회에서는 최하위권이었지만, 이번에는 전기수 최고 점수로 마무리!
목표했던 문제 해결력 강화 및 협업을 통한 성과 창출을 달성할 수 있었습니다.
앞으로의 방향
이러한 경험을 바탕으로:
✅ 더 효율적인 협업 프로세스 구축
✅ 지속적인 실험 및 피드백을 통한 문제 해결력 강화
✅ 다음 대회에서도 성장을 이어나가며 한 단계 더 도약
👉 점수만을 목표로 하지 않고, 문제 해결력을 기르는 과정 자체에 집중하는 자세를 유지!
'프로그래밍 > AI' 카테고리의 다른 글
tensor: dim 이해하기 (0) | 2025.02.11 |
---|---|
역전파 (0) | 2025.02.10 |
머신 러닝 발전 5단계 (0) | 2025.02.10 |
딥러닝 학습노트 (0) | 2025.02.10 |
upstage: mlops 프로젝트 (0) | 2025.02.03 |