Amazon SageMakerでお魚を判別したいときってありますよね。
というわけで今回はSageMakerでお魚を判別してみました。
準備
撮影
魚の写真を撮りまくります。
水槽側面や水草にコケがついてますが、サイアミーズが食べないせいであって、僕のせいではないです。
全部で250枚撮りました。もっとある方がいいですが疲れたのでこの辺にしときました。
撮った写真はS3バケットへアップロードします。
ラベリング
Ground Truthをつかってラベリングします。
パブリックでラベリングジョブを作成してもいいのですが、お魚の種名が分からず適当にラベリングされても困るので、プライベートでジョブを作成し自分でラベリングすることにしました。
250枚ですが、丸1日くらいかかりました。しんどかったです。
ラベリングジョブが終了すると、指定のS3の場所に結果ファイルが出力されます。
このファイルをもとにトレーニングジョブを実行します。
困った点
ラベリングジョブはラベリングしたいファイルのあるS3パスを指定すればよいと思ってたのですが、それは間違いでマニフェストファイルにファイルのS3キーを記載し、ラベリングジョブ作成時にそのマニフェストファイルのS3キーを指定してやる必要があります。
要は、ラベリングしたいファイルのS3キーを記載したファイルをS3に置いておく必要があるということです。
マニフェストファイルの例
{"source-ref": "s3://bucket/key/sample01.JPG"}
{"source-ref": "s3://bucket/key/sample02.JPG"}
{"source-ref": "s3://bucket/key/sample03.JPG"}
...
トレーニング
コンソールからトレーニングジョブを作成し実行します。後に記載しますが、SageMakerのノートブックなどからコードで実行するのが断然楽チンです。
アルゴリズム選択
今回使用するアルゴリズムは、組み込みアルゴリズムのObject Detection Algorithmです。
入力モードは「Pipe」とします。
リソース設定
Object Detection AlgorithmはGPUしかサポートしてません。
一番小さいml.p2.xlargeで実行しましたが、メモリが足らずエラーとなるのでp2.8xlargeで実行しました。
ハイパーパラメータ
なんだかんだあってepochsをデフォルト(30)→24、mini_batch_sizeをデフォルト(32)→8に変更しました。
入力データ設定
Object Detection Algorithmで必要なチャンネルはtrainチャンネルとvalidationチャンネルです。チャンネル名が違うだけでもジョブがエラーとなるので気を付けてください。
今回は学習にラベリングジョブでラベリングしたデータを使用するため、どちらのチャンネルも以下の設定とします。
- 入力モード - Pipe
- レコードラッパー - RecordIO
- S3 データタイプ - AugmentedManifestGile
- S3 の場所 - ラベリングジョブ結果ファイルのS3キー
AugmentedManifestFile 属性名はラベリングジョブ結果ファイル(マニフェストファイル)内のキーを指定します。詳しくはドキュメントの『Train with Augmented Manifest Image Format』を確認してください。
出力データ設定
トレーニングしたモデルアーティファクトの保存場所をしていします。いい感じの場所にしましょう。
困ったこと
入力データ設定の誤りで何度かジョブを作成しなおしました。それだけでなくハイパーパラメータが合ってない?とかでジョブがエラーを起こしてしまい、合計で15回ほどジョブを作成しなおしました。
さすがにコンソールポチポチで15回も再作成するのはしんどかったのでこんどからはノートブックから実行しようと思います。
ちなみにトレーニングのログはCloudWatch Logsから確認できるので、ジョブがエラーを起こす場合はそちらを確認してください。
エンドポイント作成
トレーニングが成功してしまえば、あとは難しいことはありません。
以下の順で推論エンドポイントを作成します。
- モデル作成
- エンドポイント設定作成
- エンドポイント作成
Object Detection Algorithmは学習ではP2/P3系インスタンスを指定する必要がありましたが、エンドポイントはその制限はないようです。
判別してみよう!
いい感じに確認したかったので、さすがにノートブックを使いました。
といってもObject Detection Algorithmのサンプル「object_detection_birds.ipynb」の推論部分の画像とエンドポイントを変更しただけです。
こんな感じ
ほう...
まあ学習データが少ないので精度は期待してませんでしたが、なんとなく判別で来てる感じです。
色が派手なベタの判別がより精度出ているようにも見えます。コリドラスやサイアミーズは地味だから精度出にくい?
学習データの魚の向きも精度にかかわるので、種類ごとに横向き前向き200枚くらいデータ揃えればさすがにそこそこの精度は出るでしょう。
まあ、それだけの量を一人でラベリングしたくないですが...
まとめ
SageMakerをつかえば、データ集めるのさえ頑張ればあとはどうにでもなりますね。