RetinaNetをRarePlanesで学習してみる

前回の記事で再学習して検出までやってみましたが、何も見つけられませんでした。

たぶんコードとしては上手く回っているので、小型のデータセットで試してみます。

目次

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で確認しました。

image from RarePlanes(https://www.cosmiqworks.org/rareplanes/)

今回は上手く検出出来ました!

クラス数が少ないのと、結構特徴的な形なのでうまくいけました。

記念にツイートしていました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です