試行錯誤ダイアリー

新卒エンジニアが日々の技術的な学び,働き方,日々感じたこと等を書きます

【Amazon SageMaker】自前のデータセットで画像認識


f:id:appli-in:20180826203633p:plain:w700


ここでは自分で用意したオリジナルのデータセットを使ってawsのSagemakerというサービスを利用して,Deep Learningで画像の複数クラス分類をします.

この記事の対象は

「機械学習での画像認識に興味があるけどどうしていいかわからない」
「チュートリアルをやってみたけど結局自分で用意したデータセットでの学習の仕方がわからない」
「いい加減MNIST,CIFER-10のチュートリアルは見飽きたし,結局良くわからなかった」

のような方です.

Amazon Sagemakerに予め用意されているBuild inアルゴリズムを使うため,Deep Learingの仕組み等については説明しません.
この記事では都合上オープンなデータセットを使いますが,学習時に代わりに好きな画像を使って学習させることができます.
(フォーマットは.jpgか.pngに統一する必要があります)

※注意:Amazon SageMakerの利用は有料です.学習させる画像の量・サイズ,学習時間によって金額が変わります.この記事の内容と全く同じことをすると約100~200円程度かかります.無料利用枠を利用しての学習も可能です.その場合は,条件や使うインスタンスクラス等に注意してください.万が一思わぬ請求が発生した場合でも責任は負いかねます.

詳しい料金等についてはこちらを参照してください
Amazon SageMaker の料金表 – アマゾン ウェブ サービス (AWS)

また,請求ページにて常に請求情報を参照できます.

Amazon Sagemaker

Amazon Sagemakerはawsにおける機械学習に特化したサービスの一つです.

awsの環境を使うことで,手元に高性能なPCがなくてもDeep Learningを始めとする機械学習の手法を利用できます.

Amazon SageMakerでは利用用途ごとに以下の3種類のインスタンスタイプ(PCの環境の種類)が用意されています.

  • ノートブックインスタンス:学習モデルの構築や,前処理といった作業をするための環境
  • ラーニングインスタンス:実際に学習をするための環境,一般的にGPUを積んだハイスペックなPCが使われます.
  • ホスティングインスタンス:学習させたモデルを用いて実際に画像認識をする環境.

これらの環境をそれぞれ使って学習を進めていきます.

手順

ノートブックインスタンスの立ち上げ

まずawsコンソールにログインしAmazon Sagemakerのページにいきます.

サイドバーからノートブックインスタンスを選択し,ノートブックインスタンスの作成ボタンを押します.

ノートブックインスタンスの作成
ノートブックインスタンスの作成

適当なインスタンス名を設定し,インスタンスのタイプを設定します.
インスタンス名がなにかに影響することはないので自由に決めて大丈夫です.

今回やる内容においては,そこまでPCに性能を求めなくてよいので,「ml.t2.medium」を選択します.
もちろんここで高性能なPCを選択すると料金が高くなるので注意してください.

各種設定をして「ノートブックインスタンスの作成」を押すとノートブックインスタンスが起動します.
ステータスが「In service」になるまで待ちましょう.

「In service」になったら
アクションの「オープン」を選択します.

ここから実際のコードを書いていきます.
といってもチュートリアルに従ってやっていくだけです.

「オープン」を選択するとこのような画面が出てくるので「SageMaker Examples」のタブを選択します.

SageMaker Examplesを選択
SageMaker Examplesを選択


するとこのようなリストが表示されるので,「Introduction to Amazon algorithms」の中の「Image-classification-lst-format.ipynb」の右側の「Use」を選択します.

Useを選択
Useを選択

ファイル名はそのままでも大丈夫ですし,変更してもいいです.「create copy」でファイルを作りましょう.

選択するとjupyter notebookが開きます.

基本的にはこのチュートリアルに従っていくだけです.
ここからはノートブックの各セルに書かれたコードの内容について説明していきます.

コードの説明

1つ目のセルの上部では必要なモジュールのインポートをしています.
get_execution_role()では作成したノートブックインスタンスのIAMロールを取得しています.
bucket='<<bucket-name>>'ここでは利用するs3のバケット名を入力します
bucket=classification'
s3バケットは有料ですが,awsアカウントを作って1年以内なら無料枠に5G分のストレージがあります.
今回とりあえず試したいって方は利用したあとにバケットをすべて削除することをおすすめします.
get_image_uri(boto3.Session().region_name, 'image-classification') では画像認識用のコンテナ名を取得しています.

1つ目のセル
1つ目のセル


2つ目のセルでは,学習に使用する画像や画像を学習用データに変換するプログラムをダウンロードしています.
自前のデータセットを使いたい場合は,以下の図のように用意した画像を学習用と検証用のディレクトリにクラスごとに分けてください.

画像のクラス分け
画像のクラス分け

出力はディレクトリのインデックスになるので例のデータのように001.ak47のように明示的なインデックスをつけるとあとでわかりやすいです.

次に変換用のプログラムをダウンロードします. 以下のリンクからダウンロードしてください. https://raw.githubusercontent.com/apache/incubator-mxnet/master/tools/im2rec.py

変換の作業はローカルのPC内ですることができます.

ローカルで作業する場合,同じディレクトリ内に
- 学習用データがクラス分けされて入っているディレクトリ(ディレクトリ名:train) - 検証用データがクラス分けされて入っているディレクトリ(ディレクトリ名:validation) - im2rec.py が入っている状態で以下のコマンドを実行してtrain.lst,validation.lstを作成します.

python im2rec.py --list --recursive train ./train/
python im2rec.py --list --recursive validation ./validation/

一応lstファイルの中身をheadなどで確認して以下のようになっていることを確認してください.

lstファイルの中身の例
lstファイルの中身の例

中身は一番左の列がすべての画像を並べたときのインデックス,2つ目の列がクラスの番号,3つ目の列が画像のパスです.

3つ目のセル,4つ目のセルはディレクトリわけと,確認用なので飛ばします.

5つ目のセルでは学習用の画像ファイルと,lstファイルを1つ目のセルで指定したs3バケット内に保存します.
train,validation直下には各クラスに別れたディレクトリ(10クラスだったら10個),train_lst,validation_lst直下にはそれぞれのlstファイルが存在するようにしてください.

3つ目のセル
3つ目のセル

6つ目のセルは今回は必要無いので飛ばします.

トレーニングインスタンスでの学習

7~10個目のセルまでは学習用インスタンスの設定や,学習用パラメーターについての部分になります.

特に気をつけないといけない部分は - image_shape:画像のサイズを決めます,1つ目はチャンネル数(RGBなので3),2つ目,3つ目は縦横のピクセル数です. - num_training_samples:学習画像の枚数,自分の用意した枚数に合わせてください. - num_class:クラス数,自分の分けたいクラス数を指定.train・validationディレクトリ内のクラス数と同じ必要がある. - resize:画像をリサイズしたサイズ,image_shapeのサイズよりも大きい必要がある - use_pretrained_modelの値を0にすると転移学習を用いない,完全にゼロからの学習になります.その場合はepochsのパラメーターを上げないと十分な学習ができない可能性があります.

それ意外はお好みで各自調整してください.
よくわからなければ,そのままでもそれなりにうまくいくと思います.(学習データによりますが)

また,学習で無料枠のインスタンスを使いたい場合は,8個目のセルの"InstanceType": "ml.p2.xlarge"の部分を無料枠のインスタンスに変更しましょう.無料枠のインスタンスだと学習時間が結構かかると思います.デフォルトのml.p2.xlargeはGPUインスタンスでそこそこ速いしお値段も高くないので少しお金かかってもいいよって人はそのままでいいと思います.

10個目のセルまで実行すると学習が始まります.学習が完了するまで待ちましょう.チュートリアルのデータと同じデータでパラメーターを同じにすると訳30分ほどで完了した気がします.

学習が完了するとラーニングインスタンスは停止します.
Amazon SageMakerコンソールのトレーニングタブからジョブが「Completed」になっていることを確認します.

ホスティングインスタンスでの出力

Amazon SageMakerコンソールの推論タブのモデルを選択し,「モデルの作成」をクリックします.

ここでは
- モデル名
- 推論コードイメージの場所
- アーティファクトの場所
を入力します.

モデル名は自由に決めて問題ないです.

推論コードイメージの場所とアーティファクトの場所は,作成したモデルをトレーニングタブのトレーニングジョブの中から探し,名前をクリックすると,トレーニングジョブの詳細が出てきます.
その中の「アルゴリズム」の中の「トレーニングイメージ」が推論コードイメージに該当し,
「出力」のs3モデルアーティファクトが「アーティファクトの場所」に該当します.

それらの情報を入力し「モデルの作成」をクリックします.

その後エンドポイントを作成します.
SageMakerコンソールの「エンドポイントタブ」を選択し,適当なエンドポイント名を入力します.初めてエンドポイントを作成する場合はエンドポイントの設定をしなければいけないので「エンドポイント設定のアタッチ」で新しいエンドポイント設定の作成を選択し,適当なエンドポイント設定名を入力し,下のモデルの追加で先程作成したモデルを選択します.

エンドポイントを作成し,ステータスが「In service」になったら再度ノートブックインスタンスに戻って以下のセルの内容を入力します.
f:id:appli-in:20180827020546p:plain


認識させたい画像をこちらの「Upload」からアップロードしましょう.

Upload
Upload

次に,入力する画像を確認します.

file_name = './<file_name>'#Uploadしたファイルの名前.アップロードしたファイルは直下に置かれる
# test image
from IPython.display import Image
Image(file_name)  

画像が出力されたはずです.


最後にこちらのセルを実行します.
object_categoriesは例のデータのカテゴリになっているので修正してください.
結果として一番確率の高いインデックスとその確率が返ってきます.

画像認識の出力
画像認識の出力

以上で画像認識の一連の流れは終わりです.

注意

ノートブックインスタンス,ホスティングインスタンスに関しては使い終わったら停止しないと課金が続くので作業が終わったらインスタンスを停止するのを忘れないようにしましょう.

まとめ

AWSのAmazon SageMakerを使って自前の画像での画像認識ができるように一連の流れを説明しました.

少しお金はかかりますが,自分でGPU環境を持っていない方がDeep Learningを動かすにはAmazon SageMakerはとても便利だと思います.

ぜひいろいろと試してみてください.