개발자로 후회없는 삶 살기
[최적화] 데이터 처리로만 모델 성능 향상시키기 본문
서론
부스트캠프 대회에서 모델과 학습 파라미터는 고정한 채, 데이터 조작으로만 성능을 향상시켜야 하는 조건이 이었습니다. 현업에서도 데이터의 중요성이 강조되는 가운데 어떠한 데이터 처리로 성능을 향상시킬 수 있었는 지 단계별로 나열해 보겠습니다.
본론
- 초기 조건
학습 데이터 : 100장
에폭 : 30
모델 : base East 모델
- 모델 성능
비교군으로 사용할 베이스 라인 모델을 잡기 위해 초기 조건으로 학습시킨 결과는 다음과 같습니다. 변인 통제를 정확히 하고 고정 베이스라인 모델에 다양한 데이터 처리를 하여 좋은 결과만 앙상블 조합 후보로 둘 것입니다.
- 1차 데이터 클렌징
1. 모든 기호와 단어는 뗀다.
2. 스탬프는 지운다. 직인 말고도 단어가 적힌 스탬프도 지운다.
3. ignore되는 것들은 지운다.
4. 전부 blur된 부분은 검은 색으로 마스킹 처리한다.
5. 공백 기준
- 맨 위에 체크 표시와 괄호는 기호로 봐서 붙이고 (= 기호끼리는 붙이고 단어끼리는 뗀다.)
- ⓘ도 기호로 본다.
- 좌하단에 띄어쓰기(= 띄어쓰기가 조금이라도 있으면 뗀다.)
- ①이 아닌 1도 기호로 본다.
먼저 1차 데이터 클렌징으로 모든 기호와 단어를 떼는 데이터 클렌징을 적용했습니다.
- 모델 성능
원본 데이터로 학습시킨 베이스 라인 모델보다 0.2 정도 성능이 좋아졌습니다. 다만 성능 증가의 원인이 precision이고 recall은 오히려 감소하여
노이즈로 인한 오검출을 막는 것이 키 포인트라고 생각했습니다.
- 2차 데이터 클렌징
-> East 모델 구조를 고려하여 bbox 붙이기
seg 모델이 글자를 잘 잡지만 인접 객체를 구분하지 못 하는 문제가 있었습니다. 따라서 한계점을 극복하기 위해 픽셀 임베딩 후처리를 사용하여 글자 영역과 글자 영역 구분 정보를 활용하는 관련 연구가 있었습니다. 하지만 East 베이스 모델은 후처리가 되지 않기 때문에 1차 데이터 클렌징은 모든 영역을 다 구분했지만, 모델이 영역 구분을 못 하다 보니 2차 클렌징에서는 기호와 단어를 붙이고 실험을 해보았습니다.
- 모델 성능
하지만 오히려 성능이 많이 떨어짐에 따라 테스트 데이터와 모델 아웃풋은 떼어진 결과를 출력한다는 것을 알 수 있었습니다. 이제 앞으로 데이터를 추가하게 되면 떼도록 레이블링을 할 계획입니다.
- 3차 데이터 클렌징(퍼블릭 데이터 추가)
https://www.aihub.or.kr/aihubdata/data/view.do?currMenu=&topMenu=&aihubDataSe=data&dataSetSn=88
저희는 100개 정도의 데이터 셋이 부족하다고 판단하여 외부 데이터 셋을 활용하기로 했습니다.
공공 행정 문서 OCR에서 약 200개 정도의 데이터를 목표 데이터와의 유사성을 높이는 것을 기준으로 뽑아서 1차 레이블링 규칙으로 레이블링 해서 사용했습니다.
그 결과, 베이스라인 모델에서 2% 정도 성능 향상이 있었고 샘플링 결과 바탕으로 5000장의 데이터를 추가하였지만, 과적합이 발생하여 500장의 데이터를 추가하고 추가한 데이터를 기반으로 augmentation 작업을 진행하기로 결정하였습니다.
- 모델 성능
데이터를 추가하였을 때 베이스 모델보다 성능 향상이 관찰되었고, 과적합이 발생하지 않는 선에서 외부 데이터를 활용하기로 하였습니다.
- 4차 데이터 클렌징(증강)
테스트 셋과 훈련 셋이 각 100장으로 같은 개수였기 때문에 적합한 조합의 증강 기법으로 데이터를 늘려주기로 하였습니다.
또한, 모델 결과를 시각화해 본 결과 도장, 잉크, blur, salt pepper 등의 오검출이 많이 발견되었습니다. 테스트 데이터 셋에 많이 있던 흐릿함, 노이즈, 명암, 조명에 대한 대책으로 사용한 증강 기법을 나렬해보면 아래와 같습니다.
1. 노이즈 : guassNoise, ISO
2. blur : advanced, guass, motion
3. 명암 : randomBrightnessContrast
4. 해상도 : imageCompression
사용한 증강 기법들은 적용될 확률은 0.5로 고정하여 랜덤하게 적용되게 하였습니다.
베이스 모델에서 데이터를 추가한 것을 변인 통제한 후 실험한 결과 노이즈, blur를 각각 적용한 모델들이 가장 높은 성능을 보였고 검증 셋에서 상당히 많은 성능 향상이 있었습니다. 특히 이미지 해상도를 높인 것이 노이즈처리를 한 것과 비슷한 성능을 보이는 것으로 보아 Super Resolution을 도입해야 하는 것을 인지할 수 있었습니다.
또한, 위 기법들은 각각 사용한 것이 조합하여 사용한 것보다 성능이 10% 이상 높은 것으로 보아 각각 사용하여 noise, blur 처리에 효과적인 모델을 각각 만들고 앙상블하는 것으로 결정하였습니다.
- 모델 성능
베이스 모델에서 외부 데이터를 추가한 경우보다 성능이 대폭 향상되었습니다. 이번 대회는 학습 셋과 테스트 셋의 개수가 같아서 얼마나 데이터를 효과적으로 늘리고 처리하느냐가 주요 포인트였다고 생각되며, 적합한 증강 기법을 효과적으로 사용한 것이 성능 향상의 원인이라고 판단됩니다. 또한 학습 데이터 부족으로 인해 약간의 증강으로도 큰 향상 폭은 확인할 수 있었습니다.
- 5차 데이터 클렌징(전처리 추가)
1. Binary Labeling(사용 X)
문서의 인식률을 높이기 위해 이미지를 이진화하는 영상 처리 기법을 사용하고자 하였습니다.
1) 바닥, 표, 도장 등의 영역 필터링에 더 나은 인식률을 보임
2) 음영이 있는 이미지의 경우 극단적 이진화로 인해 품질이 저하됨
확인 결과, 음영에 대한 처리를 확실히 하고 사용하면 좋겠다고 판단하였지만, 데이터 전처리의 경우 테스트 데이터 셋에도 적용해야 하는데 이는 대회 룰 위반이라 사용하지 않았습니다.
- 모델 성능
최종 결과로 대회에 제출하지는 않았지만, 데이터 전처리 성능을 확인해 본 결과는 가장 높은 결과를 냈습니다. 이진화로 인해 blur, noise가 제거되니 모델의 오검출이 감소하여 recall 또한 상당히 많이 증가한 것으로 확인됩니다.
결론
데이터의 중요성은 AI를 배운 순간부터 항상 강조되어 왔습니다. 특히, 연구원분들이 연구해 주신 다양한 원리들로부터 유의미한 결과를 얻기 위해서는 데이터 처리가 정말 중요합니다. 이번 대회로 목적에 맞는 데이터 처리를 배울 수 있었습니다.
'[AI] > [딥러닝 | 이슈해결]' 카테고리의 다른 글
[최적화] AMP 이슈 및 피클 직렬화로 속도 높이기 (0) | 2024.01.26 |
---|---|
[최적화] 학습 속도 개선(AMP, Prefetch) (0) | 2024.01.18 |
[최적화] GPU 풀 구현기 2 (0) | 2024.01.12 |
MMLab PART.커스텀 파이프라인 제작 (0) | 2024.01.09 |
Augmentation PART.albumentation 활용 (2) | 2023.12.19 |