TensorFlow Model Garden 環境構築 備忘録

# 概要
Object detectionのtransfer learningを試したくて、まず環境構築を行った。

最初は下記サイトのとおり行ったがProtoBuf関連でうまく行かず、

https://neptune.ai/blog/how-to-train-your-own-object-detector-using-tensorflow-object-detection-api

下記オフィシャルがあることに気づき、これも参照しながら作業した。

https://tensorflow-object-detection-api-tutorial.readthedocs.io/en/latest/install.html#tensorflow-installation

手こずったので備忘録に残す。

- 実施時期: 2022年4月
- OS: Ubuntu20.04LTS
- Anaconda: Python3.9.12

## ProtoBuf compilerのインストール
四苦八苦しながら最初にusr/localにProtoBufをインストールしておくべきだと気づいた。ただし既にProtoBufを使っている環境であればむしろ入れるのはリスクなので、protocコマンドでコンパイルできるか確認し、できなければインストールすればよし。
尚、pip install protobufでインストールできるProtoBufとは別物。
下記サイトからProtoBufの最新版（例えばprotoc-3.20.0-linux-x86_64.zip）をDownloadsフォルダにダウンロードする。

https://github.com/protocolbuffers/protobuf/releases


```Terminal
cd Downloads
sudo unzip -o protoc-3.20.0-linux-x86_64.zip -d /usr/local bin/protoc
sudo unzip -o protoc-3.20.0-linux-x86_64.zip -d /usr/local 'include/*'
```

.bashrcに下記のPATHを追加しsourceしておく。

```Terminal
export PATH="$PATH:$HOME/.local/bin"
```
これらは下記を参考にした。

http://google.github.io/proto-lens/installing-protoc.html

https://grpc.io/docs/protoc-installation/


## Python環境
オフィシャルに従いAnacondaの仮想環境とする。尚、working directoryは下記とする。

Documents/tf_env1

また、conda仮想環境も同名のtf_env1とする。

```Terminal
conda create -n tf_env1 pip python=3.9
conda activate tf_env1
cd Documents/tf_env1    # ここに環境作成する
```

以降、この仮想環境内での作業となる。
Tensorflow2（以下TF）のインストールとGPUを認識できたか動作確認を行う。

```Terminal
pip install --ignore-installed --upgrade tensorflow==2.5.0
python -c "import tensorflow as tf;print(tf.reduce_sum(tf.random.normal([1000, 1000])))"
```
下記が表示されることを確認する。
CUDA等の設定は完了していることとする。

```Terminal
2022-04-10 14:13:27.184545: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2022-04-10 14:13:27.187504: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2022-04-10 14:13:27.187810: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2022-04-10 14:13:27.188251: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2022-04-10 14:13:27.188638: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2022-04-10 14:13:27.188931: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2022-04-10 14:13:27.189206: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2022-04-10 14:13:27.456498: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2022-04-10 14:13:27.456807: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2022-04-10 14:13:27.457071: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2022-04-10 14:13:27.457323: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1525] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 5738 MB memory:  -> device: 0, name: NVIDIA GeForce RTX 3070, pci bus id: 0000:07:00.0, compute capability: 8.6
tf.Tensor(-837.38684, shape=(), dtype=float32)
```

TensorFlow Model GardenをDocuments/tf_env1直下にダウンロードする。

```Terminal
git clone https://github.com/tensorflow/models.git
```

```Terminal
tf_env1/
└─ models/
   ├─ community/
   ├─ official/
   ├─ orbit/
   ├─ research/
   └── ...
```


Object detection用のprotoファイルをはじめにインストールしたprotocでコンパイルする。

```Terminal
cd
cd Documents/tf_env1/models/research
protoc object_detection/protos/*.proto --python_out=.
```

COCO APIをtf_env1直下にダウンロードする。


```Terminal
cd
cd Documents/tf_env1
git clone https://github.com/cocodataset/cocoapi.git
```

```Terminal
tf_env1/
└─ models/
   ├─ community/
   ├─ official/
   ├─ orbit/
   ├─ research/
   └── ...
└─ cocoapi/
   ├─ common/
   ├─ LuaAPI/
   ├─ MatlabAPI/
   ├─ PythonAPI/
   └── ...
```

コンパイルする。

```Terminal
pip install cython
cd cocoapi/PythonAPI
make
```
makeで作成されたcocoapi/PythonAPI内のpycocotoolsをコピーする。

```Terminal
cp -r pycocotools ~/Documents/tf_env1/models/research/
```

working directoryに戻り、Object Detection APIをインストールする。

```Terminal
cd
cd Documents/tf_env1/models/research
cp object_detection/packages/tf2/setup.py .
python -m pip install .
```

下記がインストールされたらしい。

```Terminal
Successfully installed apache-beam-2.37.0 avro-python3-1.10.2 cloudpickle-2.0.0 colorama-0.4.4 contextlib2-21.6.0 crcmod-1.7 cycler-0.11.0 dill-0.3.1.1 dm-tree-0.1.6 docopt-0.6.2 fastavro-1.4.10 fonttools-4.32.0 gin-config-0.5.0 google-api-core-2.7.1 google-api-python-client-2.43.0 google-auth-httplib2-0.1.0 googleapis-common-protos-1.56.0 hdfs-2.7.0 httplib2-0.19.1 joblib-1.1.0 kaggle-1.5.12 keras-2.8.0 kiwisolver-1.4.2 libclang-13.0.0 lvis-0.5.3 lxml-4.8.0 matplotlib-3.5.1 numpy-1.21.5 oauth2client-4.1.3 object-detection-0.1 opencv-python-4.5.5.64 opencv-python-headless-4.5.5.64 orjson-3.6.7 packaging-21.3 pandas-1.4.2 pillow-9.1.0 portalocker-2.4.0 promise-2.3 proto-plus-1.20.3 psutil-5.9.0 py-cpuinfo-8.0.0 pyarrow-6.0.1 pycocotools-2.0.4 pydot-1.4.2 pymongo-3.12.3 pyparsing-2.4.7 python-dateutil-2.8.2 python-slugify-6.1.1 pytz-2022.1 pyyaml-5.4.1 regex-2022.3.15 sacrebleu-2.0.0 scikit-learn-1.0.2 scipy-1.8.0 sentencepiece-0.1.96 seqeval-1.2.2 tabulate-0.8.9 tensorflow-2.8.0 tensorflow-addons-0.16.1 tensorflow-datasets-4.5.2 tensorflow-hub-0.12.0 tensorflow-io-gcs-filesystem-0.24.0 tensorflow-metadata-1.7.0 tensorflow-model-optimization-0.7.2 tensorflow-text-2.8.1 tensorflow_io-0.24.0 text-unidecode-1.3 tf-estimator-nightly-2.8.0.dev2021122109 tf-models-official-2.8.0 tf-slim-1.1.0 threadpoolctl-3.1.0 tqdm-4.64.0 typeguard-2.13.3 uritemplate-4.1.1
```

research内のテストコードで動作確認する。

```Terminal
python object_detection/builders/model_builder_tf2_test.py
```

下記のように24個のtestが実行されOKで完了する。

```Terminal
2022-04-10 13:42:10.566262: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero

　【中略】

INFO:tensorflow:time(__main__.ModelBuilderTF2Test.test_unknown_ssd_feature_extractor): 0.0s
I0410 13:42:22.714373 140155632805696 test_util.py:2373] time(__main__.ModelBuilderTF2Test.test_unknown_ssd_feature_extractor): 0.0s
[       OK ] ModelBuilderTF2Test.test_unknown_ssd_feature_extractor
----------------------------------------------------------------------
Ran 24 tests in 12.120s

OK (skipped=1)
```

以上