로컬 훈련
우선 대여받은 노트북에 CUDA개발환경을 셋팅했습니다.
노트북의 gpu는 RTX 3050이었고, 열심히 검색하며 구축한 CUDA 개발 환경은 다음과 같습니다.
python 3.9 / CUDA Toolkit 11.3 / cuDNN v8.9.0
설치한 pytorch 버전과 라이브러리입니다.
conda install pytorch==1.12.1 torchvision==0.13.1 torchaudio==0.12.1 cudatoolkit=11.3 -c pytorch
총 4번의 훈련을 진행했고 저장공간의 한계로 데이터를 미리 만들어 놓지 않고 매 훈련마다 train lmdb와 validation lmdb를 만들었습니다. AIhub의 이미지들에서 필요한 부분만 크롭하고, 미처 코드로 걸러내지 못한 필요없는 부분을 직접 거르다보니 데이터셋 구축에 생각보다 많은 시간을 소모했습니다. 하지만 모델 훈련은 그것보다 훨씬 오래걸렸습니다..
다음은 훈련 코드입니다.
python train.py \
--train_data C:\deep-text-recognition-benchmark\data_lmdb\train4 \
--valid_data C:\deep-text-recognition-benchmark\data_lmdb\val4 \
--workers 0 \
--select_data / \
--batch_ratio 0.25 \
--imgH 55 \
--Transformation None \
--FeatureExtraction VGG \
--SequenceModeling BiLSTM \
--Prediction CTC \
--output_channel 256 \
--hidden_size 256 \
--data_filtering_off \
--saved_model C:\deep-text-recognition-benchmark\saved_models\third_model\best_accuracy.pth \
--FT
처음 훈련을 시도할때 utf-8 encoding 에러가 발생해 train.py 최상단에 #-*-coding: utf-8-*- 을 추가했습니다.
그리고 workers를 4로 지정했더니 pickle라이브러리와 관련된 에러가 발생해 0으로 지정했습니다.
imgH는 모델에 들어갈 이미지의 세로 길이인데, 훈련에 사용될 데이터 셋의 모든 이미지 세로 길이에 대한 히스토그램을 그려보고 최빈값으로 정했습니다.
하지만 매 훈련마다 그 값이 달라진다면 모델의 결과도 비일관적이지 않을까 생각이 들어 두번째 훈련부터는 값을 55로 고정했습니다.
매번 데이터셋을 만들때마다 이미지 높이의 최빈값을 확인한 결과, 52~60정도로 다행히 그리 큰 차이를 보이지 않았습니다.
첫 번째 훈련 결과
훈련 데이터 : 102473개
검증데이터 : 35060개
elapsed time(경과시간) : 106590초 = 약 29.6시간
train loss : 0.241
valid loss : 0.281
best accuracy : 85.2%
best normED : 0.94
*normED는 nomalized edit distance로, 정답 단어와 예측 단어사이의 유사도를 거리로 측정해 정규화한 값이다.
값이 높을수록 모델이 잘 예측하는 것이다. 자세한건 ICDAR2019 평가방법을 참고하면 된다.
두 번째 훈련 결과
훈련 데이터 : 205952개
검증데이터 : 84955개
elapsed time(경과시간) : 77038초 = 약 21.4시간
train loss : 0.131
valid loss : 0.256
best accuracy : 86.2%
best normED : 0.95
이때부터는 실제 사진으로 모델을 테스트해봤습니다.
custom모델을 사용하기위한 설정을 하던 중 발생한 여러 에러를 다음과 같이 처리했습니다.
line 174 in recognition.py > model.load_state_dict(new_state_dict, strict=False) 로 수정
line 181 in recognition.py > gpu병렬 사용 코드 주석처리, strict=False로 수정
size mismatch error 발생 : custom.yaml > character_list 에 ‘칡’추가해서 1011개로 수정
아직 결과는 처참했습니다.
세 번째 훈련 결과
훈련 데이터 : 84977개
검증데이터 : 34376개
elapsed time(경과시간) : 110592초 = 30.72시간
train loss : 0.508
valid loss : 0.353
best accuracy : 93.8%
best normED : 0.98
흥미롭게도 valid loss가 train loss보다 큰 epoch가 종종 보였습니다. 이 부분은 데이터셋의 문제거나 모델의 문제인데, 저는 훈련 데이터와 검증데이터를 나눌때 각각의 이미지에 대한 특성을 고려하지 않고 단순히 개수로만 나눴기때문에 데이터셋 특성의 불균형이 생긴 것이라고 짐작했습니다.
같은 사진으로 테스트한 결과입니다.
이번에는 best accuracy모델과 best normED모델 각각 테스트해봤습니다.
이전 모델보다는 나아졌지만 여전히 갈길이 멀었습니다.
네 번째 훈련 결과
훈련 데이터 : 140362개
검증데이터 : 93574개
네 번째 훈련 로그 데이터가 날아가버려 평가 지표는 적을 수 없지만 같은 사진을 테스트해봤을때 세번째 모델보다 크게 나아진 부분이 없었습니다.
프로젝트 종료일이 다가와 더이상 훈련시킬 수 없었고, 결국 기본 모델의 후처리로 방향을 틀었습니다.
많은 시간을 할애한 모델을 사용할 수 없어 매우 아쉬웠지만 이 역시 해보지 않았으면 몰랐을 결과였습니다. 그리고 직접 로컬 CUDA개발환경에서 모델을 훈련시키는 경험을 얻을 수 있었습니다.
다음 편은 어떻게 OCR 후처리를 했는지 설명하겠습니다.
'프로젝트' 카테고리의 다른 글
[DSBA]예비프로젝트 : OCR모델 후처리 (0) | 2023.08.22 |
---|---|
[DSBA]예비프로젝트 : 모델 훈련(1) (0) | 2023.08.19 |
[DSBA]예비프로젝트 : 데이터전처리 (0) | 2023.08.12 |
[DSBA]예비프로젝트 : 프로젝트 기획 (0) | 2023.08.04 |
딥러닝으로 뉴진스 멤버 분류해보기 (0) | 2023.02.18 |