728x90
Step 01
- 학습 데이터 구성
- Training Data : Test Data : Validation Data = 6 : 2 : 2
구분 원본 이미지 바운딩 박스 자른 이미지 train 120 14730 test 40 5015 validation 40 4822
- Training Data : Test Data : Validation Data = 6 : 2 : 2
- → AI 허브 샘플 데이터 2001 파일 원본 이미지 200장
- 파일 분배 작업
- AI 허브
json
라벨 데이터에서 바운딩 박스 영역에 맞춰서 이미지를 잘라서 저장한다. - json 라벨 데이터에서 라벨 값을 불러와 txt 파일로 저장한다.
- {크롭된 이미지 파일명} {실제 라벨 데이터} 형식
Step 02
- lmdb 형식으로 변환→ train, test, val 모두 동일하게 적용
python3 create_lmdb_dataset.py \
--inputPath ./val \
--gtFile ./crop-img/result/val_labels.txt \
--outputPath lmdb/val
Step 03
🏃 Problem
- 로컬 환경에서 학습
- 삽질 1. worker 개수 제한
🚫 TypeError : Can't Pickle Environment
python3 train.py \\
--workers 0 \\
--train_data "./fine-tune/lmdb/train" \\
--valid_data "./fine-tune/lmdb/val" \\
--select_data / \\
--batch_ratio 1 \\
--Transformation None \\
--FeatureExtraction "VGG" \\
--SequenceModeling "BiLSTM" \\
--Prediction "CTC" \\
--input_channel 1 \\
--output_channel 256 \\
--hidden_size 256 \\
--saved_model "./fine-tune/pre-model/korean_g2.pth" \\
--FT
- worker 개수를 0으로 지정해준다.
- ref. 네이버 deep-text-recognition 모델을 custom data로 학습 & 아키텍쳐 분석
- 삽질 2. character를 파라미터로 넣어줌
$ python3 train.py \\
--train_data "./workspace/step3/training" \\
--valid_data "./workspace/step3/validation" \\
--select_data / \\
--batch_ratio 1 \\
--Transformation None \\
--FeatureExtraction "VGG" \\
--SequenceModeling "BiLSTM" \\
--Prediction "CTC" \\
--input_channel 1 \\
--output_channel 256 \\
--hidden_size 256 \\
--character " !\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~가각간갇갈감갑값강갖같갚갛개객걀거걱건걷걸검겁것겉게겨격겪견결겹경곁계고곡곤곧골곰곱곳공과관광괜괴굉교구국군굳굴굵굶굽궁권귀규균그극근글긁금급긋긍기긴길김깅깊까깎깐깔깜깝깥깨꺼꺾껍껏껑께껴꼬꼭꼴꼼꼽꽂꽃꽉꽤꾸꿀꿈뀌끄끈끊끌끓끔끗끝끼낌나낙낚난날낡남납낫낭낮낯낱낳내냄냉냐냥너넉널넓넘넣네넥넷녀녁년념녕노녹논놀놈농높놓놔뇌뇨누눈눕뉘뉴늄느늑는늘늙능늦늬니닐님다닥닦단닫달닭닮담답닷당닿대댁댐더덕던덜덤덥덧덩덮데델도독돈돌돕동돼되된두둑둘둠둡둥뒤뒷드득든듣들듬듭듯등디딩딪따딱딴딸땀땅때땜떠떡떤떨떻떼또똑뚜뚫뚱뛰뜨뜩뜯뜰뜻띄라락란람랍랑랗래랜램랫략량러럭런럴럼럽럿렁렇레렉렌려력련렬렵령례로록론롬롭롯료루룩룹룻뤄류륙률륭르른름릇릎리릭린림립릿마막만많말맑맘맙맛망맞맡맣매맥맨맵맺머먹먼멀멈멋멍멎메멘멩며면멸명몇모목몰몸몹못몽묘무묵묶문묻물뭄뭇뭐뭣므미민믿밀밉밌및밑바박밖반받발밝밟밤밥방밭배백뱀뱃뱉버번벌범법벗베벤벼벽변별볍병볕보복볶본볼봄봇봉뵈뵙부북분불붉붐붓붕붙뷰브블비빌빗빚빛빠빨빵빼뺨뻐뻔뻗뼈뽑뿌뿐쁘쁨사삭산살삶삼상새색샌생서석섞선설섬섭섯성세센셈셋션소속손솔솜솟송솥쇄쇠쇼수숙순술숨숫숲쉬쉽슈스슨슬슴습슷승시식신싣실싫심십싱싶싸싹쌀쌍쌓써썩썰썹쎄쏘쏟쑤쓰쓸씀씌씨씩씬씹씻아악안앉않알앓암압앗앙앞애액야약얇양얗얘어억언얹얻얼엄업없엇엉엌엎에엔엘여역연열엷염엽엿영옆예옛오옥온올옮옳옷와완왕왜왠외왼요욕용우욱운울움웃웅워원월웨웬위윗유육율으윽은을음응의이익인일읽잃임입잇있잊잎자작잔잖잘잠잡장잦재쟁저적전절젊점접젓정젖제젠젯져조족존졸좀좁종좋좌죄주죽준줄줌줍중쥐즈즉즌즐즘증지직진질짐집짓징짙짚짜짝짧째쨌쩌쩍쩐쪽쫓쭈쭉찌찍찢차착찬찮찰참창찾채책챔챙처척천철첫청체쳐초촉촌총촬최추축춘출춤춥춧충취츠측츰층치칙친칠침칭카칸칼캐캠커컨컬컴컵컷켓켜코콜콤콩쾌쿠퀴크큰클큼키킬타탁탄탈탑탓탕태택탤터턱털텅테텍텔템토톤톱통퇴투툼퉁튀튜트특튼튿틀틈티틱팀팅파팎판팔패팩팬퍼퍽페펴편펼평폐포폭표푸푹풀품풍퓨프플픔피픽필핏핑하학한할함합항해핵핸햄햇행향허헌험헤헬혀현혈협형혜호혹혼홀홍화확환활황회획횟효후훈훌훔훨휘휴흉흐흑흔흘흙흡흥흩희흰히힘"
--saved_model "./workspace/pre_trained_model/korean_g2.pth" \\
--FT
→ 파라미터가 너무 길어서 터미널 상에서 제한이 된다.
- 삽질 3. torch.load 에 cpu 설정해주기
📄 train.py
# data parallel for multi-GPU
model = torch.nn.DataParallel(model).to(device)
model.train()
if opt.saved_model != '':
print(f'loading pretrained model from {opt.saved_model}')
if opt.FT:
model.load_state_dict(torch.load(opt.saved_model, map_location=torch.device('cpu')), strict=False)
else:
model.load_state_dict(torch.load(opt.saved_model, map_location=torch.device('cpu')))
print("Model:")
print(model)
- 삽질 4. 인코딩 방식 정의
🚫 Non-UTF-8 code starting with '\xeb’
🎉 Solve
📄 train.py
...
opt.character = " !\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~가각간갇갈감갑값강갖같갚갛개객걀거걱건걷걸검겁것겉게겨격겪견결겹경곁계고곡곤곧골곰곱곳공과관광괜괴굉교구국군굳굴굵굶굽궁권귀규균그극근글긁금급긋긍기긴길김깅깊까깎깐깔깜깝깥깨꺼꺾껍껏껑께껴꼬꼭꼴꼼꼽꽂꽃꽉꽤꾸꿀꿈뀌끄끈끊끌끓끔끗끝끼낌나낙낚난날낡남납낫낭낮낯낱낳내냄냉냐냥너넉널넓넘넣네넥넷녀녁년념녕노녹논놀놈농높놓놔뇌뇨누눈눕뉘뉴늄느늑는늘늙능늦늬니닐님다닥닦단닫달닭닮담답닷당닿대댁댐더덕던덜덤덥덧덩덮데델도독돈돌돕동돼되된두둑둘둠둡둥뒤뒷드득든듣들듬듭듯등디딩딪따딱딴딸땀땅때땜떠떡떤떨떻떼또똑뚜뚫뚱뛰뜨뜩뜯뜰뜻띄라락란람랍랑랗래랜램랫략량러럭런럴럼럽럿렁렇레렉렌려력련렬렵령례로록론롬롭롯료루룩룹룻뤄류륙률륭르른름릇릎리릭린림립릿마막만많말맑맘맙맛망맞맡맣매맥맨맵맺머먹먼멀멈멋멍멎메멘멩며면멸명몇모목몰몸몹못몽묘무묵묶문묻물뭄뭇뭐뭣므미민믿밀밉밌및밑바박밖반받발밝밟밤밥방밭배백뱀뱃뱉버번벌범법벗베벤벼벽변별볍병볕보복볶본볼봄봇봉뵈뵙부북분불붉붐붓붕붙뷰브블비빌빗빚빛빠빨빵빼뺨뻐뻔뻗뼈뽑뿌뿐쁘쁨사삭산살삶삼상새색샌생서석섞선설섬섭섯성세센셈셋션소속손솔솜솟송솥쇄쇠쇼수숙순술숨숫숲쉬쉽슈스슨슬슴습슷승시식신싣실싫심십싱싶싸싹쌀쌍쌓써썩썰썹쎄쏘쏟쑤쓰쓸씀씌씨씩씬씹씻아악안앉않알앓암압앗앙앞애액야약얇양얗얘어억언얹얻얼엄업없엇엉엌엎에엔엘여역연열엷염엽엿영옆예옛오옥온올옮옳옷와완왕왜왠외왼요욕용우욱운울움웃웅워원월웨웬위윗유육율으윽은을음응의이익인일읽잃임입잇있잊잎자작잔잖잘잠잡장잦재쟁저적전절젊점접젓정젖제젠젯져조족존졸좀좁종좋좌죄주죽준줄줌줍중쥐즈즉즌즐즘증지직진질짐집짓징짙짚짜짝짧째쨌쩌쩍쩐쪽쫓쭈쭉찌찍찢차착찬찮찰참창찾채책챔챙처척천철첫청체쳐초촉촌총촬최추축춘출춤춥춧충취츠측츰층치칙친칠침칭카칸칼캐캠커컨컬컴컵컷켓켜코콜콤콩쾌쿠퀴크큰클큼키킬타탁탄탈탑탓탕태택탤터턱털텅테텍텔템토톤톱통퇴투툼퉁튀튜트특튼튿틀틈티틱팀팅파팎판팔패팩팬퍼퍽페펴편펼평폐포폭표푸푹풀품풍퓨프플픔피픽필핏핑하학한할함합항해핵핸햄햇행향허헌험헤헬혀현혈협형혜호혹혼홀홍화확환활황회획횟효후훈훌훔훨휘휴흉흐흑흔흘흙흡흥흩희흰히힘"
...
- 287 line에 character 값을 추가해준다.
🚫 AttributeError: '_MultiProcessingDataLoaderIter' object has no attribute 'next'
...
for i, data_loader_iter in enumerate(self.dataloader_iter_list):
try:
# image, text = data_loader_iter.next()
image, text = next(data_loader_iter)
balanced_batch_images.append(image)
balanced_batch_texts += text
except StopIteration:
self.dataloader_iter_list[i] = iter(self.data_loader_list[i])
# image, text = self.dataloader_iter_list[i].next()
image, text = next(self.dataloader_iter_list[i])
balanced_batch_images.append(image)
balanced_batch_texts += text
except ValueError:
pass
...
- ref. AttributeError: '_MultiProcessingDataLoaderIter' object has no attribute 'next'
- best_accuracy → saved_models에 저장
📄 logs
[1/300000] Train loss: 2.73041, Valid loss: 1.77518, Elapsed_time: 6.95256
Current_accuracy : 57.779, Current_norm_ED : 0.75
Best_accuracy : 57.779, Best_norm_ED : 0.75
--------------------------------------------------------------------------------
Ground Truth | Prediction | Confidence Score & T/F
--------------------------------------------------------------------------------
(055)335-0199 | (hf`내 | 0.0001 False
허가55142 | 허가55142 | 0.3601 True
감경석 | 감경석 | 0.9909 True
경은산업 | 경은산업 | 0.8319 True
행복하게 | 행복하게 | 0.4942 True
--------------------------------------------------------------------------------
[2000/300000] Train loss: 0.08148, Valid loss: 0.15927, Elapsed_time: 281.27772
Current_accuracy : 93.526, Current_norm_ED : 0.98
Best_accuracy : 93.526, Best_norm_ED : 0.98
--------------------------------------------------------------------------------
Ground Truth | Prediction | Confidence Score & T/F
--------------------------------------------------------------------------------
부대시설 | 부대시설 | 0.5210 True
제10조의 | 제10조의 | 0.9877 True
(분류번호) | (분류번호) | 0.7942 True
수리통보 | 수리통보 | 0.8130 True
참조 | 참조 | 0.7268 True
--------------------------------------------------------------------------------
[4000/300000] Train loss: 0.01571, Valid loss: 0.16194, Elapsed_time: 552.72880
Current_accuracy : 93.746, Current_norm_ED : 0.98
Best_accuracy : 93.746, Best_norm_ED : 0.98
--------------------------------------------------------------------------------
Ground Truth | Prediction | Confidence Score & T/F
--------------------------------------------------------------------------------
농지전용허가에 | 농지전용허가에 | 0.9810 True
김해시 | 김해시 | 0.9792 True
김 | 김 | 0.8696 True
경 | 경 | 0.9994 True
개시전 | 개시전 | 0.9890 True
--------------------------------------------------------------------------------
[6000/300000] Train loss: 0.01273, Valid loss: 0.16533, Elapsed_time: 825.87233
Current_accuracy : 94.097, Current_norm_ED : 0.98
Best_accuracy : 94.097, Best_norm_ED : 0.98
--------------------------------------------------------------------------------
Ground Truth | Prediction | Confidence Score & T/F
--------------------------------------------------------------------------------
경남 | 경남 | 0.9839 True
래 | 대 | 0.5007 False
상동 우계 | 상동 우계 | 0.6761 True
270.0 | 270.0 | 0.4540 True
조 | 조 | 0.9684 True
--------------------------------------------------------------------------------
[8000/300000] Train loss: 0.01181, Valid loss: 0.16344, Elapsed_time: 1099.87892
Current_accuracy : 93.987, Current_norm_ED : 0.98
Best_accuracy : 94.097, Best_norm_ED : 0.98
--------------------------------------------------------------------------------
Ground Truth | Prediction | Confidence Score & T/F
--------------------------------------------------------------------------------
위반하는 | 위반하는 | 0.7875 True
제161조 | 제161조 | 0.9961 True
전송 | 전송 | 0.6961 True
내용 | 내용 | 0.9977 True
2001. | 2001. | 0.6579 True
--------------------------------------------------------------------------------
728x90
'🤖 AI' 카테고리의 다른 글
LLM (35) | 2024.05.27 |
---|---|
[DNN] 신경망의 구조 (0) | 2022.02.07 |
[DNN] 그래디언트, 옵티마이저 정리 (0) | 2021.10.02 |
[CNN]CNN모델의 이해 (0) | 2021.09.20 |
[Tensorflow_Keras_API] tf.keras.utils.get_file : 데이터 다운로드 메서드 (0) | 2021.07.21 |