728x90

Step 01

  • 학습 데이터 구성
    • Training Data : Test Data : Validation Data = 6 : 2 : 2
      구분 원본 이미지 바운딩 박스 자른 이미지
      train 120 14730
      test 40 5015
      validation 40 4822
  • → AI 허브 샘플 데이터 2001 파일 원본 이미지 200장
  • 파일 분배 작업
  1. AI 허브 json 라벨 데이터에서 바운딩 박스 영역에 맞춰서 이미지를 잘라서 저장한다.
  2. json 라벨 데이터에서 라벨 값을 불러와 txt 파일로 저장한다.
    1. {크롭된 이미지 파일명} {실제 라벨 데이터} 형식

 


Step 02

  • lmdb 형식으로 변환→ train, test, val 모두 동일하게 적용
python3 create_lmdb_dataset.py \                                       
        --inputPath ./val \  
        --gtFile ./crop-img/result/val_labels.txt \  
        --outputPath lmdb/val

 

 

EasyOCR 사용자 모델 학습하기 (6) - 한글 학습데이터 생성, 학습 및 테스트

이번에는 한글 학습데이터를 생성하고 학습, 검증하는 과정을 진행해 보고자 한다. 이전에 작성한 학습데이터 생성부터 변환, 미세조정(Fine-tune) 학습 등에 대한 내용은 아래 포스트를 참고하기

davelogs.tistory.com

 

 


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

 

  • 삽질 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'

 

📄 dataset.py

			...

			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
			...

 

📄 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