PaddleOCRを使って独自の日本語文字認識モデルを作成する方法を紹介します
学習概要
学習対象モデル
始めに詳細な学習手順の前に、大まかな学習の流れを記載します。
このため、共に独自のモデルを求める場合、文字検出の学習と文字認識の学習が必要となります。
本記事では文字認識の学習を取り扱います。
学習データ
文字認識モデルの学習には学習データが必要となります。
学習データは下記画像のような日本語のテキストが記載された画像が必要となります
この学習データですが、無料で取得できる日本語学習データが非常に少なく
選択肢としては下記の2点ほどかと思われます
これら以外はご自身で学習データを準備される必要があると思われます。
これは様々な写真に日本語のテキストを機械的にプロットし生成された学習データです。
一枚の画像に複数のテキストが記載されています
これは、実際に様々な人が手書きした文字の学習データです。
一枚の画像に一文字のみ記載されています
これらのデータを駆使して先ほどの"東京都"の例のような画像を生成しラベルを付ける必要があります。ラベルは下記の通りです。
なおパスとラベルは"\t"で区切られている必要があります。
/tmp/local/usr/ocr/train_data_1.jpg 東京都
また学習データ作成時にはなるべく一画像に含まれる文字数にばらつきがあることが好ましいです。1文字の画像のみを使ってモデルを学習させると、モデルの文字認識結果は全て1文字となります。これは複数文字を含む画像を入力しても1文字しか文字認識してくれないようになることを意味しています。
この点に注意して学習データの準備が完了すればあとは学習させるのみです。
学習手順
なお、
こちらの記事にてPaddleOCRの導入は完了していることを前提としています
始めに下記ディレクトリのコンフィグファイルを開きます。
PaddleOCR/configs/rec/multi_language/rec_japan_lite_train.yml
Global:
use_gpu: True
epoch_num: 500
log_smooth_window: 20
print_batch_step: 10
save_model_dir: ./output/rec_japan_lite
save_epoch_step: 3
# evaluation is run every 5000 iterations after the 4000th iteration
eval_batch_step: [0, 2000]
# if pretrained_model is saved in static mode, load_static_weights must set to True
cal_metric_during_train: True
pretrained_model:
checkpoints:
save_inference_dir:
use_visualdl: False
infer_img:
# for data or label process
character_dict_path: ppocr/utils/dict/japan_dict.txt
character_type: japan
max_text_length: 25
infer_mode: False
use_space_char: False
Optimizer:
name: Adam
beta1: 0.9
beta2: 0.999
lr:
name: Cosine
learning_rate: 0.001
regularizer:
name: 'L2'
factor: 0.00001
Architecture:
model_type: rec
algorithm: CRNN
Transform:
Backbone:
name: MobileNetV3
scale: 0.5
model_name: small
small_stride: [1, 2, 2, 2]
Neck:
name: SequenceEncoder
encoder_type: rnn
hidden_size: 48
Head:
name: CTCHead
fc_decay: 0.00001
Loss:
name: CTCLoss
PostProcess:
name: CTCLabelDecode
Metric:
name: RecMetric
main_indicator: acc
Train:
dataset:
name: SimpleDataSet
data_dir: ./train_data/
label_file_list: ["./train_data/train_list.txt"]
transforms:
- DecodeImage: # load image
img_mode: BGR
channel_first: False
- RecAug:
- CTCLabelEncode: # Class handling label
- RecResizeImg:
image_shape: [3, 32, 320]
- KeepKeys:
keep_keys: ['image', 'label', 'length'] # dataloader will return list in this order
loader:
shuffle: True
batch_size_per_card: 256
drop_last: True
num_workers: 8
Eval:
dataset:
name: SimpleDataSet
data_dir: ./train_data/
label_file_list: ["./train_data/eval_list.txt"]
transforms:
- DecodeImage: # load image
img_mode: BGR
channel_first: False
- CTCLabelEncode: # Class handling label
- RecResizeImg:
image_shape: [3, 32, 320]
- KeepKeys:
keep_keys: ['image', 'label', 'length'] # dataloader will return list in this order
loader:
shuffle: False
drop_last: False
batch_size_per_card: 256
num_workers: 8
文字認識の学習はこのConfigファイルによって制御します。下記に学習前に確認した方が良い箇所を記載していきます。
eval_batch_step
evaluationを実行するタイミングを定義します
[0, 2000] は、iteration 0以降に、2000
iterationごとにevaluationを行うことを意味しています。
pretrained_model
事前学習済みモデルがある場合にここにパスを指定します
下記のように指定します
pretrained_model: ./tmp/usr/local/pretrain/best_accuracy
checkpoints
学習を途中で止めた場合等に再開する場合に読み込むモデルのパスを指定します
下記のように指定します
checkpoints: ./output/rec_japan_lite/latest
character_dict_path
ここに文字認識を行う文字が格納されたファイルパスを指定します
ここに指定したファイルに含まれていない文字は認識しない点にご注意下さい。
max_text_length
最大認識文字数です。文字認識結果は必ずこの数値以下の文字数となります
Train.dataset.label_file_list
Eval.dataset.label_file_list
前述のラベルが記載されたファイルパスを指定します。
ファイルの中は
/tmp/local/usr/ocr/train_data_1.jpg 東京都
/tmp/local/usr/ocr/train_data_2.jpg 大阪府
のようになっている必要があります。
これらをご自身の環境に設定し
下記の通り/PaddleOCR直下にtrain_jp.shを作成します
GPUの数等はご自身の環境に合わせて設定下さい
python3 -m paddle.distributed.launch --log_dir=./debug/ --gpus '0,1' tools/train.py -c configs/rec/multi_language/rec_japan_lite_train.yml
以上で文字認識の学習が始まります。
0 件のコメント :
コメントを投稿