easyOCR을 fine-tunning하는 방법은 다양한 블로그에 잘 설명되어있었습니다.
주로 참고한 블로그는 다음과 같습니다
EasyOCR과 OpenCV를 이용한 광학식문자인식기술 프로젝트
스타트10팀
velog.io
EasyOCR 사용자 모델 학습하기 (4) - 모델 학습
신경망 모델 학습하기에 앞서 학습에 필요한 학습데이터 생성 및 변환 등에 대한 내용은 이전 포스트를 참고하기 바란다. [Development/OCR] - EasyOCR 사용자 모델 학습하기 (1) - 시작하기 전에 [Developme
davelogs.tistory.com
네이버 deep-text-recognition 모델을 custom data로 학습 & 아키텍쳐 분석
작성자 : 한양대학원 융합로봇시스템학과 유승환 석사과정 (CAI LAB) 네이버 Clova AI팀에서 연구한 OCR 딥러닝 모델을 custom data로 학습하는 과정을 정리해보겠습니다~! * 2021년 3월 8일자 기준으로 내
ropiens.tistory.com
기본적으로 OCR모델은 글자를 인식하는 detection모델과 인식한 영역에서 글자를 추출해 디지털화하는 recognition모델로 구성되어있습니다. 아래 그림은 easyOCR의 구조입니다.
fine-tunning하는 부분은 recognition모델입니다. easyOCR 공식 레포지토리에서는 deep-text-recognition-benchmark를따라 커스텀모델을 만들라고 했습니다.
GitHub - clovaai/deep-text-recognition-benchmark: Text recognition (optical character recognition) with deep learning methods.
Text recognition (optical character recognition) with deep learning methods. - GitHub - clovaai/deep-text-recognition-benchmark: Text recognition (optical character recognition) with deep learning ...
github.com
colab으로 훈련
모델 훈련은 gpu를 사용해야합니다.
대여 받은 노트북에 gpu가 있었지만 CUDA 세팅을 해야해서 일단은 colab으로 훈련시켰습니다.
colab훈련 당시 사용한 데이터는 ai허브의 데이터가 아닌, easyOCR 레포지토리에서 권장하는 textrecognitiondatagenerator로 생성한 데이터였습니다.
아래는 훈련 코드입니다.
!CUDA_VISIBLE_DEVICES=0 python3 train.py \
--train_data /content/gdrive/MyDrive/deep-text-recognition-benchmark/data_lmdb/train \
--valid_data /content/gdrive/MyDrive/deep-text-recognition-benchmark/data_lmdb/val \
--select_data back2-basic-dist-skew \
--batch_ratio 0.25-0.25-0.25-0.25 \
--Transformation TPS \
--FeatureExtraction ResNet \
--SequenceModeling BiLSTM \
--Prediction Attn \
--data_filtering_off \
--saved_model /content/gdrive/MyDrive/deep-text-recognition-benchmark/models/TPS-ResNet-BiLSTM-Attn.pth \
--FT
이때 다음과 같은 에러가 발생했습니다.
dataset_root: /content/gdrive/MyDrive/deep-text-recognition-benchmark/data_lmdb/train dataset: basic
Traceback (most recent call last):
File "/content/gdrive/MyDrive/deep-text-recognition-benchmark/train.py", line 317, in <module>
train(opt)
File "/content/gdrive/MyDrive/deep-text-recognition-benchmark/train.py", line 31, in train
train_dataset = Batch_Balanced_Dataset(opt)
File "/content/gdrive/MyDrive/deep-text-recognition-benchmark/dataset.py", line 42, in __init__
_dataset, _dataset_log = hierarchical_dataset(root=opt.train_data, opt=opt, select_data=[selected_d])
File "/content/gdrive/MyDrive/deep-text-recognition-benchmark/dataset.py", line 118, in hierarchical_dataset
dataset = LmdbDataset(dirpath, opt)
File "/content/gdrive/MyDrive/deep-text-recognition-benchmark/dataset.py", line 141, in __init__
nSamples = int(txn.get('num-samples'.encode()))
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
아무래도 basic.lmdb를 생성할때 데이터 파일 이름에 문제가 있어서 중간에 멈춰 완전히 생성하지 못했는데, 여기서 기인한 문제 같았습니다.
그래서 원래 이미지 30000장을 생성했던 basic데이터셋을 20000장으로 새로 만들었습니다.
다시 훈련을 재게했지만 colab pro를 결제하지 않아 할당된 gpu를 모두 사용해버서 부계정으로 다시 훈련했고, 이마저도 금세 gpu할당량을 다써버렸습니다. 나중에서야 구글이 이런 꼼수도 다 막아 놨다는 것을 알게되었습니다.
colab으로 2번의 훈련을 진행한 결과 train_loss : 0.02, val_loss : 0.5 accuracy : 57.2% 가 나왔습니다.
아래 사진은 테스트 결과입니다.
train loss에 비해 val loss가 많이 높은 과대적합을 보였습니다. 그 이유는 두번째 훈련에서 첫번째 훈련과 중복된 데이터셋을 사용했기 때문입니다. 훈련에 사용된 데이터셋을 걸러낼 수단을 마련하지 않았기때문에 이와 같은 문제가 발생했습니다. colab pro를 결제할 마음은 없었기에 로컬에서 훈련시키기로 했습니다.
다음 편은 로컬 훈련 과정을 다루겠습니다.
'프로젝트' 카테고리의 다른 글
[DSBA]예비프로젝트 : OCR모델 후처리 (0) | 2023.08.22 |
---|---|
[DSBA]예비프로젝트 : 모델 훈련(2) (0) | 2023.08.20 |
[DSBA]예비프로젝트 : 데이터전처리 (0) | 2023.08.12 |
[DSBA]예비프로젝트 : 프로젝트 기획 (0) | 2023.08.04 |
딥러닝으로 뉴진스 멤버 분류해보기 (0) | 2023.02.18 |