Amazon SageMakerで熱帯魚を判別

記事タイトルとURLをコピーする

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から確認できるので、ジョブがエラーを起こす場合はそちらを確認してください。

エンドポイント作成

トレーニングが成功してしまえば、あとは難しいことはありません。

以下の順で推論エンドポイントを作成します。

  1. モデル作成
  2. エンドポイント設定作成
  3. エンドポイント作成

Object Detection Algorithmは学習ではP2/P3系インスタンスを指定する必要がありましたが、エンドポイントはその制限はないようです。

判別してみよう!

いい感じに確認したかったので、さすがにノートブックを使いました。

といってもObject Detection Algorithmのサンプル「object_detection_birds.ipynb」の推論部分の画像とエンドポイントを変更しただけです。

こんな感じ

ほう...

まあ学習データが少ないので精度は期待してませんでしたが、なんとなく判別で来てる感じです。

色が派手なベタの判別がより精度出ているようにも見えます。コリドラスやサイアミーズは地味だから精度出にくい?

学習データの魚の向きも精度にかかわるので、種類ごとに横向き前向き200枚くらいデータ揃えればさすがにそこそこの精度は出るでしょう。

まあ、それだけの量を一人でラベリングしたくないですが...

まとめ

SageMakerをつかえば、データ集めるのさえ頑張ればあとはどうにでもなりますね。