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形式でエクスポート
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()