注:
以下の記述には問題があります。
Colab のPythonバージョンを落として新しく1.4.0のPytorch を使っていますが、重みデータをtorch.saveで保存した場合、pthファイルがバイナリではなくアーカイブファイルになってしまいます。対処方法が分かるまでペンディングします。
【物体検出】
元ネタはTellus ですが、ここではTellus OS は使わずにGoogle のColab でやってみます。
衛星画像から航空機を検出
教師データはAWS のS3 から取ってきますが、Colab で使いたいのでGoogle Drive にダウンロードしておきます。
ダウンロードするにはAWSのコマンドラインツール(awscli)を使います。
Colab もGoogle Drive も無償で使えます。無償枠でもGoogleDrive は15GBの容量があります、十分です。
Colab も無償枠で行けると思います。検証ではColab Pro (P100) を使ってEpoch数100 で3時間くらい稼働させました。
無償枠ならTesla T4 で12時間制限ありですが、Epoch 100 くらいなら大丈夫だと思います。
やってみましょう。
注 : 最後にEpoch 200 で実行した結果も追加しておきました、ご参考までに。
GPU が使えるようにします。
編集ー>ノートブックの設定
Colab インスタンスに接続。
注:現Colab のPythonバージョンは3.9.16ですが、これだとリポジトリにあるPytorchのバージョンが1.7.0以上です。ここでは都合上1.5より下のPytorch を使う必要があるので、ColabのPythonを3.8系にダウングレードしてPytorchの1.4.0が見えるようにしておきます。
3.9系と3.8系を番号で選択するよう促してくるので、3.8系の番号を入力して選択。
Google Drive をマウントします。
「 このノートブックに Google ドライブのファイルへのアクセスを許可しますか?」と出るので、GoogleDrive に接続します。
次に出るWindowでご自身のアカウントでログインを許可すればマウントが完了します。
Mounted at /content/drive と表示されます。
自分のドライブに移動します。
awscli をインストールします。
確認
AWSの認証情報を確認。
まだ無いはずなので以下のようになります。
Name Value Type Location
—- —– —- ——–
profile <not set> None None
access_key <not set> None None
secret_key <not set> None None
region <not set> None None
AWSにログインして認証情報を取得します。
アカウントをお持ちの場合はIAMユーザー(B)としてログイン(C)します。
まだアカウントを持っていない場合は、新規に作成(A)してからログイン。
認証情報を取得します。
アクセスキーを取得
新規に取得する余地が無い場合は、既存のものを1個削除すればいいです。
rootkey.csvというファイルがダウンロードされます。ここには以下のような2種類の情報が記述されています。
AWSAccessKeyId=*************************
AWSSecretKey=****************************
region情報を取得します、どこのサーバーを使うかという話なので、大阪とか東京とか。
情報を収集できたら、認証情報を設定します。
以下の4つの情報を入力するように順番に聞いてきますので、上で取得したものを順次入力
Notebook の場合は右側をクリックして白いフィールドを表示させて入力します。
region が大阪の場合はap-northeast-3
最後のoutput formatはjsonにします。
AWS Access Key ID [None]:**************
AWS Secret Access Key [None]:***************
Default region name [None]: ap-northeast-3
Default output format [None]: json
終了したら確認してしてみます。
作業フォルダーを作って、教師データをダウンロード
大体4.2GBほどのファイルがダウンロードされます。
utils Python ライブラリをGoogleDrive のrareplanesフォルダーにアップロードしておく
こちらのサイトのutilsを使いたいので、クローンするかZip をダウンロード
クローンする場合
Zipをダウンロードする場合
GoogleDriveで右クリクして、解凍フォルダー内のutilsフォルダーごとアップロードしておきます。
SSDを用いて飛行機の物体検出にチャレンジ
Colab のJupyter Notebook にコードを記述して実行しましょう。
まず、
Colab のデフォルトのPyTorch,Torchvision では推論実行時、以下のようなエラーが出ます。
Legacy autograd function with non-static forward method is deprecated. Please use new-style autograd function with static forward method.
どうもPyTorchのバージョンが1.5以上の場合に出るそうです(2022/09/17現在、Colab のPyTorchバージョンは1.12.1)。
PyTorch,Torchvision をダウングレードしておきます。
新しいPython3.8系のColab にはpip が無いので入れて起きます。
以下のPytorch とTorchvision を入れます。
以下を実行
必要なライブラリをインストール
乱数のシードを設定
Training画像とそのアノテーション、またValidation画像とそのアノテーションをそれぞれリストにする
色情報の規格化のためにチャンネルごとの平均値を計算(1分半くらい時間かかりました)
(143.1487009512939, 136.12215208212658, 134.96655592553213)
モデルを再利用する場合、このcolor_meanデータが必要になるので保存しておく
前処理
Dataset の作成
Dataloader の作成
重みデータ
SSDモデルの作成
モデル学習用関数定義
オリジナルのエポック数は200ですが、100でも大丈夫らしいので、時間節約で100に変更。
学習実行
だいたいTesla P100 では3時間くらいで終了
エポックに伴う損失関数の変化をプロット
エポック数は100ですが、
損失が学習用画像と検証用画像のどちらにおいてもきちんと減少しています。また、学習用画像と検証用画像の損失関数に大きな差はないので、過学習もさほど起こしていないと考えられます。
….ということのようです。
では、適当に用意した画像で推論を実行してみます。
Tellusオリジナルにある画像はトークンが必要です。持っていないので、適当な衛星画像を使ってみます。
GoogleDrive のrareplanesフォルダーへアップロードしておきます。
【airport2.png】
重みファイルはSSD300_100.pthを使用
画像を読み込んで推論実行
こんな感じ
余計なものもPlaneだと推論していますが、推論すべきものはすべてカバーしています。
真面目にエポック数200でやってみた場合
Colab P100 の環境で6時間30分かかっています。
エポックに伴う損失関数の変化はこんな感じ
上記と同様にairport2.pngを読んで推論してみます。
重みファイルはSSD300_200.pthを使用します。
結果、今回は余計なものは検出せずに、飛行機のみをすべてカバーしています。
他の画像でやってみましたが、若干の誤検出をやらかすものの漏れはほぼありませんでした。
推論画像は「空港 衛星画像」で検索すれば結構出てきます。リサイズの必要はありません。
Appendix
【画像分類】
Jetson Nano + Pytorchでゴルフ場が衛星画像に写っているかを識別してみる
Appendix2
修正中
作成したモデルなどで推論のみ実行してみる
Colab を開いて新規にノートブックを作成、GPUを設定する
GoogleDrive に接続
Driveの構造はこんな感じです。
データのあるディレクトリに移動
実行可能なPytorchにダウングレード
ライブラリをインポート
保存済みのcolor_mean読み込み
推論用にSSD 設定
学習した重みを読み込む
推論実行
Appendix3
教師データはこんな感じ。
AWS のS3 からダウンロードしたもの。
train、test、valの3パターンあります。
それぞれのパターンにimage、xmlの2種類のデータが440以上用意されています。
例えば、Atlanta_Airport_0_0_126_30の場合
image
Atlanta_Airport_0_0_126_30.png
航空機(朱色枠)は4機
label
Atlanta_Airport_0_0_126_30.xml
詳細なデータですがアノテーション として利用されるのは一部です。
画像の朱色枠の航空機のアノテーション データは、persistent_idにSM_Airplaneを含むobject内の<bndbox2D>タグ情報で4つあります。
persistent_idにBP_Managerを含むobject内の<bndbox2D>タグ情報は画像の赤枠のもので、航空機のデータではありません。
データはRarePlanes/utils/detaloader.pyを使ってdatasetにまとめられています。
衛星画像を使って航空機以外のものを検出しようとする場合、教師データの作成はこれを参考にするればよいと思います。
Leave a Reply