前回の記事で再学習して検出までやってみましたが、何も見つけられませんでした。
たぶんコードとしては上手く回っているので、小型のデータセットで試してみます。
目次
RarePlanesデータセットについて
RarePlanesという飛行機を対象にしたオープンデータセットで学習してみます。
このデータは背景は衛星画像(WorldView-3)なのですが、航空機自体は合成です。
少し違和感があるのですが、高分解能衛星画像に近いので今回はコレを使います。
RarePlanesデータセットのダウンロード
こちらの記事にある通り、ボリュームは抑えたいので私も下二桁で調整することにしました。
なおコマンドに–no-sign-requestをつけないと現在は取得できなさそうです。
#学習用データのダウンロード
aws s3 cp --recursive --no-sign-request s3://rareplanes-public/synthetic/train/images ./Data_rareplanes/train/images/ --exclude "*.png" --include "*10.png"
aws s3 cp --recursive --no-sign-request s3://rareplanes-public/synthetic/train/xmls ./Data_rareplanes/train/labels/ --exclude "*.xml" --include "*10.xml"
#検証用データのダウンロード
aws s3 cp --recursive --no-sign-request s3://rareplanes-public/synthetic/train/images ./Data_rareplanes/val/images/ --exclude "*.png" --include "*20.png"
aws s3 cp --recursive --no-sign-request s3://rareplanes-public/synthetic/train/xmls ./Data_rareplanes/val/labels/ --exclude "*.xml" --include "*20.xml"
#評価用データのダウンロード
aws s3 cp --recursive --no-sign-request s3://rareplanes-public/synthetic/train/images ./Data_rareplanes/test/images/ --exclude "*.png" --include "*30.png"
aws s3 cp --recursive --no-sign-request s3://rareplanes-public/synthetic/train/xmls ./Data_rareplanes/test/labels/ --exclude "*.xml" --include "*30.xml"
ダウンロードしたら以下の様なディレクトリを作っておきます。
/home/ubuntu/work/keras-retinanet/datasets/rareplanes/
├── csv
│ ├── annotations
│ └── classes
├── test
│ ├── csv_label
│ ├── images
│ ├── jpg_images
│ └── labels
├── train
│ ├── csv_label
│ ├── images
│ ├── jpg_images
│ └── labels
└── val
├── csv_label
├── images
├── jpg_images
└── labels
zipの解凍結果はimagesとlabelsに入れておきます。他は空です。
Python仮想環境の構築
仮想環境としては前回までに作成したretinanetを使います。
後で前処理が必要になるのですが、私のコードにはNatsortが必要なので入れておきます。
conda activate retinanet
conda install -c anaconda natsort
RarePlanesデータの前処理
RarePlanesのアノテーションデータ自体はXMLで、今回参照しているリポジトリではCSV形式に変換する必要があるので変換します。
前処理のコードはこちらの/home/ubuntu/work/keras-retinanet/datasets/rareplanes/convert_rareplanes.pyにあります。
このファイルの36行目をRarePlanesのデータが入っているパスに変更しておきます。
rareplane_dir = "/home/ubuntu/work/keras-retinanet/datasets/rareplanes/"
このディレクトリに移動して以下を実行。
python convert_rareplanes.py
すると各ディレクトリ(train, test, val)のcsv_labelというディレクトリに変換したアノテーションファイルが入っています。
ちなみにこのコードでCSVを作成するだけじゃなくて、PNGからJPGに変換する処理も入れていますので、結構時間かかるかもしれません。
また元々いれてあるのですが、/home/ubuntu/work/keras-retinanet/datasets/rareplanes/rareplanes_annotations.csvというファイルも必要です。
これらのファイルを
/home/ubuntu/work/keras-retinanet/datasets/rareplanes/csv
├── annotations
│ └── train_label.csv
└── classes
└── rareplanes_annotations.csv
こんな感じで配置しておきます。
これでデータセットの準備が完了。
RetinaNetの学習
いよいよ実行していきます。
先ほど/home/ubuntu/work/keras-retinanet/datasets/rareplanes/csvに格納したファイルパスを指定して学習を回していきます。
python keras_retinanet/bin/train.py csv /home/ubuntu/work/keras-retinanet/datasets/rareplanes/csv/annotations/train_label.csv /home/ubuntu/work/keras-retinanet/datasets/rareplanes/csv/classes/rareplanes_annotations.csv
ちなみに前回の記事から設定は変えていないです。
COCOほどではないですが、めっちゃ時間がかかりそうだったので6エポックで終了。
学習結果の変換
前回の記事と同じように重みファイルを変換していきます。
python keras_retinanet/bin/convert_model.py /home/ubuntu/work/keras-retinanet/snapshots/resnet50_csv_06.h5 /home/ubuntu/work/keras-retinanet/snapshots/rareplanes_20210817.h5
上手く変換できました。
学習結果の確認
これもまた前回の記事と同じようにJupyterで確認しました。
今回は上手く検出出来ました!
クラス数が少ないのと、結構特徴的な形なのでうまくいけました。
記念にツイートしていました。
RetinaNetが衛星画像に使えるか試してみたくて、衛星画像っぽいデータセットRarePlanes(航空機の合成画像)で再学習して検出してみました。アノテーションもXMLだったので前処理もそんなに手こずらなかった。6epochくらいしか回していないのですが、結構検出出来てます。https://t.co/1ULevNT7xa pic.twitter.com/qgoWC9Z1gw
— Kazushi Motomura / 元村和史 (@kazushi_fa) August 17, 2021