Amazon SageMakerでセマンティックセグメンテーション

# SageMakerについて
機械学習のモデリングや、デプロイしてAWS上のアプリケーションで使うこともできる<b>SageMaker(セージメーカー)</b>。
いくつかビルトインでアルゴリズムが使用可能で、ハイパーパラメータの調整だけでもお手軽に試すことができるシロモノです。
\#sage makerってつまり賢いやーつを生成するやーつってコトですね

# SageMakerでセマンティックセグメンテーションを試してみる
今回はセマンティックセグメンテーション(semantic segmentation)を試してみます。画像のピクセル（画素）ごとにラベルづけをします。
下記のように、左が入力画像(学習データ)で、右がマスク画像(教師データ)となります。
![semantic_segmentation.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989761/9548561c-dfbf-a7f7-2361-9498a956b491.jpeg)

入出力の画像を使って、物体切り抜きなんかできると面白いなあ！と思ったのでやってみます。

# 学習データの準備
[こちらのサイト](http://host.robots.ox.ac.uk/pascal/VOC/voc2012/#devkit)からデータを拝借。
![semantic_segmentation_dataset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989761/293190f3-e332-9035-af66-e09468a25c9f.png)

# 学習データをS3に保存
解凍されたVOC2012フォルダのうち、「train」と「train_annotation」フォルダをS3に保存します。
aws cli使えば楽ちんです。--recursiveでフォルダごとコピーします。
下記は「your-bucket-name」というバケットの中の、「segmentation」というサブフォルダに保存する場合です。

```
aws s3 cp ~/train s3://your-bucket-name/segmentation --recursive
aws s3 cp ~/train_annotation s3://your-bucket-name/segmentation --recursive
```
# SageMakerを立ち上げる
ノートブックインスタンス→ノートブックインスタンスの作成。
![sagemaker_instance1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989761/f41b6e63-8c5f-0a29-dda2-f75e63d65fdd.png)

ノートブックインスタンス名を書いて(sagemaker-semanticsegmentationとか)、残りはデフォルトのままでインスタンス作成します。
![sagemaker_instance2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989761/e32fcd18-13ff-d3fe-137c-b648b263a1eb.png)

# notebookでコーディング
基本的には[こちらのサイト](https://github.com/aws/amazon-sagemaker-examples/blob/master/introduction_to_amazon_algorithms/semantic_segmentation_pascalvoc/semantic_segmentation_pascalvoc.ipynb)を参考にしています。英語なので自分なりに日本語でまとめてみます。

## config
sagemakerをimportしてconfig設定します。
![sagemaker_notebook1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989761/67c62aab-9be2-f9d8-2126-5a257b7c6cf8.png)

ここで[3]の部分で、<b>semantic-segmentation</b>と書いています。このほかビルトインの画像処理DLアルゴは、ResNetを用いた画像認識(<b>image-classification</b>)や、SSDベースの物体検出(<b>object-detection</b>)があるようです。

## 計算リソースとパラメータセッティング
さて、次は訓練に用いる計算リソースやハイパーパラメータをセッティングします。
![sagemaker_notebook2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989761/ef5bd786-ee54-13a6-f190-ab1baf766194.png)
[6] ml.p3.2xlargeというGPUの高速リソースを選びます。詳細は[AWS公式ドキュメント](https://aws.amazon.com/jp/ec2/instance-types/)に記載があります。これでGPU使えるのは良いですね。しっかりお金はかかります(東京リージョンで5.242USD/h)。
[7] ハイパーパラメータのセットです。semantic-segmentationモデルを行うにあたり、学習済みモデル(backbone)を何にするか、アルゴ(algorithm)を何にするかを指定できます。エポックや学習率、optimizerなどのおなじみのパラメータもここで指定することができます。

## データ置き場を設定して、学習&デプロイ!
![sagemaker_notebook3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989761/9dca4b6f-6d4a-7ade-7d4a-c1ed9e58f2af.png)

[8] データ置き場を設定します。
sagemaker.inputs.TrainingInputにS3のパスを設定します。
data_channelsは↑に記述している４つのキー(と対応するS3パス)が必須です。
このへんの詳細も[AWS公式ドキュメント](https://docs.aws.amazon.com/sagemaker/latest/dg/semantic-segmentation.html)に記載があります。

[9] モデル学習！2時間ぐらいかかりました。1000円以上しました。メシ抜きです。

[11]学習したモデルを使って予測/推論できるようにするために、Sagemakerのエンドポイントにデプロイします！これでLambdaから呼び出したりできるってことですね。デプロイに使うインスタンスは学習時と同じである必要はなくて、推論の時はもっとローコストなインスタンスでも良いです。ということでここではml.m4.xlargeを選びました。

これでモデルの作成ができました！推論はせっかくなのでLambda上でやってみようと思います。

# エンドポイントお片付け
デプロイされたエンドポイントはInServiceのあいだ課金され続けます。なので終わったらお片付けが必要です。
これはGUIで簡単にできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989761/a1b8a885-d0c8-6a89-5304-73042231c561.png)
上記の画面で、「アクション▼」→「削除」で削除することができます。
「え、せっかくモデル作ったのに！！」という場合も、後から簡単にエンドポイント作成できます。
その場合は、「エンドポイント」→「エンドポイントの作成」で楽ちんです。

# まとめ
今回はSagemakerを用いてセマンティックセグメンテーションのモデル学習を試してみました。
画像だけでなくseq2seqなどの自然言語処理のビルトインモデルもあったり、マーケットプレイスでモデル購入したりして簡単にモデル学習/使用を試すことができます。
AWS上のいろんなサービスと連携できるので、ひとまずLambdaで呼び出して試してみようと思います。