Edge TPU Accelaratorの動作を少しでも高速化したかったのでMS-COCOをPascal VOCで転移学習して.tfliteを生成した_GoogleColaboratory[GPU]編_その３

**Tensorflow-bin**　[![GitHub stars](https://img.shields.io/github/stars/PINTO0309/Tensorflow-bin.svg?style=social&label=Stars)](https://github.com/PINTO0309/Tensorflow-bin)
<a href="https://github.com/PINTO0309/Tensorflow-bin"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/PINTO0309/Tensorflow-bin.png" width="460px"></a>
**TPU-MobilenetSSD**　[![GitHub stars](https://img.shields.io/github/stars/PINTO0309/TPU-MobilenetSSD.svg?style=social&label=Stars)](https://github.com/PINTO0309/TPU-MobilenetSSD)
<a href="https://github.com/PINTO0309/TPU-MobilenetSSD"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/PINTO0309/TPU-MobilenetSSD.png" width="460px"></a>

# １．Introduction
前回記事は Docker によるTPUモデルのローカル転移学習の手順を整理しました。
**[Edge TPU Accelaratorの動作を少しでも高速化したかったのでMobileNetv2-SSD/MobileNetv1-SSD+MS-COCOをPascal VOCで転移学習して.tfliteを生成した_Docker編\_その２](https://qiita.com/PINTO/items/8a91d79abe6e939ef01c)**
今回は、手元にGPU搭載端末が無い場合を想定して、 **`無料のGoogle Colaboratory環境`** により同様の作業を実施します。 最終的には、 TPU Edge Accelarator へデプロイするための 独自.tfliteファイル をクラウド上で生成することを目的としています。 クラウドで作業を実施するとはいえ、ローカルで出来ることはほぼ全て同じようにできます。 利用時間制限があるぐらいです。

Dockerで作業をするのと大して変わりはありませんが、GPUがハイスペックということやGPU分の電気代がタダ、出先から制御出来る、というメリットはありそうです。 なお、デメリットは **`GPU暖房が使えなくなるために暖房費がかさむこと`** です。 そうです、まさに本末転倒ですね。
正直に言いまして、今さら感があると思いますのであくまで自分用のメモとして残します。

懺悔します。 Googleドライブのマウントが面倒だったので全てマウントせずに実施しました。
なお、リソース一式は上図のニコちゃんマークの **[リポジトリ](https://github.com/PINTO0309/TPU-MobilenetSSD/tree/master/colaboratory/gpu)** にコミットしてあります。

# ２．Environment (2019.03.31)

- Google Colaboratory [GPU / Free]
- Tensorflow-GPU v1.13.1
- Protobuf 3.7.0
- CUDA 10
- NVIDIA Tesla K80
- Pascal VOC 2007 /2012
- Python 3.6

# ３．Procedure
Please adjust the **`Batch size`** as you like.

```config:pipeline*.config
train_config {
  batch_size: 64   #<------------- Batch size
  data_augmentation_options {
    random_horizontal_flip {
    }
  }
  data_augmentation_options {
    ssd_random_crop {
    }
  }
  sync_replicas: true
  optimizer {
    adam_optimizer: {
      learning_rate: {
        manual_step_learning_rate {
          initial_learning_rate: .0002
          schedule {
            step: 500
            learning_rate: .00003
          }
```

Increasing the total number of **`training steps`** does not dramatically improve accuracy.
Adjust the number of **`NUM_TRAINING_STEPS`** as you like.

```console:Training_start_script
!source "$PWD/constants.sh"
%env NUM_TRAINING_STEPS=1000
%env NUM_EVAL_STEPS=500
!rm -rf learn/train
!./retrain_detection_model.sh \
  --num_training_steps ${NUM_TRAINING_STEPS} \
  --num_eval_steps ${NUM_EVAL_STEPS}
```



First of all, prepare the environment of Google Colaboratory referring to the following article.
This article is very polite and appreciated.
**[【秒速で無料GPUを使う】深層学習実践 Tips on Colaboratory - Qiita - tomo_makes](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935)**

Next, execute the following script in Google Colaboratory.

```console:TPU-Transfer-learning.ipynb
# -*- coding: utf-8 -*-
"""TPU-Transfer-learning.ipynb

Automatically generated by Colaboratory.

"""

!uname -a && python -V && pip -V

!apt-get update;apt-get upgrade -y

!apt-get install -y protobuf-compiler python-pil python-lxml python-tk \
autoconf automake libtool curl make g++ unzip wget git nano \
libgflags-dev libgoogle-glog-dev liblmdb-dev libleveldb-dev \
libhdf5* python3-dev python3-numpy python3-skimage gfortran libturbojpeg \
python-dev python-numpy python-skimage python3-pip python-pip \
libboost-all-dev libopenblas-dev libsnappy-dev software-properties-common \
protobuf-compiler python-pil python-lxml python-tk libfreetype6-dev pkg-config libpng12*

!pip install pip==18.0.0 --upgrade

!pip install --user Cython opencv-python lxml

!git clone https://github.com/tensorflow/models.git

from google.colab import files
files.upload()

!ls -l

!mv collabo.zip models/research

%cd models/research
!unzip collabo.zip

!rm collabo.zip

!chmod +x constants.sh
!chmod +x prepare_checkpoint_and_dataset.sh
!chmod +x retrain_detection_model.sh
!chmod +x protoc_update.sh
!chmod +x convert_checkpoint_to_edgetpu_tflite.sh
!cp object_detection_evaluation.py object_detection/utils
!mkdir configs

!git clone https://github.com/pdollar/coco.git
%cd coco/PythonAPI
!python3 setup.py install

%cd ../..

!wget https://github.com/protocolbuffers/protobuf/archive/v3.7.0.zip
!unzip v3.7.0.zip;rm v3.7.0.zip
%cd protobuf-3.7.0
!./autogen.sh
!./configure
!make -j$(($(nproc) + 1))

!make install

%cd python
!export LD_LIBRARY_PATH=../src/.libs
!python3 setup.py build --cpp_implementation
!python3 setup.py test --cpp_implementation
!python3 setup.py install --cpp_implementation
!ldconfig

%cd ../..

!protoc --version

!./prepare_checkpoint_and_dataset.sh --network_type mobilenet_v2_ssd --train_whole_model false

!source "$PWD/constants.sh"
%env NUM_TRAINING_STEPS=1000
%env NUM_EVAL_STEPS=100
!rm -rf learn/train
!./retrain_detection_model.sh \
  --num_training_steps ${NUM_TRAINING_STEPS} \
  --num_eval_steps ${NUM_EVAL_STEPS}

!ls -l learn/train

!./convert_checkpoint_to_edgetpu_tflite.sh --network_type mobilenet_v2_ssd --checkpoint_num 292

!ls -l learn/models

from google.colab import files
files.download("learn/models/output_tflite_graph.tflite")
```

![screencapture-colab-research-google-drive-11CDWpgkgZq_m5ryR1U0sh0I1w9lqhbQ-2019-03-31-20_52_31.png](https://qiita-image-store.s3.amazonaws.com/0/194769/7140c56c-a1da-f44e-0a8a-e98f68e29685.png)

**https://coral.withgoogle.com/web-compiler/**
![Screenshot 2019-03-21 16:18:27.png](https://qiita-image-store.s3.amazonaws.com/0/194769/5954ea76-1a9a-fd83-af44-988059d66a83.png)

**[Successful]　MobileNetv1-SSD / MobileNetv2-SSD**
![Screenshot 2019-03-24 16:46:05.png](https://qiita-image-store.s3.amazonaws.com/0/194769/15e5aefa-3a8d-fe69-e694-fb743d834f7f.png)

# ４．Finally
Next time I would like to try Google Colaboratory [TPU].

# ５．Reference Articles, Great thanks!
**[AI & Machine Learning Products - Cloud TPU Quickstart](https://cloud.google.com/tpu/docs/quickstart)
[Google ColaboratoryのTPUを試してみる - Qiita - koshian2](https://qiita.com/koshian2/items/25a6341c035e8a260a01)**
**https://twitter.com/tomo_makes/status/1045198738614976513**
**[【Tips】Google Colaboratory でPythonのファイル入出力演習 - Qiita - GandT](https://qiita.com/GandT/items/bd80fad2b8258ed87956)**
**[【秒速で無料GPUを使う】深層学習実践 Tips on Colaboratory - Qiita - tomo_makes](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935)**

# ６．Soliloquy
本題とは関係ありませんが、この場をお借りしまして皆様にお礼を言わせていただきたいです。
気がつけばPython部門で日本の30傑入りをしていました。 みなさんありがとうございます。 おかげさまでモチベーションが維持できています。
※ 手動で定期的にランキングをアップデートをしないと集計対象にならないサービスですので、上位の方々は頻繁にアップデートをしていないだけであって実はもっと高みにいらっしゃいます。 もっと多くのスターを獲得されている方はおそらく沢山いらっしゃいますが、この **[Git Awards](http://git-awards.com)** で集計開始ボタンを自分で押さない限りは集計対象になりません。 また、分析対象はパブリックリポジトリだけですので、プライベートリポジトリでスゴい仕事をされていても集計されません。 大した意味のないランキングですので完全なる自己満足です。
**Git Awards　http://git-awards.com/users/pinto0309**
![FireShot Capture 001 - pinto0309 - Git Awards - git-awards.com.png](https://qiita-image-store.s3.amazonaws.com/0/194769/6990a61f-02e8-0446-baa2-d31fc1738d1b.png)
ちなみに、日本の上位5傑は下図のとおりです。 突き抜け過ぎていて笑えます。
![FireShot Capture 002 - Python in Japan - Git Awards - git-awards.com.png](https://qiita-image-store.s3.amazonaws.com/0/194769/64ccadf7-3f5f-c26b-2dff-fa78c489c1d7.png)