gluoncvについて

Computer VisionのフレームワークやAPIについて調べる機会があり、ここではgluoncvについて調べたことをまとめます。
#Computer Visionのフレームワーク、API一覧
- [gluoncv](https://gluon-cv.mxnet.io/index.html)
- [ChainerCV](https://chainercv.readthedocs.io/en/stable/)
- [Object detection API](https://github.com/tensorflow/models/tree/master/research/object_detection)

下二つは物体検出を簡単に行えるものとして紹介されている記事をいくつか目にしていたのですが、gluoncvはQiitaの記事にはなさそうということで簡単に調査。(2019/01/20時点)

#gluoncv
Gluonが公開してるconputer visionのツールキット
提供されている機能は以下

- 画像認識
- 物体検出
- セマンティックセグメンテーション
- インスタンスセグメンテーション
- Re-ID
- GAN

開発中の機能
- Keypointdetection
- Depthprediction


セマンティックセグメンテーションとインスタンスセグメンテーションの違いを知らなかった。
セマンティックセグメンテーション：物体の位置をセル単位で検出
インスタンスセグメンテーション：一つ一つの物体の位置をセル単位で検出
・・・まだ理解不足感満載

#Gluonのサポートフレームワーク
機械学習のフレームワークMXNetを利用

#pre-trained modelの精度
[精度一覧](https://gluon-cv.mxnet.io/model_zoo/detection.html#ms-coco)
modelの精度をCOCOのカテゴリ全80種類に対してそれぞれmAPをグラフ化されていてカテゴリ毎に一番精度の良いモデルが異なっているのが、わかって面白い。
![categoly_mAP.png](https://qiita-image-store.s3.amazonaws.com/0/342282/af443788-7ebb-a379-7856-d111ac9ee494.png)
大体、faster_rcnn_resnet101_v1、yolo3_darknet53がmAP上位を占めていますが、その分、検出速度はかなり落ちます。

| pre-trained model                    |mAP                 | Throughputs        |
|:-------------------------------------|:------------------:|:------------------:|
| faster_rcnn_resnet101_v1d_coco       |      40.100        |  4.141             |
|yolo3_darknet53_coco(608x608)         |       37           |  43.701            |
|ssd_512_resnet50_v1_voc               |       30.500       |  111.132           |

#チュートリアル
学習済みモデルのfine tuningの例として記載されていたピカチュウの物体検出がおもしろそうだったので試してみました。[finetune_detection](https://gluon-cv.mxnet.io/build/examples_detection/finetune_detection.html#sphx-glr-download-build-examples-detection-finetune-detection-py)
google colabで以下のnotebookを実行
[finetune_detection.ipynb](https://gluon-cv.mxnet.io/_downloads/67c027a31b1aa9f24d81973aa2d033ab/finetune_detection.ipynb)

以下を追加、変更

```
#cudaのバージョン確認
!ls -l /usr/local/cuda
```


```
#cudaのバージョンにあわせてmxnetとgluoncvをインストール
!pip install mxnet-cu92
!pip install gluoncv --upgrade
```

以下のセルはエラーになるのでコメントアウトしてください。

```
net = gcv.model_zoo.get_model('ssd_512_mobilenet1.0_custom', classes=classes,
    pretrained_base=False, transfer='voc')
```

直前に実行しているreset_classとgcv.model_zoo.get_modelをまとめて実行する例なので、実行する必要はありません。
githubにissueとして上がっていましたが、2つのissueがまとめて報告されていたので、おそらくスルーされたままcloseされちゃってるようでした。

あとはそのままnotebookを下まで実行するだけで、以下のようにピカチュウを検出した結果が表示されます。
![pikachu.png](https://qiita-image-store.s3.amazonaws.com/0/342282/37c5fc37-b580-03cd-ffbc-b41d288d0b16.png)

学習した画像は以下(一例)
![pikatrain1.png](https://qiita-image-store.s3.amazonaws.com/0/342282/f7d2e340-7854-3a6d-1c1a-742fd2222015.png)
![pika03.png](https://qiita-image-store.s3.amazonaws.com/0/342282/ad435497-0bea-cb44-2797-4649dac9bb9c.png)

![pika02.png](https://qiita-image-store.s3.amazonaws.com/0/342282/23a20a2e-7c0b-38c7-d393-abb70070ad2f.png)

フリーの3dオブジェクトを適当な背景に重ねて画像を作成してるみたいです。
学習内容は以下
学習データ枚数:900枚
epock:2
google colaboでの学習時間:5分

このくらいで、こんなに検出できちゃうの？！って感じたので、他の画像でもテストしてみました。
![pikachu2.png](https://qiita-image-store.s3.amazonaws.com/0/342282/c200101f-fd95-6090-35b1-097697c3fc7f.png)

中央の大きいピカチュウだと、検出されなかったので、ピカチュウのサイズを学習データと合わせて貼り付けたところ検出しました。
学習データのピカチュウをランダムにサイズ変更したら中央のピカチュウも検出できそうな気がします。
score(信頼度)で、表示する検出結果を決めてると思うのですが、どこで閾値を変更できるのかなど、まだまだ調べたりないのでもう少し調査したら、また更新するかもです。

# 参考
https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2018/12/GluonCV.pdf
[【無料】4大深層学習フレームワークをGPU版Colaboratoryとlocaltunnelで使い倒そう【簡単】](https://qiita.com/stakemura/items/1761be70a06fa8ee853f)