TensorFlow/Object Detection APIをローカルで使ってみた

TensorFlow/Object Detection APIのチュートリアルをローカル環境でやってみた。クラウド環境は別の機会に。
※学習開始まで
>https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_pets.md

#1. 環境構築
##1-1. python3.7の仮想環境を作成する  

```
conda create -n py37 python=3.7
```  
作成した環境をアクティベートし、pythonのバージョンを確認する。3.7になっていればOK

```
conda activate py37
python -V
```

##1-2. TensorFlowをインストールする

```
pip install tensorflow==1.15.0rc3
```
※Object Detection APIはTensorFlow2系に対応していないので1系を導入する。
依存関係のライブラリーをインストール。

```
pip install --user Cython
pip install --user contextlib2
pip install --user pillow
pip install --user lxml
pip install --user jupyter
pip install --user matplotlib
```

###1-3. Object Detection APIを使用するための準備
tensorflow/modelsのクローン

```
# From root directory
mkdir tensorflow
cd tensorflow
git clone git@github.com:tensorflow/models.git
```

COCO APIのインストール

```
git clone https://github.com/cocodataset/cocoapi.git
cd cocoapi/PythonAPI
make
cp -r pycocotools ~/tensorflow/models/research/
```
※tensorflow/models/research/にpycocotoolsが存在することを確認する。
Protobufのコンパイル
protocがインストールされているかの確認

```
protoc --version
```
なければ下記でインストールする

```
brew install protoc
```

```
# From tensorflow/models/research/
protoc object_detection/protos/*.proto --python_out=.
```
PYTHONPATHの追加

```
# From tensorflow/models/research/
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
```

インストールの確認

```
# From tensorflow/models/research/
python object_detection/builders/model_builder_test.py
...
[       OK ] ModelBuilderTest.test_unknown_ssd_feature_extractor
----------------------------------------------------------------------
Ran 17 tests in 0.195s

OK (skipped=1)
```
となればインストールの完了。

#2. 機械学習を行う（ローカル）
tensorflow/models/researchにpetsディレクトリーを作成する。

```
# From tensorflow/models/research/
mkdir pets
```

##2-1. データセットの準備
データセットのダウンロード

```
# From tensorflow/models/research/
wget http://www.robots.ox.ac.uk/~vgg/data/pets/data/images.tar.gz
wget http://www.robots.ox.ac.uk/~vgg/data/pets/data/annotations.tar.gz
tar -xvf images.tar.gz
tar -xvf annotations.tar.gz
```
imagesとannotationsのディレクトリーが存在することを確認する。

TFRecordの作成

```
# From tensorflow/models/research/
python object_detection/dataset_tools/create_pet_tf_record.py \
    --label_map_path=object_detection/data/pet_label_map.pbtxt \
    --data_dir=`pwd` \
    --output_dir=`pwd`
```
pet_faces_trainとpet_faces_valのファイルが10個ずつ生成されていることを確認する。
生成されたTFRecordをコピー

```
# From tensorflow/models/research/
cp pet_faces_train.record-* pets
cp pet_faces_val.record-* pets
```

ラベルマップをコピー

```
# From tensorflow/models/research/
cp object_detection/data/pet_label_map.pbtxt pets
```

##2-2. 事前学習モデルを準備
COCOの事前学習モデルをダウンロードし、中身を移動させる

```
# From tensorflow/models/research/pets
wget http://storage.googleapis.com/download.tensorflow.org/models/object_detection/faster_rcnn_resnet101_coco_11_06_2017.tar.gz
tar -xvf faster_rcnn_resnet101_coco_11_06_2017.tar.gz
cp faster_rcnn_resnet101_coco_11_06_2017/frozen_inference_graph.pb ~/tensorflow/models/research/pets
cp faster_rcnn_resnet101_coco_11_06_2017/graph.pbtxt ~/tensorflow/models/research/pets
cp faster_rcnn_resnet101_coco_11_06_2017/model.ckpt.* ~/tensorflow/models/research/pets
```

##2-3. Configファイルの準備
Configファイルの修正

```
# From tensorflow/models/research
cp object_detection/samples/configs/faster_rcnn_resnet101_pets.config pets
sed -i "" "s|PATH_TO_BE_CONFIGURED|pets|g" pets/faster_rcnn_resnet101_pets.config
```

Petsディレクトリに下記のファイルがあればOK

```
faster_rcnn_resnet101_pets.config
frozen_inference_graph.pb
graph.pbtxt
model.ckpt.data-00000-of-00001
model.ckpt.index
model.ckpt.meta
pet_faces_train.*
pet_faces_val.*
pet_label_map.pbtxt
```

##2-4. トレーニングを開始する

```
# From tensorflow/models/research/
 
PIPELINE_CONFIG_PATH=pets/faster_rcnn_resnet101_pets.config
MODEL_DIR=pets
NUM_TRAIN_STEPS=50000
NUM_EVAL_STEPS=2000
time python object_detection/model_main.py \
    --pipeline_config_path=${PIPELINE_CONFIG_PATH} \
    --model_dir=${MODEL_DIR} \
    --num_train_steps=${NUM_TRAIN_STEPS} \
    --num_eval_steps=${NUM_EVAL_STEPS} \
    --alsologtostderr
```

参考URL
>https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_pets.md
>https://www.petitmonte.com/python/running_pets.html
>https://qiita.com/IchiLab/items/fd99bcd92670607f8f9b