AI/easyOCR

5. EasyOCR github trainer

사리생성 2025. 11. 17. 22:03

trainer 디렉토리 

trainer/ 디렉토리 

  현재 trainer 디렉토리에는 두 가지 주요 부분이 포함되어 있습니다:
   1. 문자 인식 모델 훈련: train.py, model.py, dataset.py 등은 텍스트를 인식하는 모델을 훈련시키는 데 사용됩니다.
   2. CRAFT 문자 감지 모델 훈련: craft 하위 디렉토리는 이미지에서 텍스트 위치를 찾는(감지하는) CRAFT 모델을 훈련시키기 위한 별도의 프로젝트입니다.


craft 란.

✦ CRAFT는 EasyOCR에서 사용되는 텍스트 감지(Text Detection) 모델입니다.

  주요 특징은 다음과 같습니다:
   * 목적: 이미지 내에서 텍스트가 있는 영역을 찾아내어 경계 상자(bounding box)로 표시하는 역할을 합니다. 즉, "어디에 텍스트가 있는지"를 알려줍니다.
   * 작동 방식: 텍스트 영역과 문자 간의 연결성(affinity)을 예측하여 텍스트 블록을 정확하게 감지합니다.
   * EasyOCR에서의 역할: EasyOCR은 CRAFT와 같은 텍스트 감지 모델을 사용하여 이미지에서 텍스트 영역을 먼저 찾은 다음, 해당 영역에 대해 텍스트 인식(Text Recognition) 모델을 적용하여 실제 텍스트를 추출합니다.

  요약하자면, CRAFT는 EasyOCR 파이프라인의 첫 번째 단계인 텍스트 위치를 찾아내는 핵심 구성 요소입니다.

 trainer/craft/scripts/run_cde.sh 파일

✦ trainer/craft/scripts/run_cde.sh 파일은 CRAFT 모델 훈련을 시작하기 위한 쉘 스크립트입니다. 각 줄의 기능은 다음과 같습니다:

   1. # sed -i -e 's/\r$//' scripts/run_cde.sh
       * 이 줄은 주석 처리되어 실행되지 않습니다.
       * 원래 목적은 스크립트 파일에서 Windows 스타일의 캐리지 리턴(\r) 문자를 제거하여 Unix/Linux 환경에서 스크립트 실행 시 발생할 수 있는 문제를 방지하는 것입니다.

   2. EXP_NAME=custom_data_release_test_3
       * EXP_NAME이라는 쉘 변수를 정의하고, 현재 훈련 세션의 이름으로 custom_data_release_test_3 값을 할당합니다. 이 이름은 결과 파일이나 로그를 저장할 때 사용됩니다.

   3. yaml_path="config/$EXP_NAME.yaml"
       * EXP_NAME 변수를 사용하여 현재 훈련 세션에 사용될 YAML 설정 파일의 경로를 생성합니다. 예를 들어, config/custom_data_release_test_3.yaml이 됩니다.

   4. cp config/custom_data_train.yaml $yaml_path
       * config/custom_data_train.yaml 파일을 위에서 생성한 yaml_path로 복사합니다. 이는 custom_data_train.yaml을 템플릿으로 사용하여 현재 훈련을 위한 고유한 설정 파일을 만드는 과정입니다.

   5. #CUDA_VISIBLE_DEVICES=0,1 python3 train_distributed.py --yaml=$EXP_NAME --port=2468
       * 이 줄은 주석 처리되어 실행되지 않습니다.
       * 만약 주석을 해제하면, 여러 GPU(여기서는 0번과 1번 GPU)를 사용하여 분산 훈련을 시작하는 train_distributed.py 스크립트를 실행합니다. --yaml과 --port 인자를 전달합니다.

   6. CUDA_VISIBLE_DEVICES=0 python3 train.py --yaml=$EXP_NAME --port=2468
       * 이 줄이 실제로 실행되는 훈련 시작 명령어입니다.
       * CUDA_VISIBLE_DEVICES=0: 훈련에 0번 GPU만 사용하도록 설정합니다.
       * python3 train.py: trainer/craft/train.py 스크립트를 Python 3 인터프리터로 실행합니다.
       * --yaml=$EXP_NAME: 훈련 스크립트에 위에서 복사한 설정 파일의 이름(custom_data_release_test_3)을 인자로 전달합니다.
       * --port=2468: 훈련 스크립트에 포트 번호를 전달합니다. 이는 분산 훈련 설정에서 사용될 수 있습니다.

   7. rm "config/$EXP_NAME.yaml"
       * 훈련 스크립트가 시작된 후, 임시로 생성했던 YAML 설정 파일을 삭제하여 config 디렉토리를 정리합니다.

  요약하자면, 이 스크립트는 custom_data_train.yaml을 기반으로 새로운 설정 파일을 만들고, 해당 설정으로 CRAFT 모델의 단일 GPU 훈련을 시작한 다음, 사용했던 임시 설정 파일을 정리하는 역할을 합니다.

 

 

한글 데이터로 추가 학습(Fine-tuning) 시키기

1단계: 훈련 데이터 준비하기
가장 먼저, 내가 가진 800장의 한글 이미지로 모델을 훈련시키기 위한 데이터셋을 준비했습니다. 

 trainer/all_data/ 디렉토리 아래에 훈련용(`ko_train`)과 검증용(`ko_val`) 폴더를 생성.

 생성된 디렉토리에 파일을 넣었다. 

trainer
- all_data
-- ko_train
--- 1000.png
...
--- labels.csv

-- ko_val
--- 1498.png
....
--- labels.csv

 

 labels.scv 파일 생성.

 filename,words
 image001.png,첫번째텍스트
 image002.png,두번째텍스트
    ...

 

 


2단계: 훈련 설정 파일(YAML) 생성

1)  사전 훈련된 모델 다운로드 : 처음부터 훈련하는 것보다 기존 한글 모델을 기반으로 미세 조정(Fine-tuning)하는 것이 효율적. `easyocr/config.py` 파일에서 URL을 참고하여 `korean_g2.pth` 모델을 다운로드하고 압축을 해제.

https://github.com/JaidedAI/EasyOCR/releases/download/v1.3/korean_g2.zip


2)  ko_config.yaml 파일 생성 : trainer/config_files/ 디렉토리에 새로운 설정 파일 생성 . 
    *  experiment_name : 훈련 세션의 이름
    *  train_data ,  valid_data : 훈련 및 검증 데이터 경로
    *  saved_model : 미세 조정을 위해 사용할 korean_g2.pth 모델 지정
    *  FT: true : 미세 조정을 활성화하는 옵션
    *  character : labels.csv 에 있는 모든 글자를 모아 훈련에 사용할 전체 문자셋을 자동으로 생성하여 추가

 

ko_config.yaml

experiment_name: korean_g2_finetune
train_data: all_data
valid_data: all_data/ko_val
manualSeed: 1111
workers: 6
batch_size: 16
num_iter: 1000
valInterval: 200
saved_model: korean_g2.pth
FT: true
optim: false
lr: 1.0
beta1: 0.9
rho: 0.95
eps: 1.0e-08
grad_clip: 5
character: ' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPRSTUVXY[\]^_`io{|}~େᄀᄂᄃᄅᄆᄇᄉᄊᄋᄌᄎᄏᄐᄑ하ᅢᅣᅥᅦᅧᅩᅪᅭᅮᅯᅰᅱᅲᅳᅵᆨᆫᆯᆷᆸᆺᆼᆾᇂㅂ노이텍'
select_data: ko_train
batch_ratio: '1.0'
total_data_usage_ratio: 1.0
batch_max_length: 34
imgH: 64
imgW: 600
rgb: false
contrast_adjust: false
sensitive: true
PAD: true
data_filtering_off: false
Transformation: None
FeatureExtraction: VGG
SequenceModeling: BiLSTM
Prediction: CTC
num_fiducial: 20
input_channel: 1
output_channel: 256
hidden_size: 256
decode: greedy
new_prediction: false
freeze_FeatureFxtraction: false
freeze_SequenceModeling: false

 

 

create_config.py  (labels 파일을 읽어서 yaml 파일 생성)

import pandas as pd
import yaml
import os

try:
    train_df = pd.read_csv('trainer/all_data/ko_train/labels.csv', sep=',', engine='python', keep_default_na=False)
    val_df = pd.read_csv('trainer/all_data/ko_val/labels.csv', sep=',', engine='python', keep_default_na=False)
except FileNotFoundError as e:
    print(f'Error: {e}. Make sure the files are in trainer/all_data/ko_train/ and trainer/all_data/ko_val/')
    exit()

all_words = ''.join(train_df['words']) + ''.join(val_df['words'])
unique_chars = sorted(list(set(all_words)))

# Manually add digits and symbols to the character set if they are not in the labels
for char in '0123456789!"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~':
    if char not in unique_chars:
        unique_chars.append(char)
unique_chars_str = ''.join(sorted(unique_chars))

config = {
    'experiment_name': 'korean_g2_finetune',
    'train_data': 'all_data',
    'valid_data': 'all_data/ko_val',
    'manualSeed': 1111,
    'workers': 6,
    'batch_size': 16,
    'num_iter': 1000,
    'valInterval': 200,
    'saved_model': 'korean_g2.pth',
    'FT': True,
    'optim': False,
    'lr': 1.0,
    'beta1': 0.9,
    'rho': 0.95,
    'eps': 1e-8,
    'grad_clip': 5,
    'character': unique_chars_str,
    'select_data': 'ko_train',
    'batch_ratio': '1.0',
    'total_data_usage_ratio': 1.0,
    'batch_max_length': 34,
    'imgH': 64,
    'imgW': 600,
    'rgb': False,
    'contrast_adjust': False,
    'sensitive': True,
    'PAD': True,
    'data_filtering_off': False,
    'Transformation': 'None',
    'FeatureExtraction': 'VGG',
    'SequenceModeling': 'BiLSTM',
    'Prediction': 'CTC',
    'num_fiducial': 20,
    'input_channel': 1,
    'output_channel': 256,
    'hidden_size': 256,
    'decode': 'greedy',
    'new_prediction': False,
    'freeze_FeatureFxtraction': False,
    'freeze_SequenceModeling': False
}

config_dir = 'trainer/config_files'
os.makedirs(config_dir, exist_ok=True)

with open(os.path.join(config_dir, 'ko_config.yaml'), 'w', encoding='utf-8') as f:
    yaml.dump(config, f, allow_unicode=True, default_flow_style=False, sort_keys=False)

print('Successfully created trainer/config_files/ko_config.yaml')

 

3단계: 훈련 실행 스크립트 작성
 trainer/train.py 스크립트는 직접 실행되는 방식이 아니라, 설정 객체를 받아 실행되도록 설계되어 있습니다. `trainer.ipynb` 노트북 파일을 참고하여, YAML 설정 파일을 읽고 `train` 함수를 호출하는 `run_korean_train.py` 래퍼(wrapper) 스크립트를 작성

trainer/run_korean_train.py

❯ cat run_korean_train.py

import os
import torch.backends.cudnn as cudnn
import yaml
from train import train # train.py 파일의 train 함수 임포트
from utils import AttrDict # utils.py 파일의 AttrDict 클래스 임포트

def get_config(file_path):
    with open(file_path, 'r', encoding="utf8") as stream:
        opt = yaml.safe_load(stream)
    opt = AttrDict(opt)

    # opt.character 설정 로직 (ko_config.yaml에서 이미 character가 정의되어 있으므로 필요 없음)
    # 이 부분은 ko_config.yaml에서 직접 정의되었으므로 주석 처리하거나 제거할 수 있습니다.
    # if opt.lang_char == 'None':
    #     characters = ''
    #     for data in opt['select_data'].split('-'):
    #         csv_path = os.path.join(opt['train_data'], data, 'labels.csv')
    #         df = pd.read_csv(csv_path, sep='^([^,]+),', engine='python', usecols=['filename', 'words'], keep_default_na=False)
    #         all_char = ''.join(df['words'])
    #         characters += ''.join(set(all_char))
    #     characters = sorted(set(characters))
    #     opt.character= ''.join(characters)
    # else:
    #     opt.character = opt.number + opt.symbol + opt.lang_char

    os.makedirs(f'./saved_models/{opt.experiment_name}', exist_ok=True)
    return opt

if __name__ == '__main__':
    cudnn.benchmark = True
    cudnn.deterministic = False

    # 사용할 YAML 설정 파일 경로 지정
    config_file_path = 'config_files/ko_config.yaml'

    opt = get_config(config_file_path)

    # 훈련 시작
    train(opt, amp=False) # amp=True로 설정하여 혼합 정밀도 훈련을 활성화할 수도 있습니다.

 

 

 

** colab 실행시 수정 내용들. **

---------------------------
1. trainer/dataset.py 
---------------------------
13 - from torch._utils import _accumulate
13 + from itertools import accumulate

69 -                for offset, length in zip(_accumulate(dataset_split), dataset_split)]
69 +                for offset, length in zip(accumulate(dataset_split), dataset_split)]

101 -         image, text = data_loader_iter.next() 
101 +         image, text = data_loader_iter.__next__() 

106 -     image, text = self.dataloader_iter_list[i].next() 
106 +     image, text = self.dataloader_iter_list[i].__next__() 


---------------------------
2. ./saved_models/ 디렉토리에 korean_g2.pth 파일을 저장.
---------------------------

---------------------------
3. config_files/ko_config.yaml
---------------------------
2 - train_data: all_data
2 + train_data: /content/EasyOCR/trainer/all_data 
3 - valid_data: all_data/ko_val  
3 + valid_data: /content/EasyOCR/trainer/all_data/ko_val

9 - saved_model: korean_g2.pth 
9 + saved_model: /content/EasyOCR/trainer/saved_models/korean_g2.pth

// 사전 훈련된 모델을 로드할 때 Prediction 레이어가 올바르게 다시 초기화되도록 config_files/ko_config.yaml 파일을 수정하여 new_prediction: true
38 - new_prediction: false 
38 + new_prediction: true 

---------------------------
4. trainer/test.py
---------------------------
43 - cost = criterion(preds.log_softmax(2).permute(1, 0, 2), text_for_loss, preds_size, length_for_loss)
43 + cost = criterion(preds.log_softmax(2).permute(1, 0, 2), text_for_loss.to(device), preds_size.to(device), length_for_loss.to(device)) 

---------------------------
5. all_data/ko_val/labels.csv
---------------------------
114 - 1510.png,한글한글한 <-- 삭제.
  
---------------------------
6. trainer/run_korean_train.py
---------------------------
35 - config_file_path = 'config_files/ko_config.yaml'  
35 + config_file_path = '/content/EasyOCR/trainer/config_files/ko_config.yaml'




4단계: Google Colab에서 실행
지금까지 작업한 파일들을 구글드라이브에 업로드.

colab 접속 후.

from google.colab import drive
drive.mount('/content/drive')
!cp -r /content/drive/MyDrive/EasyOCR /content/
# 1. Colab에서 실행할 경우의 예시 셀
%cd /content/EasyOCR  # 프로젝트 디렉토리로 이동

# 2. 필요한 패키지 설치 
!pip install -r requirements.txt
!pip install natsort
!pip install ninja pyyaml

# 3. 훈련 스크립트 실행
!python3 /content/EasyOCR/trainer/run_korean_train.py

 

 

좀 더 많은 트레이닝 수정.

/EasyOCR/ko_config.yaml

experiment_name: korean_g2_finetune_1118
...
batch_size: 60
num_iter: 10000
valInterval: 500

-->
colab GPU RAM
batch_size 60에서 GPU_RAM 2G
batch_size 512에서 GPU_RAM을 14.6/15.0 GB 
batch_size 320에서도 12.5/15.0 GB

 

 

트레이닝 후 나온 파일들

cd /EasyOCR/trainer/saved_models
ls 
korean_g2.pth
korean_g2_finetune

cd korean_g2_finetune
ls
best_accuracy.pth
best_norm_ED.pth
log_dataset.txt
log_train.txt
opt.txt

 

 

 

한글 상용 2350자 (자주 쓰이는 글자"만 모아둔 표준(KS X 1001)) - 모든 한글 글자 수는 11,172자

korean_common = "가각간갇갈갉갊감갑값갓갔강갖갗같갚갛개객갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸겍검겁것겄겅겆겉겊겋게겐겔겜겝겟겠겡겨격겪견겯결겸겹겻겼경곁계곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆괌괍괏광괘괜괠괩괬괭괴괵괸괼굄굅굇굉교굑굔굘굠굡굣구국군굳굴굵굶굻굼굽굿궁궂궈궉권궐궜궝궤궷귀귁귄귈귐귑귓규균귤그극근귿글긁금급긋긍기긱긴긷길김깁깃깅깊까깍깎깐깔깖깜깝깟깠깡깥깨깩깬깰깸깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌껍껏껐껑께껙껜껨껫껭껴껸껼꼇꼈꼍계꼲꼬꼭꼰곧골꼼꼽꼿꽁꽂꽃꽈꽉꽐꽜꽝꽤꽥꽹꾀꾄꾈꾐꾑꾕꾸꾹꾼꿀꿇꿈꿉꿋꿍꿎꿔꿜꿨꿩꿰꿱꿴꿸뀀뀁뀄뀌뀐뀔뀜뀝뀨끄끅끈끊끌끎끓끔끕끗끙끝끼끽낀낄낌낍낏낑나낙낚난낟날낡낢남납낫났낭낮낯낱낳내낵낸낼냄냅냇냈냉냐냑냔냘냠냥너넉넋넌널넒넓넘넙넛넜넝넣네넥넨넬넴넵넷넸넹녀녁년녈념녑녔녕녘녜녠노녹논놀놂놈놉놋농높놓놔놘놜놨뇌뇐뇔뇜뇝뇟뇨뇩뇬뇰뇹뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉느늑는늘늙늚늠늡늣능늦늪늬늰늴니닉닌닐닒님닙닛닝닢다닥닦단닫달닭닮닯닳담답닷닸당닺닻닿대댁댄댈댐댑댓댔댕댜더덕덖던덛덜덞덟덤덥덧덩덫덮데덱덴델뎀뎁뎃뎄뎅뎌뎐뎔뎠뎡뎨뎬도독돈돋돌돎돐돔돕돗동돛돝돠돤돨돼됐되된될됨됩됫됴두둑둔둘둠둡둣둥둬뒀뒈뒝뒤뒨뒬뒵뒷뒹듀듄듈듐드득든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩잊자작잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀쟁쟈쟉쟌쟎쟐쟘쟝저적전절젊점접젓정젖제젝젠젤젬젭젯젱져젼졀졈졉졌졍졔조족존졸좀좁종좆좇좋좌좍좔좝좨좼죄죈죌죔죕죗죵주죽준줄줅줆줌줍줏중줘줬줴쥐쥑쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌즐즘즙즛증지직진짇질짊짐집짓징짖짙짚짜짝짠짢짤짧짬짭짯짰짱째짹짼쨀쨈쨉쨋쨌쨍쨔쨘쨩쩌쩍쩐쩔쩜쩝쩟쩠쩡쩨쩽껴쩬쪄쪈쪌쪠쪼쪽쫀쫄쫌쫍쫏쫑쫓쫘쫙쫠쫬쫴쬈쬐쬔쬘쬠쬡쭁쭈쭉쭌쭐쭘쭙쭝쭤줬쭤쮜쮸쯔쯤쯧쯩찌찍찐찔찜찝찡찢찧차착찬찮찰참찹찻찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰창채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉쳐쳔쳤쳬쳰초촉촌촐촘촙촛총촤촨촬촹최쵠쵤쵬쵭쵯쵸추축춘출춤춥춧충춰췄췌취췬췰췸췹췻츄츈츌츔츠측츤츨츰츱츳층치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉캐캑캔캘캠캡캣캥캬캭컁커컥컨컫컬컴컵컷컸컹케켁켄켈켐켑켓켕켜켠켤켬켭켯켰켱코콕콘콜콤콥콧콩콰콱콴콸꽹쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼큄큅큇큐큔큘큠크큭큰클큼큽킁키킥킨킬킴킵킷킹타탁탄탈탉탐탑탓탔탕태택탠탤탬탭탯탰탱탸턍터턱턴털턺텀텁텃텄텅테텍텐텔템텝텟텡텨텬텼톄토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툐투툭툰툴툼툽툿퉁퉈퉜퉤튀튁튄튈튐튑튕튜튠튤튬트특튼튿틀틂틈틉틋틔틘틜틤틥티틱틴틸팀팁팃팅파팍팎판팔팖팜팝팟팠팡팥패팩팬팰팸팹팻팼팽퍄퍅퍼퍽펀펄펌펍펏펐펑페펙펜펠펨펩펫펭펴편펼폄폅폈평폐폘포폭폰폴폼폽폿퐁퐈퐝푀퐬표푸푹푼풀풂품풉풋풍풔풩퓌퓐퓔퓜퓟퓨퓰퓸프픈플픔픕픗피픽핀필핌핍핏핑하학한할핥함합핫항해핵핸핼햄햅햇했행햐향허헉헌헐헒험헙헛헝헤헥헨헬헴헵헷헹혀혁현혈혐협혓혔형혜혠혤혭호혹혼홀홅홈홉홋홍홑화확환활홧황홰홱홴횃횅회획횐횔횝횟횡효횬횰횹휴흉흐흑흔흘흙흠흡흖희흰흴흼흽힁히힉힌힐힘힙힛힝"
numbers = "0123456789"
symbols = "!\"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ " # 공백 포함

full_character_list = numbers + symbols + korean_common

 

이미지에 있어야 되는 글자 ( 이 글자만 넣는것이 정확도 상승)

my_chars = " !&-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefgilmnostu가각간갇갈감갑값강갖같개객거건걷걸검겁것게겨격견결겸겹경계고곡곤곧골곰곱곳공과곽관괄광괘괜괴교구국군굳굴굵굶굽궁권궐귀규균그극근글금급기긴길김깊까깎깐깔깜깨껍께껴꼬꼭꽃꽈꽝꽤꾀꾸꿀꿈꿔뀌끄끈끌끓끔끝끼나낙낚난날남납낭내너네넥넷녀년념녕노녹논놀놈농높놓뇌뇨누눈눌뉴느는늘늙능늦늬니닉닌닐님다닥닦단닫달닭닮담답당대더덕던덜덤덧덩덮데델도독돈돋돌돔동돼되된될두둔둘둠둥뒤드득든듣들듬듭등디딜따딱때떠떡떨또뚜뚫뚱뛰뜨뜩뜯뜰라락란랄람랍랑래랙랜램랩랫러럭런럼럽렁레렉렌렐렘려력련렬렴령례로록론롤롬롭롯데료루룩룰룸룹류륙률륭르른름리릭린림링마막만많만말맑맘맛망맞맡매맥맨맵맺머먹먼멀멈멋멍메멘멜멧며면명모목몰몸몽무묵문묻물뭄뭇뭐미민믿밀밋밑바박반받발밝밤밥방밭배백뱀버번벌범법벗베벤벨벼벽변별병보복본볼봄봉부북분불붐붕붙뷰브블비빌빗빙빠빨빵뿌쁘사삭산살삶삼상새색샌샘생서석섞선설섬섭성세소속손솔솜송쇄쇠쇼수숙순술숨숭슈스슬슴습승시식신실싫심십싱싸싹써쏘쓰씨아악안앉않알앓암압앗앙앞애액야약양얗어억언얹얼엄업없엇엉에엑엔엘엠여역엮연열염엽영예오옥온올옮옷옹와완왕왜외요욕용우욱운울움웃웅워원월웨위유육윤율으은을음응의이익인일읽잃임입잇있잊자작잔잖잘잠잡장잦재쟁저적전절젊점접정젖제조족존졸좀좁종좋좌죄주죽준줄중쥐즈즉즐즘증지직진질짐집짓징짜짝째쪼쪽쭈찌찍차착찬찮찰참창찾채책처척천철첨청체초촉촌총촬최추축춘출춤충취츠측층치칙친칠침칩칭카칸칼캄캐캔캠커컨컬컴컵컷케코콕콘콜콤콩쾌쿠쿨쿵퀄퀴크큰클큼키킬타탁탄탈탐탑탕태택탤터턱털텀테텍텔템토톤톨톱통퇴투퉁튀튜트특튼틀틈티틱틴팀팁파팍판팔패팩팬퍼페펴편평포폭폴폼표푸푹풀품풍퓨프플피필핏핑하학한할함합항해핵핸햄햇행향허헌헤헬혀혁현혈혐협형혜호혹혼홀홈홍화확환활황회획효후훈훌훔휘휴흉흐흑흔흘흙흡흥흩희흰히힘"

글자 수: 약 640개

 

'AI > easyOCR' 카테고리의 다른 글

4. EasyOCR github  (1) 2025.11.15
3. EasyOCR 옵션.  (1) 2025.11.15
2. EasyOCR 단점.  (0) 2025.11.15
1. EasyOCR 시작하기.  (0) 2025.11.15
colab + easyocr  (0) 2025.11.08