TensorFlow ObjectDetection APIでの車のナンバー認識メモ

TensorFlow ObjectDetection APIでの車のナンバー認識メモ

概要

  • TensorFlow ObjectDetection API(以下ObjDetectAPI)を用いて、車の画像から、ナンバー位置を推定してみる
    • 学習に使用した画像:50枚(普通車/軽自動車織り交ぜ)
    • ssd_mobilenet_v1_cocoを転移学習させる
    • 結果としては、まあまあうまく推定できていそう
  • Google Colaboratory上で、学習および推論を実行する
  • 得られた知見やポイントなどを、メモとして残しておく

環境

  • Google Colaboratory
  • TensorFlow 1.15(ObjDetectAPIが2.*系には未対応のため)
  • TensorFlow ObjectDetection API(2020/6/8に取得)
  • VoTT ver2.1.0

方法とポイント

画像の収集

  • Google画像検索より、画像を収集
  • 普通車(白いナンバー)/軽自動車(黄色いナンバー)を織り交ぜて取得
  • 車の向き、色などもばらばらになるように取得
  • 画像フォーマット/サイズはばらばらでOK

ラベリング

  • VoTTでラベリングを実施(ローカルPC)
    • LabelImgよりもインストールが簡単そうだったので利用
    • カテゴリー:1個のみ
    • VoTTはフォルダ移動に弱い(フォルダ移動すると開けなくなる)ことに注意
    • 2台写っているものについては、すべてラベル付けするように注意した
    • ななめに写っているナンバーについては、範囲指定が難しい(このあたりは、精度を突き詰めると課題になるかも)

TFRecord形式へ変換

  • VoTTにて、PascalVOC形式でエクスポート
    • 詳細未検証だが、TFRecord形式にエクスポートすると、学習時にエラーになる?
    • PascalVOC形式(複数のxmlファイル)を、単一のTFRecordファイル(*.record)に変換
      • 変換は、以下を加工して利用
    • ローカルPCで用意したPascalVOC形式のファイルを、GoogleDriveにアップロードし、それをGoogleColabでマウント
      • マウントする際、パスに空白が入るとエラーになるようなので、対策としてシンボリックリンク(!ln -s)をはる

https://github.com/Jwata/sushi_detector_dataset/blob/master/create_tf_record.py

学習

  • models/research/object_detection/model_main.pyを使用して学習
    • エラーが出てしまい、学習できず(詳細未検証)
  • models/research/object_detection/legacy/train.pyを使用して学習
    • 上記と全く同じ環境で、train.pyに変えただけで学習できた
    • とりあえず1500stepくらい
    • TensorBoardで見ても、とりあえず学習が落ち着いてそうだったので、いったん打ち切り

推論グラフへの変換

  • 学習結果(model.ckpt)を、pbファイルへ変換
    • models/research/object_detection/export_inference_graph.pyを利用

推論

  • models/research/object_detection/object_detection_tutorial.ipynbを流用
    • モデルは、以下のようにして読み込み
  • 学習に使用していない画像を用いて、ナンバープレート位置が検出できた
def load_model():
  model_dir = '推論グラフ変換結果のフォルダ'

  model_dir = pathlib.Path(model_dir)/"saved_model"

  model = tf.saved_model.load(str(model_dir))
  model = model.signatures['serving_default']

  return model

detection_model = load_model()