はじめに
機械学習がもてはやされるので、試しにtensorflowを使って物体検出(Object Detection)をしてみたら、思いのほか簡単にできてしまったので、その記録。
やるべきこと
今回は、ローカルのマシンでやっってみたのだが、下記の感じでできた。
- python3とライブラリの導入
- トレーニングデータの作成
- ベースとなるモデルの取得
- トレーニングの設定
- トレーニングの実行
結果
こんな感じに、ものを検出できます。
詳細
python3とライブラリの導入
CentOS7にはpython3が入っていないのでPython3を入れるところから始めよう。
sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm
sudo yum install -y python36 python36-libs python36-devel python36-pip
ライブラリは次のものがあればよい。
pip3 install tensorflow
pip3 install pandas
pip3 install pillow
pip3 install Cython
pip3 install matplotlib
トレーニングデータの準備
下記のツールを使ってせっせとラベルづけします。
labelImg
モデルの生成
下記のリポジトリからモデルをcloneします。
git clone https://github.com/tensorflow/models.git
また、このチュートリアルにあるツールをもらってきます。
git clone https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10.git
generate_tfrecord.pyとxml_to_csv.py
モデル取得
今回はssd_mobilenet_v2_cocoを使用します。
wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v2_coco_2018_03_29.tar.gz
学習データの振り分け
学習データをトレーニング用とテスト用に分けます。例えば、images/testとimages/trainに分けます。
tfrecordの作成
チュートリアルのツールを使ってtfrecordを作成します。まずはcsvを作成してから、tfrecordを作成するという流れになります。ただし、tfrecord生成ツール(generate_tfrecord.py)はチュートリアル用に作成されているので、一部改変が必要です。具体的にはclass_text_to_int:の部分を検出したいものに変更する必要があります。
python36 xml_to_csv.py
python36 generate_tfrecord.py --csv_input=images/train_labels.csv --image_dir=images/train --output_path=train.record
python36 generate_tfrecord.py --csv_input=images/test_labels.csv --image_dir=images/test --output_path=test.record
学習の設定
トレーニングの設定をします。設定ファイルはtrainingフォルダに置くことにします。
ひな形のconfigをコピーして編集してください。labelmap.pbtxtはtfrecordに記載した情報に合わせて記載してください。
学習の実行
下記のコマンドでトレーニングを開始します。
python36 ./legacy/train.py --logtostderr --train_dir=log --pipeline_config_path=training/ssd_mobilenet_v2_coco.config
ちなみに、GPUを使わないとめちゃめちゃ時間がかかります。覚悟は必要。
参考、詳細
Tensorflowでライオンとネコを検出する: おおもとの記事です。