前回、EC2を立ち上げて、物体検出っぽいことをしたくなったのでRetinaNetを動かしてみた。
RetinaNetを動かしてみた。思ったより簡単に動いたし、飛行機も認識しててなかなかいけるな。しかし実行速度が遅い気がする。中でピラミッド持ってるからだろうけど、こんなに遅いかな…。単純にスペックの問題かも。ちなみに画像はCOCOの画像を使って手元で作った結果です。https://t.co/cSuYP69T0S pic.twitter.com/BsIbgDhStD
— Kazushi Motomura / 元村和史 (@kazushi_fa) August 15, 2021
RetinaNet自体はどこかでまとめたい。
目次
Githubでコードをfork
今回はこちらのリポジトリを使わせてもらいます。
すでにサポートされていないリポジトリのようですが、スターの数がえぐいので大丈夫な気がします。
後で色々カスタマイズしたいので、Githubにforkしておきました。(私のリポジトリ)
GitCloneでリポジトリをコピー
まだEC2がGithubにssh接続できるようになっていなかったので、こちら等を参考に接続できるようにしました。
こちらのコマンドでforkしてきたリポジトリをEC2の方に入れます。
git clone git@github.com:kazushi-fa/keras-retinanet.git
Python仮想環境の構築
Readmeにあるpip install . –userではよくわからないエラーが出たので、環境を新しく作っていきます。
Readmeにはkeras 2.4とtensorflow 2.3.0で動くみたいなので何とかなるでしょう。
とりあえずTensorflow2系の環境を複製します。
conda create -n kazushi_tensorflow2_p37 --clone tensorflow2_p37
できたらCythonのセットアップをしておきます。
python setup.py build_ext --inplace
MS COCOでとりあえず動かしたいので以下も実行しておきます。
pip install --user git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI
またpython仮想環境にkeras-resnetを入れておきます。
conda activate kazushi_tensorflow2_p37
conda install -c conda-forge keras-resnet
あとちょっとよくわからないのですが、tensorflowのexport_saved_modelが非推奨になった関係で動かない場合があるそうで(私も動かなかった)
何故か再インストールすると動くみたいですのでtensorflowを入れなおします。(参考)
pip uninstall tensorflow
pip install tensorflow
→追記:この時は気が付かなかったのですが、このままインストールするとGPUが使えないTensorflowになってしまいます。Tensoflow-gpuを素直にアップデートしたらちゃんと動きました。
conda activate kazushi_tensorflow2_p37
conda update tensorflow-gpu
MS COCOのダウンロード
近いうちにMS COCOでテストしてみたいのでダウンロードして解凍しておく。
wget -q http://images.cocodataset.org/zips/train2017.zip
wget -q http://images.cocodataset.org/zips/val2017.zip
wget -q http://images.cocodataset.org/annotations/annotations_trainval2017.zip
unzip train2017.zip val2017.zip annotations_trainval2017.zip
学習済ResNetのダウンロード
後でつかうResNetの学習済モデルのWeightsをダウンロードしておきます。
場所はとりあえず/home/ubuntu/work/keras-retinanet/trained_modelsに入れました。
wget https://github.com/fizyr/keras-retinanet/releases/download/0.5.1/resnet101_oid_v1.0.0.h5
wget https://github.com/fizyr/keras-retinanet/releases/download/0.5.1/resnet152_oid_v1.0.0.h5
wget https://github.com/fizyr/keras-retinanet/releases/download/0.5.1/resnet50_coco_best_v2.1.0.h5
wget https://github.com/fizyr/keras-retinanet/releases/download/0.5.1/resnet50_oid_v1.0.0.h5
JupiterNotebookで動作を確認する
examplesディレクトリの下にResNet50RetinaNet.ipynbというサンプルファイルがあるので動作を確認する。
一部コードを変更しないと動かない。
まず
# import keras_retinanet
import sys
sys.path.append("../")
VSCodeで実行する時にライブラリが入らないのでこいつを冒頭にいれる。
そして
# use this to change which GPU to use
gpu = 0
を
# use this to change which GPU to use
gpu = "0,"
に変更する。
次にダウンロードした重みファイルのパスを入れる。
# adjust this to point to your downloaded/trained model
# models can be downloaded here: https://github.com/fizyr/keras-retinanet/releases
model_path = os.path.join('..', 'snapshots', 'resnet50_coco_best_v2.1.0.h5')
これを
# adjust this to point to your downloaded/trained model
# models can be downloaded here: https://github.com/fizyr/keras-retinanet/releases
model_path = os.path.join('..', 'snapshots', '/home/ubuntu/work/keras-retinanet/trained_models/resnet50_coco_best_v2.1.0.h5')
こうする。
これで一通りNotebookの中身が回った。
サンプルでついている画像ではなく、さきほどダウンロードしたCOCOの画像でも上手く動いた。