前回まで
前回はTensorFlowを使って学習させるまでのセットアップからデータの収集と学習に必要なデータの準備を行いました。ここからは学習の工程に入ります。
※私は機械学習については全くの素人です。
おおまかな流れ
- 学習準備
- TensorFlowのセットアップ
- 対象画像を集める
- 画像ごとにラベリング
- TFRecordを作成
- 学習
- モデル学習用のconfigファイルを用意
- 学習
- 学習過程を確認
- 学習モデルの書き出し
- iOS
モデル学習用のconfigファイルを用意
事前に学習してある学習モデルを使って、集めた画像を機械学習させます。使う学習モデルによって認識精度とスピードが異なるようです。こちらのサイトに各モデルを使って学習させた場合の、認識スピードと精度の対応表があります。ただし、 GPUはNvidia GeForce GTX TITAN X card
で測定しているそうです。
上記サイトからssd-mobilenet-v1
をダウンロードしてきて、以下のファイルをtensorflow-stamp-mode/に移動させます。
- model.ckpt.meta
- model.ckpt.index
- model.ckpt.data-00000-of-00001
- pipeline.config
そして、pipeline.configを編集します。基本的にPATH_TO_BE_CONFIGURED
と書いてある箇所です。
# 変更後
num_classes: 3 # ラベル名の数?だと思う
fine_tune_checkpoint: "model.ckpt"
label_map_path: "annotations/label_map.pbtxt"
input_path: "train.record"
label_map_path: "annotations/label_map.pbtxt"
input_path: "val.record"
学習
これで準備が整ったので、いよいよ学習に入ります。modelフォルダに学習過程が保存されていきます。学習を中断させても、もう一度下記のコマンドを叩けば続きから学習するようです。
また、fine_tune_checkpoint
をコメントにすると学習済みのモデルを使用しないで0から学習できるようです。
python object_detection/model_main.py \
--logtostderr \
--model_dir=model \
--pipeline_config_path=pipeline.config
GPUがないため、私の環境で停めたり学習したりを繰り返しながら15638ステップまで到達するのに2日ほどかかりました。。。
学習過程を確認
学習状況を確認するためにtensorboardというツールを使います。
tensorboard --logdir model
http://0.0.0.0:6006/
上記gifで同じ画像が2枚並んでいますが、左側が推論によって検出されたオブジェクトで右側がラベリングしたときのラベル位置になっています。ステップ数が上がるにつれて、検出できるオブジェクト数が増えていっているのが分かります。この左側の画像になにも表示されない場合は、学習不足もしくは特徴量が足りない可能性があります。
学習モデルを書き出し
ある程度の認識精度が出たら、modelフォルダにあるデータを学習モデルとして書き出します。
modelフォルダにある以下のファイルをコピーしてtensorflow-stamp-model/に移動します。
※ 番号はステップ数に応じて変更してください。
- model.ckpt-15752.index
- model.ckpt-15752.meta
- model.ckpt-15752.data-00000-of-00001
python object_detection/export_inference_graph.py \
--input_type image_tensor \
--pipeline_config_path pipeline.config \
--trained_checkpoint_prefix model.ckpt-15752 \
--output_directory output_inference_graph
これでiOSで利用するための学習モデルができました。
次回はこの学習モデルを使ってiOSに組み込むまでを記録します。
動作保証はしませんが、今回のTensorFlowのプロジェクトはGitHubに置いてあります。
また、TensorFlowの学習モデルをiOSに組み込んだプロジェクトはこちらです。ご自由にお使いください。