前回までにEC2を立ち上げてRetinaNetを動かしました。
今回は同じリポジトリを使ってCOCOデータセットでRetinaNetを学習してみます。
目次
データセットのダウンロードと配置
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
ダウンロードしたら、ディレクトリを以下のように変更します。
私は/home/ubuntu/work/keras-retinanet/datasets/coco以下に画像を配置することにしました。
/home/ubuntu/work/keras-retinanet/datasets/coco
├── annotations
└── images
├── train2017
└── val2017
画像データは全てimagesの下に、annotationsはそのまま入っています。
画像が多いのでmvコマンド一発では無理でした。(findコマンドで一発でやる方法もあるみたいですが、私はチマチマやりました。)
Python仮想環境の構築
前回の記事で誤ってtensorflow(GPU版ではない)を入れてしまったので新しく環境を作って動作確認をしておきます。
conda create -n retinanet --clone tensorflow2_p37
以降はretinanetという環境を使っていきます。
まず関連するパッケージを入れて、tensorflowを更新しておきます。
conda activate retinanet
conda install -c anaconda progressbar2
conda install -c conda-forge keras-resnet
conda update tensorflow-gpu
COCOでRetinaNetを学習
まず、今回は動くのを確認できればいいというレベルなので/home/ubuntu/work/keras-retinanet/keras_retinanet/bin/train.pyの433行目あたりを修正しました。
parser.add_argument('--epochs', help='Number of epochs to train.', type=int, default=5)
parser.add_argument('--steps', help='Number of steps per epoch.', type=int, default=100)
これでいよいよ学習。以下のコードを回す。
conda activate retinanet
python ./keras_retinanet/bin/train.py coco /home/ubuntu/work/keras-retinanet/datasets/coco
するとKerasおなじみのアレが出てくる。
To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
211/10000 [..............................] - ETA: 4:29:12 - loss: 4.0601 - regression_loss: 2.7582 - classification_loss: 1.3019
しばし待つ。EC2はお金がかかるので注意!
EC2がチャリチャリ音を立てているのが聞こえる(お金)p2.xlarge@北米で100円/一時間くらい。
— Kazushi Motomura / 元村和史 (@kazushi_fa) August 16, 2021
結果
新たに学習した結果を使って、物体認識をしてみる。
先ほど学習した結果は/home/ubuntu/work/keras-retinanet/keras_retinanet/snapshots/以下に入っている。
(resnet50_coco_05.h5のような名前。数字はエポック数)
まずはこいつを変換する必要がある。
python keras_retinanet/bin/convert_model.py /home/ubuntu/work/keras-retinanet/snapshots/resnet50_coco_05.h5 /home/ubuntu/work/keras-retinanet/snapshots/coco_20210817.h5
変換して、coco_20210817.h5というディレクトリがあればOK。
examplesディレクトリの下にResNet50RetinaNet.ipynbというサンプルファイルがあるので動作を確認する。
一部コードを変更しないと動かないので、前回記事の通りに変更しておく。
また重みファイルの指定を変える必要があるので、
model_path = os.path.join('..', 'snapshots', '/home/ubuntu/work/keras-retinanet/snapshots/coco_20210817.h5')
こうする。
ちなみに対象とする画像は/home/ubuntu/work/keras-retinanet/examplesにある画像の名前を指定すればいい。
image = read_image_bgr('000000001000.jpg')
結果を確認する。前回記事で処理速度が遅かったのはGPUを使えてないからみたいで、今回はそこそこ早かった。
結果がこちら。(結果まま)
コード自体は上手く動いている感じだが、今回は全く検出できなかった。たぶん圧倒的に学習が足りていない。
再学習の結果は別のデータセットを使って確認してみることにする。