[AIOCR]PaddleOCRで日本語文字認識モデルを作る

2021年7月1日木曜日

Artificial Intelligence

PaddleOCRを使って独自の日本語文字認識モデルを作成する方法を紹介します

学習概要

学習対象モデル


始めに詳細な学習手順の前に、大まかな学習の流れを記載します。
PaddleOCRは2 stage modelと言われる構成のため文字検出と文字認識を別々のモデルで実現します。
このため、共に独自のモデルを求める場合、文字検出の学習と文字認識の学習が必要となります。
本記事では文字認識の学習を取り扱います。


学習データ

文字認識モデルの学習には学習データが必要となります。
学習データは下記画像のような日本語のテキストが記載された画像が必要となります

学習画像サンプル

この学習データですが、無料で取得できる日本語学習データが非常に少なく
選択肢としては下記の2点ほどかと思われます
これら以外はご自身で学習データを準備される必要があると思われます。


これは様々な写真に日本語のテキストを機械的にプロットし生成された学習データです。
一枚の画像に複数のテキストが記載されています


これは、実際に様々な人が手書きした文字の学習データです。
一枚の画像に一文字のみ記載されています

これらのデータを駆使して先ほどの"東京都"の例のような画像を生成しラベルを付ける必要があります。ラベルは下記の通りです。
なおパスとラベルは"\t"で区切られている必要があります。

 /tmp/local/usr/ocr/train_data_1.jpg	東京都

また学習データ作成時にはなるべく一画像に含まれる文字数にばらつきがあることが好ましいです。1文字の画像のみを使ってモデルを学習させると、モデルの文字認識結果は全て1文字となります。これは複数文字を含む画像を入力しても1文字しか文字認識してくれないようになることを意味しています。

この点に注意して学習データの準備が完了すればあとは学習させるのみです。

学習手順

ここからは実際のPaddleOCRのソースコードを見ながら手順を記載します
なお、こちらの記事にて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

以上で文字認識の学習が始まります。

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology