Skip to content

MIDUBANG/OCR_CRNN

Folders and files

NameName
Last commit message
Last commit date

Latest commit

c11739b Β· Dec 9, 2022

History

15 Commits
Dec 8, 2022
Dec 8, 2022
Dec 8, 2022
Dec 8, 2022
Dec 8, 2022
Dec 8, 2022
Dec 8, 2022
Dec 8, 2022
Dec 8, 2022
Dec 8, 2022
Dec 9, 2022
Dec 8, 2022
Dec 8, 2022
Dec 8, 2022
Dec 8, 2022
Dec 8, 2022
Dec 8, 2022

Repository files navigation

✏️ OCR_CRNN

CRNN 기반의 OCR ν•œκΈ€ λͺ¨λΈ Training

  • CRNN_training.py: ~ λͺ¨λΈ ν•™μŠ΅ 및 λͺ¨λΈ(κ°€μ€‘μΉ˜) μ €μž₯
  • CRNN_train_test.ipynb: ~ λͺ¨λΈ ν•™μŠ΅ 및 λͺ¨λΈ(κ°€μ€‘μΉ˜) μ €μž₯, loss 좔이 κ·Έλž˜ν”„, λͺ¨λΈ test

CRNN_train_test.ipynb λ₯Ό 톡해 μ½”λ“œλ₯Ό κ΅¬μ„±ν•˜μ˜€κ³ ,
μ΅œμ’… λͺ¨λΈ ν•™μŠ΅μ€ CRNN_train_test.ipynb λ₯Ό λ°”νƒ•μœΌλ‘œ ν•œ CRNN_training.py λ₯Ό ν„°λ―Έλ„μ—μ„œ μ‹€ν–‰ν•΄ λ°±κ·ΈλΌμš΄λ“œμ—μ„œλ„ ν•™μŠ΅μ΄ 진행될 수 있게 ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

μ‹€μ œ ν•™μŠ΅μ€ CRNN_training.py μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ 되고,
λͺ¨λΈ 및 μ½”λ“œ ν…ŒμŠ€νŠΈλŠ” CRNN_train_test.ipynb μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ λ©λ‹ˆλ‹€.


λ³Έ READMEλŠ” CRNN_train_test.ipynb κΈ°μ€€μœΌλ‘œ μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.



0. 디렉토리 ꡬ쑰

λ‹€μŒκ³Ό 같은 디렉토리 ꡬ쑰둜 이루어져 μžˆμŠ΅λ‹ˆλ‹€.

OCR_CRNN/
β”œβ”€β”€ printed/
β”‚     β”œβ”€β”€ 03343000.png
β”‚     β”œβ”€β”€ 03343001.png
β”‚     β”‚   ...   
β”‚     └── 03385349.png
β”‚
β”œβ”€β”€ utils/
β”‚     β”œβ”€β”€ bboxes.py
β”‚     β”œβ”€β”€ losses.py
β”‚     β”œβ”€β”€ model.py
β”‚     └── training.py           
β”‚    
β”œβ”€β”€ CRNN_train_test.ipynb
β”œβ”€β”€ CRNN_training.py
β”œβ”€β”€ CRNN_model_2_v1.h5
β”œβ”€β”€ CRNN_model_2_v2.h5
β”œβ”€β”€ CRNN_weights_2_v1.h5
β”œβ”€β”€ CRNN_weights_2_v2.h5
β”œβ”€β”€ crnn_data.py
β”œβ”€β”€ crnn_model.py
β”œβ”€β”€ crnn_utils.py
β”œβ”€β”€ ssd_data.py
β”œβ”€β”€ korean_printed_sentence.json
β”œβ”€β”€ NanumBarunGothic.ttf
└── requirements.txt

1. νŒ¨ν‚€μ§€ μ„€μΉ˜ν•˜κΈ°

$ pip install -r requirements.txt

μœ„ μ»€λ§¨λ“œλ₯Ό μ‹€ν–‰ν•΄ λͺ¨λΈ ν•™μŠ΅μ— ν•„μš”ν•œ νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€. CRNN_train_test.ipynb에 ν•΄λ‹Ή μ½”λ“œκ°€ ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ”°λ‘œ μ‹€ν–‰ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.


2. ν•™μŠ΅ 데이터 ꡬ좕

https://aihub.or.kr/aihubdata/data/view.do?currMenu=115&topMenu=100 image

ν•™μŠ΅ λ°μ΄ν„°λŠ” AI Hub의 'ν•œκ΅­μ–΄ κΈ€μžμ²΄ 이미지' 데이터셋을 μ΄μš©ν–ˆμŠ΅λ‹ˆλ‹€.
ν•΄λ‹Ή 데이터셋은 손글씨, 인쇄체, 싀사 데이터 둜 κ΅¬μ„±λ˜μ–΄ 있고, 이 쀑 인쇄체 λ°μ΄ν„°λŠ” κΈ€μž, 단어, λ¬Έμž₯ λ°μ΄ν„°λ‘œ κ΅¬λΆ„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈμ—μ„œ OCR λͺ¨λΈμ— input으둜 λ“€μ–΄κ°ˆ 데이터가 κ³„μ•½μ„œμ΄κΈ° λ•Œλ¬Έμ—,
ν˜„μž¬κΉŒμ§€ ν•™μŠ΅μ—μ„  인쇄체 데이터 쀑 λ¬Έμž₯ 데이터 40,304개λ₯Ό μ‚¬μš©ν•΄ ν•™μŠ΅μ„ μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.

μΆ”ν›„ ν•™μŠ΅μ€ 인쇄체_λ¬Έμž₯ 데이터에 λŒ€ν•œ Data Augmentation μ΄λ‚˜ 손글씨 데이터, 그리고 κ³„μ•½μ„œ 이미지λ₯Ό λ°”νƒ•μœΌλ‘œ μ „μ²˜λ¦¬λ₯Ό μ§„ν–‰ν•œ custom data λ₯Ό μ΄μš©ν•΄ fine tuning 및 transfer learning을 진행해 λͺ¨λΈμ˜ lossλ₯Ό 더 쀄일 μƒκ°μž…λ‹ˆλ‹€.


3. GTUtility 객체 생성

미리 μ—…λ‘œλ“œ 해놓은 이미지 νŒŒμΌλ“€κ³Ό JSON νŒŒμΌμ„ μ΄μš©ν•΄ GTUtility 객체λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
이미지 κ°œμˆ˜κ°€ λ§Žμ€ 탓에 ν•΄λ‹Ή 셀은 μ•½ 3~4뢄정도 μ†Œμš”λ©λ‹ˆλ‹€.


4. Target Value (라벨) 생성

μƒμ„±λœ GTUtility 객체λ₯Ό μ΄μš©ν•΄ target value(라벨)을 μƒμ„±ν•©λ‹ˆλ‹€.
ν•΄λ‹Ή 과정을 κ°„λž΅ν•˜κ²Œ μ„€λͺ…ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

1) GTUtilityμ—μ„œ text값을 κ°€μ Έμ˜΅λ‹ˆλ‹€.
2) 1)μ—μ„œ κ°€μ Έμ˜¨ text듀을 ν•˜λ‚˜μ˜ 리슀트둜 ν•©μ³μ€λ‹ˆλ‹€.
3) 리슀트 μ•ˆμ˜ λ¬Έμžμ—΄μ„ 문자 λ‹¨μœ„λ‘œ 잘라주고, λ”•μ…”λ„ˆλ¦¬μ— λ„£μ–΄ 쀑볡을 μ œκ±°ν•©λ‹ˆλ‹€.
4) ν•œκΈ€μ΄ μ•„λ‹Œ λ¬ΈμžλŠ” 곡백으둜 λ°”κΏ”μ£Όκ³ , λ‹€μ‹œ 곡백은 μ œκ±°ν•©λ‹ˆλ‹€.
5) 리슀트λ₯Ό λ¬Έμžμ—΄ ν˜•νƒœλ‘œ λ°”κΏ”μ£Όκ³ , κ³„μ•½μ„œμ— 자주 μ‚¬μš©λ˜λŠ” 곡백, 숫자, .,:()[]<>"'_ λ“±μ˜ κΈ°ν˜Έλ“€μ„ λ¬Έμžμ—΄μ— μΆ”κ°€μ‹œμΌœμ€λ‹ˆλ‹€.


5. Dataset Split

gt_util_train, gt_util_val = gt_util.split(0.8)

Train : Validation = 8 : 2 의 λΉ„μœ¨λ‘œ λ‚˜λˆ μ€λ‹ˆλ‹€.
λΉ„μœ¨μ„ λ³€κ²½ν•˜κ³  μ‹ΆμœΌλ©΄ gt_util.split() ν•¨μˆ˜ μ•ˆμ˜ νŒŒλΌλ―Έν„°λ₯Ό μ›ν•˜λŠ” train set λΉ„μœ¨λ‘œ μ„€μ •ν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€.



6. OCR λͺ¨λΈ ν•™μŠ΅


(1) Model의 input parameter μ •μ˜

input_width = 256
input_height = 32
batch_size = 128

input_shape = (input_width, input_height, 1)

input μ΄λ―Έμ§€μ˜ width와 height, 그리고 batch sizeλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.
λ³Έ ν•™μŠ΅μ—μ„œμ˜ input은 λ¬Έμž₯ λ°μ΄ν„°μ˜€κΈ° λ•Œλ¬Έμ— widthλ₯Ό height보닀 크게 μ„€μ •ν•΄μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.
batch sizeλŠ” 본인의 ν•™μŠ΅ ν™˜κ²½μ΄λ‚˜ λͺ¨λΈ μ„±λŠ₯에 따라 λ³€κ²½ν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€


(2) 동결 LayerμΈ΅ μ„€μ •

freeze = ['conv1_1',
          'conv2_1',
          'conv3_1', 'conv3_2', 
          #'conv4_1',
          #'conv5_1',
          #'conv6_1',
          #'lstm1',
          #'lstm2'
         ]

fine tuning을 μœ„ν•΄ 동결할 Layer측을 μ„€μ •ν•΄μ€λ‹ˆλ‹€. 이 λ˜ν•œ λͺ¨λΈ μ„±λŠ₯에 맞게 μ‘°μ ˆν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€.


(3) λͺ¨λΈ μ •μ˜ 및 ν•™μŠ΅ λͺ¨λΈμ˜ versionλͺ… μ •μ˜

model, model_pred = CRNN(input_shape, len(korean_dict))
experiment = 'crnn_korean_test'

μ‹€μ œ ν•™μŠ΅μ—μ„  versionλͺ…은 'crnn_korean_v1', 'crnn_korean_v2' λ“±μœΌλ‘œ λ°”κΏ”κ°€λ©° μ„€μ •ν•΄μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.


(4) InputGenerator 생성

max_string_len = model_pred.output_shape[1]

gen_train = InputGenerator(gt_util_train, batch_size, korean_dict, input_shape[:2], 
                           grayscale=True, max_string_len=max_string_len, concatenate=False)
gen_val = InputGenerator(gt_util_val, batch_size, korean_dict, input_shape[:2], 
                         grayscale=True, max_string_len=max_string_len, concatenate=False)

(5) κ°€μ€‘μΉ˜ loading

model.load_weights('./CRNN_weights_2_v2.h5')

이전에 μ§„ν–‰ν–ˆλ˜ ν•™μŠ΅μ˜ κ°€μ€‘μΉ˜λ₯Ό loadν•΄ transfer learning을 μ§„ν–‰ν•©λ‹ˆλ‹€.
ν•™μŠ΅ 쀑에 μ €μž₯ν•œ κ°€μ€‘μΉ˜λ₯Ό λΆˆλŸ¬μ™€λ„ 되고, λ”°λ‘œ μ €μž₯ν•œ κ°€μ€‘μΉ˜λ₯Ό λΆˆλŸ¬μ™€λ„ λ©λ‹ˆλ‹€.
λ³Έ μ½”λ“œμ—μ„  λ”°λ‘œ μ €μž₯ν•œ κ°€μ€‘μΉ˜λ₯Ό loadν•΄μ™”μŠ΅λ‹ˆλ‹€.


(6) λͺ¨λΈ ν•™μŠ΅ κ³Όμ • μ €μž₯

checkdir = './checkpoints/' + time.strftime('%Y%m%d%H%M') + '_' + experiment
if not os.path.exists(checkdir):
    os.makedirs(checkdir)

with open(checkdir+'/source.py','wb') as f:
    source = ''.join(['# In[%i]\n%s\n\n' % (i, In[i]) for i in range(len(In))])
    f.write(source.encode())

μœ„μ—μ„œ μ„€μ •ν•œ λͺ¨λΈ versionλͺ…을 ν† λŒ€λ‘œ directoryλ₯Ό 생성해 ν•™μŠ΅ 과정을 μ €μž₯ν•©λ‹ˆλ‹€.

λ§Œμ•½ CRNN_train_test.ipynb κ°€ μ•„λ‹Œ CRNN_training.py 둜 ν•™μŠ΅μ„ μ§„ν–‰ν•œλ‹€λ©΄,
ν•˜λ‹¨μ˜ μ½”λ“œ λΈ”λŸ­μ€ μ‚­μ œν•΄μ•Ό ν•©λ‹ˆλ‹€.


(7) Optimizer μ„€μ •

optimizer = SGD(learning_rate=0.0001, decay=1e-6, momentum=0.9, nesterov=True, clipnorm=5)

Optimizerλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.
λ³Έ μ½”λ“œμ—μ„  optimizer둜 SGDλ₯Ό μ‚¬μš©ν–ˆμœΌλ‚˜, ν•„μš”μ— 따라 Adamκ³Ό 같은 λ‹€λ₯Έ λͺ¨λΈλ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
만일 λ‹€λ₯Έ λͺ¨λΈμ„ μ‚¬μš©ν•  경우, λ”°λ‘œ μ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜κ±°λ‚˜ 라이브러리λ₯Ό λ‘œλ“œν•΄μ•Ό ν•©λ‹ˆλ‹€.

learning rateλŠ” 0.001λΆ€ν„° 0.0001κΉŒμ§€ 값을 λ³€κ²½ν•΄κ°€λ©΄μ„œ ν•™μŠ΅μ„ μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.
본인의 상황에 맞게 값을 λ³€κ²½ν•˜λ©΄μ„œ μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.
λ³Έ ν•™μŠ΅μ—μ„  λ”°λ‘œ 값을 λ³€κ²½ν•˜μ§€ μ•Šμ•˜μœΌλ‚˜, ν•„μš”ν•œ 경우 decayλ‚˜ momentum의 값을 λ³€κ²½ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.


(8) (2)μ—μ„œ μ„€μ •ν•œ Layer측의 κ°€μ€‘μΉ˜ 동결

for layer in model.layers:
    layer.trainable = not layer.name in freeze

(9) λͺ¨λΈ Compile

model.compile(loss={'ctc': lambda y_true, y_pred: y_pred}, optimizer=optimizer)

loss λͺ¨λΈλ‘œλŠ” ctc lossλ₯Ό μ‚¬μš©ν•˜μ˜€μœΌλ‚˜, 이 λ˜ν•œ λ³€κ²½ κ°€λŠ₯ν•©λ‹ˆλ‹€.


(10) λͺ¨λΈ ν•™μŠ΅

from keras.callbacks import ModelCheckpoint, EarlyStopping

hist = model.fit(gen_train.generate(), 
                steps_per_epoch=gt_util_train.num_objects // batch_size,
                epochs=1000,
                validation_data=gen_val.generate(), 
                validation_steps=gt_util_val.num_objects // batch_size,
                callbacks=[
             ModelCheckpoint(checkdir+'/weights.{epoch:03d}.h5', verbose=1, save_weights_only=True),
             #ModelSnapshot(checkdir, 100),
             Logger(checkdir),
            EarlyStopping(monitor='val_loss', mode='auto', restore_best_weights=True, verbose=1, patience=20)
          ],
          initial_epoch=0)

λͺ¨λΈ ν•™μŠ΅μ„ μ§„ν–‰ν•©λ‹ˆλ‹€.
epochs 값을 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
callback ν•¨μˆ˜λ“€ λ˜ν•œ μ„€μ •ν•΄μ£Όμ—ˆλŠ”λ°,
ModelCheckpoint ν•¨μˆ˜λ₯Ό 톡해 ν•˜λ‚˜μ˜ epochκ°€ 끝날 λ•Œλ§ˆλ‹€ ν•΄λ‹Ή epoch의 λͺ¨λΈμ˜ κ°€μ€‘μΉ˜λ₯Ό μ €μž₯ν•΄μ£Όμ—ˆκ³ ,
EarlyStopping ν•¨μˆ˜λ₯Ό 톡해 20 epochs λ™μ•ˆ validation lossκ°€ κ°μ†Œν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ 더이상 ν•™μŠ΅μ„ 진행할 ν•„μš”κ°€ μ—†λ‹€κ³  νŒλ‹¨ν•΄ ν•™μŠ΅μ„ μ€‘λ‹¨ν•˜λ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.


ν•΄λ‹Ή μ…€ ꡬ동 μ‹œ,

'[ WARN:6@537.712] global /io/opencv/modules/imgcodecs/src/loadsave.cpp (239) findDecoder imread_('./printed/03384889.png'): can't open/read file: check file path/integrity'


와 같은 warning meassageκ°€ λœ¨λŠ”λ°,
μ΄λŠ” JSON νŒŒμΌμ—μ„œ λ¬Έμž₯ 데이터가 μ•„λ‹Œ λ‹€λ₯Έ 이미지 데이터듀에 λŒ€ν•œ 정보가 μ œκ±°λ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— λœ¨λŠ” λ©”μ„Έμ§€λ‘œ, λ¬΄μ‹œν•˜λ©΄ λ©λ‹ˆλ‹€.
JSON νŒŒμΌμ— λŒ€ν•œ μž‘μ—…μ„ μ§„ν–‰ν–ˆμœΌλ‚˜ μ™„λ²½ν•˜κ²Œ μ •λ¦¬λ˜μ§€ μ•Šμ•„ μΆ”ν›„ 이 뢀뢄을 보완할 μƒκ°μž…λ‹ˆλ‹€.

7. ν•™μŠ΅ κ²°κ³Ό 확인


Loss graph 확인

loss = hist.history['loss']
val_loss = hist.history['val_loss']

epochs = range(len(loss))
plt.figure(figsize=(15,10))
plt.plot(epochs, loss, 'r', label='Training loss')
plt.plot(epochs, val_loss, 'b',label='Validation loss')
plt.title('Training and validation loss')
plt.legend()

plt.show()

ν•΄λ‹Ή μ½”λ“œλ₯Ό 톡해 epoch에 λ”°λ₯Έ lossκ°’μ˜ 좔이λ₯Ό 확인할 수 μžˆλ‹€.


8. ν•™μŠ΅ λͺ¨λΈ μ €μž₯


## (1) Model μ €μž₯ ```python model.save('CRNN_model_test.h5') ``` ν•™μŠ΅ν•œ model 자체λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. νŒŒλΌλ―Έν„°μ—λŠ” λͺ¨λΈμ΄ μ €μž₯될 κ²½λ‘œμ™€ 파일λͺ…을 μ„€μ •ν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€.
## (2) Weight μ €μž₯ ```python model.save_weights('CRNN_weights_test.h5') ``` ν•™μŠ΅ν•œ model의 weight(κ°€μ€‘μΉ˜)λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. 이 λ˜ν•œ νŒŒλΌλ―Έν„°μ—λŠ” κ°€μ€‘μΉ˜κ°€ μ €μž₯될 κ²½λ‘œμ™€ 파일λͺ…을 μ„€μ •ν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€.

9. ν•™μŠ΅ λͺ¨λΈ Test


(1) ν•œκΈ€ μ„€μ •

import matplotlib as mpl

# μœ λ‹ˆμ½”λ“œ κΉ¨μ§ν˜„μƒ ν•΄κ²°
mpl.rcParams['axes.unicode_minus'] = False

# λ‚˜λˆ”κ³ λ”• 폰트 적용
plt.rcParams["font.family"] = 'NanumGothic'

model 적용 κ²°κ³Όκ°€ ν•œκΈ€μ΄κΈ° λ•Œλ¬Έμ— μœ λ‹ˆμ½”λ“œ 깨짐 ν˜„μƒμ„ ν•΄κ²°ν•˜μ˜€κ³ ,
ν•™μŠ΅ ν™˜κ²½μ— 따라 ν°νŠΈκ°€ κΉ¨μ Έμ„œ λ‚˜μ˜€κΈ°λ„ ν•΄ λ”°λ‘œ 폰트λ₯Ό μ μš©ν•΄μ£Όμ—ˆλ‹€.


(2) 데이터 test

g = gen_val.generate()
d = next(g)

res = model_pred.predict(d[0]['image_input'])

mean_ed = 0
mean_ed_norm = 0

plot_name = 'crnn_korean'

for i in range(32):
    chars = [alphabet[c] for c in np.argmax(res[i], axis=1)]
    gt_str = d[0]['source_str'][i]
    res_str = decode(chars)
    
    ed = editdistance.eval(gt_str, res_str)
    ed_norm = ed / len(gt_str)
    mean_ed += ed
    mean_ed_norm += ed_norm
    
    img = d[0]['image_input'][i][:,:,0].T
    plt.figure(figsize=[10,1.03])
    plt.imshow(img, cmap='gray', interpolation=None)
    ax = plt.gca()
    #plt.text(0, 45, '%s' % (''.join(chars)) )
    plt.text(0, 60, 'GT: %-24s RT: %-24s %0.2f' % (gt_str, res_str, ed_norm))
    
    plt.show()

λ³Έ μ½”λ“œμ—μ„  ν•™μŠ΅μ— μ‚¬μš©ν•˜μ§€ μ•Šμ€ validation setμ—μ„œ 이미지 데이터λ₯Ό 가져와 testλ₯Ό μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.
μΆ”ν›„ validation set에 μ—†λŠ” custom data λ˜ν•œ μ μš©ν•΄ κ²°κ³Όλ₯Ό 확인할 수 μžˆλ„λ‘ μ½”λ“œλ₯Ό μž‘μ„±ν•  κ³„νšμž…λ‹ˆλ‹€.


10. μ΅œμ’… 디렉토리 ꡬ쑰

ν•™μŠ΅ ν›„μ—λŠ” 디렉토리가 λ‹€μŒκ³Ό 같이 ν˜•μ‹μœΌλ‘œ λ³€κ²½λ©λ‹ˆλ‹€.

OCR_CRNN/
β”œβ”€β”€ checkpoints/
β”‚     β”œβ”€β”€ 202211302056_crnn_korean_v1
β”‚     β”‚     β”œβ”€β”€ history.csv
β”‚     β”‚     β”œβ”€β”€ log.csv
β”‚     β”‚     β”œβ”€β”€ weights.001.h5
β”‚     β”‚     β”œβ”€β”€ weights.002.h5
β”‚     β”‚     β”œβ”€β”€ ...
β”‚     β”‚     └── weights.227.h5
β”‚     β”œβ”€β”€ 202212011003_crnn_korean_v2
β”‚     β”‚     β”œβ”€β”€ history.csv
β”‚     β”‚     β”œβ”€β”€ log.csv
β”‚     β”‚     β”œβ”€β”€ weights.001.h5
β”‚     β”‚     β”œβ”€β”€ weights.002.h5
β”‚     β”‚     β”œβ”€β”€ ...
β”‚     β”‚     └── weights.037.h5
β”‚     β”œβ”€β”€ ...
β”‚     └── 202212061250_crnn_korean_2_v1
β”‚           β”œβ”€β”€ history.csv
β”‚           β”œβ”€β”€ log.csv
β”‚           β”œβ”€β”€ weights.001.h5
β”‚           β”œβ”€β”€ weights.002.h5
β”‚           β”œβ”€β”€ ...
β”‚           └── weights.524.h5
β”‚
β”œβ”€β”€ printed/
β”‚     β”œβ”€β”€ 03343000.png
β”‚     β”œβ”€β”€ 03343001.png
β”‚     β”‚   ...   
β”‚     └── 03385349.png
β”‚
β”œβ”€β”€ utils/
β”‚     β”œβ”€β”€ bboxes.py
β”‚     β”œβ”€β”€ losses.py
β”‚     β”œβ”€β”€ model.py
β”‚     └── training.py           
β”‚    
β”œβ”€β”€ CRNN_train_test.ipynb
β”œβ”€β”€ CRNN_training.py
β”œβ”€β”€ CRNN_model_2_v1.h5
β”œβ”€β”€ CRNN_model_2_v2.h5
β”œβ”€β”€ CRNN_model_test.h5
β”œβ”€β”€ CRNN_weights_2_v1.h5
β”œβ”€β”€ CRNN_weights_2_v2.h5
β”œβ”€β”€ CRNN_weights_test.h5
β”œβ”€β”€ crnn_data.py
β”œβ”€β”€ crnn_model.py
β”œβ”€β”€ crnn_utils.py
β”œβ”€β”€ ssd_data.py
β”œβ”€β”€ korean_printed_sentence.json
β”œβ”€β”€ NanumBarunGothic.ttf
└── requirements.txt



Reference

https://github.com/mvoelk/ssd_detectors

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published