花のデータセットを使用した画像の分類

このチュートリアルでは、花のデータセットを使用して独自の画像分類モデルを構築します。これには転移学習と最新の Inception-v3 モデルを使用します。目的は、Cloud Machine Learning Engine を使用してさまざまな種類の花に正しくラベルを付けることです。

使用するサンプルコードとモニタリングすることになる結果は、4 つの部分(データ前処理、変換後のデータによるモデル トレーニング、モデルのデプロイ、予測リクエストの 4 ステップ)で構成されています。どの部分も、クラウドの中で完結します。

作業内容

サンプルコードを実行してデータを Cloud Dataflow で前処理してから、この変換後のデータを使用して Cloud ML Engine でモデルをトレーニングします。このトレーニング後のモデルを Cloud ML Engine にデプロイし、予測リクエストを送信してモデルをテストします。

このサンプル データセットに収録されているのは、ごく少数の画像(最大 3,600 件)です。機械学習技術を使用して正確な分類モデルを一から適切にトレーニングするには、これよりも多くのデータが必要です。ここでは、転移学習と呼ばれるアプローチを代わりに使用します。転移学習では、あらかじめトレーニングされたモデルを使用して画像の特徴を抽出し、これを使用して新しい分類器をトレーニングします。このチュートリアルでは、Inception という事前トレーニング済みモデルを使用します。

目標

この入門用のエンドツーエンドのチュートリアルでは、Python のコードを使用して次のことを行います。

  • データ前処理をクラウドで実行し、元のデータファイルを読み込み、Cloud Dataflow を使用してトレーニング用に TFRecords 形式に変換します。
  • 最適なモデル仕様を得るために、Cloud Machine Learning Engine を使用してトレーニングを実行します。
  • トレーニング済みのモデルをデプロイします。
  • トレーニング済みのモデルに対して予測をリクエストし、その結果の精度を調べます。

料金

このチュートリアルでは、次のような Google Cloud Platform の課金対象コンポーネントを使用します。

  • Cloud Dataflow
    • データの前処理
  • Cloud Machine Learning Engine
    • トレーニング
    • 予測リクエスト
  • Google Cloud Storage
    • トレーニング用の入力データ格納
    • トレーナー パッケージのステージング
    • トレーニングから得られるアーティファクトの保存

料金計算ツールを使用すると、想定される利用方法に基づいて費用の見積もりを作成できます。

Cloud Platform を初めて使用する方は、無料トライアルをご利用いただける場合があります。

始める前に

サンプルを GitHub レポジトリからダウンロードする

macOS

  1. Cloud ML Engine サンプル zip ファイルをダウンロードして抽出します。

  2. ターミナル ウィンドウを開き、抽出した cloudml-samples-master ディレクトリが存在するディレクトリに移動します。

  3. cloudml-samples-master > flowers ディレクトリに移動します。このチュートリアルのコマンドは flowers ディレクトリから実行する必要があります。

    cd cloudml-samples-master/flowers
    

Cloud Shell

  1. Cloud ML Engine のサンプル zip ファイルをダウンロードします。

    wget https://github.com/GoogleCloudPlatform/cloudml-samples/archive/master.zip
    
  2. ファイルを解凍して cloudml-samples-master ディレクトリを抽出します。

    unzip master.zip
    
  3. cloudml-samples-master > flowers ディレクトリに移動します。このチュートリアルのコマンドは flowers ディレクトリから実行する必要があります。

    cd cloudml-samples-master/flowers
    

依存関係のインストール

このサンプルの中にある requirements.txt ファイルを使用すると、このプロジェクトに必要な依存関係をインストールできます。

sudo pip install -r requirements.txt

クラウド環境の設定とテスト

以下の手順に沿って、GCP アカウントで Cloud ML Engine API を有効にし、Cloud SDK をインストールして有効にします。さらに、TensorFlow をインストールしてテストを行います。

GCP プロジェクトの設定

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Cloud Platform Console プロジェクトを選択または作成します。

    [プロジェクト] ページに移動

  3. プロジェクトの課金を有効にします。

    課金の有効化

  4. Cloud Machine Learning Engine と Compute Engine API(複数)を有効にする。

    Enable the APIs

環境の設定

以下のいずれかのオプションを選択して、macOS のローカル環境または Cloud Shell のリモート環境を設定します。

macOS の場合、以下の [MACOS] タブで環境を設定することをおすすめします。[CLOSE SHELL] タブに表示される Cloud Shell は、macOS、Linux、Windows で使用できます。Cloud Shell は、Cloud Machine Learning Engine の機能を試すような場合には便利ですが、継続的な開発作業には適していません。

macOS

  1. 仮想環境をインストールして、このガイド用の独立した Python 開発環境を作成します。たとえば、次のコマンドを実行して virtualenv をインストールし、cmle-env という名前の環境を有効にします。

    virtualenv cmle-env
    source cmle-env/bin/activate
  2. Python がインストールされていることを確認します。まだの場合はインストールします。

    python -V
  3. macOS 用の Google Cloud SDK をインストールします。手順は Cloud SDK クイックスタートの始める前にをご覧ください。

  4. Cloud SDK を初期化します。

    gcloud init

    初期化プロセスの詳細については、Cloud SDK のドキュメントをご覧ください。

  5. pip をインストールします。これは、Python のパッケージ マネージャです。pip --version を実行して、pip がインストール済みかどうかを確認します。pip が最新バージョンであることを確認し、そうでない場合は次のコマンドを使用してアップグレードします。

    pip install -U pip
  6. TensorFlow をインストールします。

    pip install --upgrade tensorflow

    TensorFlow のインストール方法の詳細については、TensorFlow のドキュメントをご覧ください。

  7. アプリケーションのデフォルト認証情報を作成します。

    gcloud auth application-default login

Cloud Shell

  1. Google Cloud Platform Console を開きます。

    Google Cloud Platform Console

  2. コンソール ウィンドウの上部にある [Google Cloud Shell を有効にする] ボタンをクリックします。

    Google Cloud Shell の有効化

    コンソールの下部の新しいフレーム内で Cloud Shell セッションが開き、コマンドライン プロンプトが表示されます。シェル セッションが初期化されるまで、数秒かかる場合があります。

    Cloud Shell セッション

    Cloud Shell セッションが使用できる状態になります。

  3. 選択したプロジェクトを使用するように gcloud コマンドライン ツールを設定します。

            gcloud config set project [selected-project-id]
            

    [selected-project-id] はプロジェクト ID です。ID を囲んでいる角かっこは不要です。

Google Cloud SDK のコンポーネントを確認する

Google Cloud SDK のコンポーネントがインストールされていることを確認する手順は次のとおりです。

  1. モデルの一覧を作成します。

    gcloud ml-engine models list
  2. このコマンドから空のリストが返されることを確認します。

    Listed 0 items.

    モデルの作成を開始した後は、このコマンドを使用するとそのモデルがリストに表示されます。

単純な TensorFlow Python プログラムを実行する

簡単な Python プログラムを実行して、TensorFlow のインストールをテストします。Cloud Shell を使用している場合は、TensorFlow がすでにインストールされています。

  1. Python の対話型シェルを起動します。

    python
  2. TensorFlow をインポートします。

    >>> import tensorflow as tf
  3. 文字列を格納する定数を作成します。

    >>> hello = tf.constant('Hello, TensorFlow!')
  4. TensorFlow セッションを作成します。

    >>> sess = tf.Session()

    特定の命令を使用するための TensorFlow ライブラリがコンパイルされていないという警告は無視してかまいません。

  5. hello の値を表示します。

    >>> print(sess.run(hello))

    成功した場合は、次のように出力されます。

    Hello, TensorFlow!
  6. Python の対話型シェルを停止します。

    >>> exit()

TensorFlow のインストール方法の詳細については、TensorFlow のサイトにある TensorFlow のインストール方法の説明をご覧ください。

Cloud Storage バケットを設定する

このセクションでは、新しいバケットを作成する方法を説明します。既存のバケットを使用することもできますが、Cloud ML Engine の実行に使用するプロジェクトに属していないバケットの場合は、明示的に Cloud ML Engine サービス アカウントにアクセス権を付与する必要があります。

モデル トレーニングやバッチ予測の実行中にデータを読み書きするための Cloud Storage バケットを作成します。

  1. 新しいバケットに名前を指定します。名前は Cloud Storage のすべてのバケット全体で重複しないようにする必要があります。

    BUCKET_NAME="your_bucket_name"

    たとえば、プロジェクト名に -mlengine を追加して使用します。

    PROJECT_ID=$(gcloud config list project --format "value(core.project)")
    BUCKET_NAME=${PROJECT_ID}-mlengine
  2. 作成したバケット名を確認します。

    echo $BUCKET_NAME
  3. バケットのリージョンを選択し、`REGION` 環境変数を設定します。

    警告: バケットには、マルチリージョンのロケーション(us など)ではなく、1 つのリージョン(us-central1 など)を指定する必要があります。Cloud ML Engine サービスの利用可能なリージョンをご覧ください。たとえば、次のコードは `REGION` を作成して `us-central1` に設定します。

    REGION=us-central1
  4. 新しいバケットを作成します。

    gsutil mb -l $REGION gs://$BUCKET_NAME

    注: 使用するリージョンは、Cloud ML Engine ジョブを実行するリージョンと同一にしてください。この例では us-central1 を使用します。これはクイックスタートの説明で使用されているリージョンであるからです。

変数の宣言

まず、すべての変数を宣言して読み取り専用にします。

 declare -r BUCKET_NAME="gs://${your_bucket_name}"
 declare -r REGION=“your_valid_region”
 declare -r PROJECT_ID=$(gcloud config list project --format "value(core.project)")
 declare -r JOB_NAME="flowers_${USER}_$(date +%Y%m%d_%H%M%S)"
 declare -r GCS_PATH="${BUCKET_NAME}/${USER}/${JOB_NAME}"
 declare -r DICT_FILE=gs://cloud-ml-data/img/flower_photos/dict.txt

 declare -r MODEL_NAME=flowers
 declare -r VERSION_NAME=v1

 echo
 echo "Using job id: " $JOB_NAME
 set -v -e

変数 BUCKET_NAME と REGION はユーザーによって異なるため、自分のプロジェクト バケットとリージョンの名前を明示的に入力する必要があります。リージョンの選択方法については、Cloud ML Engine サービスの利用可能なリージョンのガイドをご覧ください。

クラウドでのトレーニングと評価のデータの前処理

このチュートリアルのために、ラベル付きの花の画像を収録した元のデータセットがランダムに分割されてトレーニング評価のデータセットに分けられています。元のデータのうち、90% はトレーニング用に予約されており、10% は評価用に予約されています。この 2 つのファイルは、Google が所有する Cloud Storage バケットに格納されています。Google がホストするこの 2 つのデータセットを前処理し、Inception ネットワークのボトルネック レイヤ(通常は最後から 2 番目のレイヤ、つまり実際に分類を行う最終出力レイヤの直前のレイヤ)から画像の特徴を抽出します。この前処理の出力を自分の Cloud Storage バケットに保存し、そのファイルをトレーニングに使用します。

前処理に要する時間は、データセットあたり約 60 分です。

評価データの前処理

最初に、評価データの前処理を行います。

python trainer/preprocess.py \
    --input_dict "$DICT_FILE" \
    --input_path "gs://cloud-ml-data/img/flower_photos/eval_set.csv" \
    --output_path "${GCS_PATH}/preproc/eval" \
    --cloud

前処理をモニタリングする

前処理の進行状況をモニタリングするには、コマンドライン ツールを使用してテキスト ログ エントリを画面に書き出します。または、Dataflow のコンソールにあるウェブベースのモニタリング ユーザー インターフェースを使用すると、各パイプラインがグラフィカルに表示され、ジョブのステータスと実行に関する詳細情報を見ることができます。

次のコマンドでログのエントリを出力します。

gcloud dataflow jobs list
export JOB_ID="{corresponding_id}"
gcloud beta dataflow logs list $JOB_ID --importance=detailed

または、Dataflow のモニタリング ユーザー インターフェースに移動します。

Cloud Dataflow Monitoring UI

トレーニング データの前処理

評価データと同じ方法でトレーニング データを前処理します。

python trainer/preprocess.py \
    --input_dict "$DICT_FILE" \
    --input_path "gs://cloud-ml-data/img/flower_photos/train_set.csv" \
    --output_path "${GCS_PATH}/preproc/train" \
    --cloud

進行状況のモニタリングは、評価データと同じです。

モデル トレーニングをクラウドで実行する

Cloud ML Engine の前処理が完了すると、単純な分類器をトレーニングする準備が整います。前処理が完了していることを確認するために、Dataflow コンソールのページに移動してジョブのステータスを調べます。

Cloud Dataflow Monitoring UI

次のコマンドを使用してモデル トレーニングをクラウドで実行します。

gcloud ml-engine jobs submit training "$JOB_NAME" \
    --stream-logs \
    --module-name trainer.task \
    --package-path trainer \
    --staging-bucket "$BUCKET_NAME" \
    --region "$REGION" \
    --runtime-version=1.2\
    -- \
    --output_path "${GCS_PATH}/training" \
    --eval_data_paths "${GCS_PATH}/preproc/eval*" \
    --train_data_paths "${GCS_PATH}/preproc/train*"

トレーニングの進行状況をモニタリングする

前処理のモニタリングと同様に、トレーニングの進行状況をモニタリングするにはコマンドラインで単純なテキストログを調べるか、TensorBoard 可視化ツールを起動して、トレーニング中に生成された要約ログに移動します。

コマンドラインでログをストリーミングする方法は次のとおりです。

gcloud ml-engine jobs stream-logs "$JOB_NAME"

または、TensorBoard 可視化ツールを開きます。

macOS

  1. TensorBoard の起動:

    OUTPUT_PATH = "${GCS_PATH}/training"

    python -m tensorflow.tensorboard --logdir=$OUTPUT_PATH

  2. TensorBoard が起動したら、ブラウザで http://localhost:6006 を指定してアクセスします。

Cloud Shell

  1. TensorBoard の起動:

    OUTPUT_PATH = "${GCS_PATH}/training"
    
    python -m tensorflow.tensorboard --logdir=$OUTPUT_PATH --port=8080
    
  2. コマンドラインの上部にある [ウェブでプレビュー] メニューで、ポート 8080 でのプレビューを選択します。

TensorBoard は、コマンドラインで ctrl+c キーを押して、いつでもシャットダウンできます。

モデルのデプロイと予測での使用

これで、SavedModel が Google Cloud Storage に保存されてエクスポート可能な状態になりました。このコマンドで作成される「モデル」は、トレーニング中に作成された、最適な計算アーティファクト(Tensorflow グラフ)を入れるコンテナと考えてください。

  1. gcloud ml-engine models create コマンドを使用して SavedModel に名前を付けて Cloud ML Engine にエクスポートします。

    gcloud ml-engine models create "$MODEL_NAME" \
      --regions "$REGION"
    
  2. モデルの最初のバージョンを作成します。バージョンの作成とは、実際には一意に定義されたモデルを Cloud インスタンスにデプロイし、処理(予測)に使用できるようにすることです。

    gcloud ml-engine versions create "$VERSION_NAME" \
      --model "$MODEL_NAME" \
      --origin "${GCS_PATH}/training/model" \
      --runtime-version=1.2
    

モデルの最初のバージョンが自動的にデフォルトに設定されます。

予測リクエストをトレーニング済みモデルに送信する

モデルをデプロイすると、そのオンライン予測能力をテストできる状態になります。これを行うために、評価セットから花(デイジー)のサンプル画像をダウンロードして、リクエスト メッセージを送信します。

  1. 画像をローカル ディスクにコピーします。

      gsutil cp \
        gs://cloud-ml-data/img/flower_photos/daisy/100080576_f52e8ee070_n.jpg \
        daisy.jpg
    

    予測リクエストを行うには、上記の JPEG ファイルをエンコードして(base64 エンコードを使用)JSON 文字列に埋め込む必要があります。

  2. ダウンロードしたデイジーの JPEG ファイルから、JSON 形式のリクエスト メッセージをローカルで作成します。

      python -c 'import base64, sys, json; img = base64.b64encode(open(sys.argv[1], "rb").read()); print json.dumps({"key":"0", "image_bytes": {"b64": img}})' daisy.jpg &> request.json
    

    上記のコードにより、Cloud ML Engine のオンライン予測が開始されます。

    モデルの新しいバージョンをデプロイする場合は、リクエストが完了するまで待つ必要があります。これには最大 10 分かかります。デプロイされたバージョンのステータスを確認するには、Google Cloud Platform Console の [ML Engine] > [モデル] に移動します。

    数分後に、モデルは Cloud ML Engine の予測 API を介して使用できるようになります。この状態になったら、予測コマンドを使用してインスタンスの Cloud ML Engine に予測リクエストを送信します。

  3. 予測サービス API を呼び出して分類を取得します。

      gcloud ml-engine predict --model ${MODEL_NAME} --json-instances request.json
    

    レスポンスは次のようになります。予測番号は花の種類に対応しています(デイジー: 0、タンポポ: 1、バラ: 2、ヒマワリ: 3、チューリップ: 4)。

KEY  PREDICTION                SCORES
0      0                    [0.9980067610740662, 0.00011650333908619359,
0.00028453863342292607, 0.0006193328299559653, 0.0009433324448764324,
2.9501752578653395e-05]

このコードを実行した後の予測精度は、約 99.8% になるはずです。

プロジェクトの削除

課金を停止する最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除する手順は次のとおりです。

  1. Cloud Platform Console で、[プロジェクト] ページに移動します。

    [プロジェクト] ページに移動する

  2. プロジェクト名の右側にある、ゴミ箱アイコンをクリックします。

クリーンアップ

このチュートリアルで使用するリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

  1. ターミナル ウィンドウを開きます(まだ開いていない場合)。

  2. gsutil rm コマンドに -r フラグを付けて実行します。これで、最新のジョブが格納されているディレクトリが削除されます。

    gsutil rm -r gs://$BUCKET_NAME/$JOB_NAME
    

コマンドが正常終了した場合は、次のようなメッセージが返されます。

Removing gs://my-awesome-bucket/just-a-folder/cloud-storage.logo.png#1456530077282000...
Removing gs://my-awesome-bucket/...

このサンプル用に作成したディレクトリが他にもある場合は、このコマンドを繰り返し実行します。

バケットにその他のデータが格納されていない場合は、gsutil rm -r コマンドをバケットそのものに対して実行することもできます。

次のステップ

これで、花の画像データを前処理、トレーニング、デプロイ、予測に使用する Cloud ML Engine のコードサンプルのチュートリアルが完了しました。Cloud Dataflow で画像データを前処理するコードを実行し、クラウドでトレーニングを実施した後、モデルをデプロイし、このモデルを使用してオンライン予測を取得しました。

以下のリソースは、引き続き Cloud ML Engine について学習するのに役立ちます。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Machine Learning Engine(Cloud ML Engine)