2017-07-10 16 views
0

センサスと花のサンプルは、Googleのmlエンジンを使用してクラスラベルを予測する方法を示しています。google-ml-engineを使用して画像キャプションを予測できますか?

イメージキャプションを生成するために独自のモデルを展開できますか?はいの場合、予測はどのように機能しますか?予測応答の形式はどのようになりますか?

より具体的には、以下に示す添付では、確率サブ配列は各クラスのインデックスとチャンスを与えます。イメージキャプションモデルを使用する場合、予測応答はどのように見えますか?

添付ファイル:http://boaloysius.me/sites/default/files/inline-images/predict1_0.png

答えて

0

クラウドMLエンジンは1つがほぼエクスポートすることができます任意のTensorFlowモデルを展開することができます。そのようなモデルでは、入力と出力を定義し、それが要求と応答の形式を決定します。

例を見て理解すると便利だと思います。あなたはそうのようなモデルをエクスポート想像:

def my_model(image_in): 
    # Construct an inference graph for predicting captions 
    # 
    # image_in is a tensor/array with shape=(None,) and dtype=string 
    # Meaning, a batch of raw image bytes. 

    ... Do your interesting stuff here ...  

    # caption_out is a tensor/matrix with shape=(None, MAX_WORDS) and 
    # dtype=tf.string), that is, you will be returning a batch 
    # of captions, one per input image, one word per column with 
    # padding when the number of words to output is < MAX_WORDS 
    return caption_out 

image_in = tf.placeholder(shape=(None,), dtype=tf.string) 
caption_out = my_model(image_in) 

inputs = {"image_bytes": tf.saved_model.utils.build_tensor_info(image_in} 
outputs = {"caption": tf.saved_model.utils.build_tensor_info(caption_out)} 

signature = tf.saved_model.signature_def_utils.build_signature_def(
     inputs=inputs, 
     outputs=outputs, 
     method_name='tensorflow/serving/predict' 
) 

あなたがこのモデル(CF this post)をエクスポートした後、あなたがそうのようなJSONリクエストを構築します:

{ 
    "instances": [ 
    { 
     "image_bytes": { 
     "b64": <base64_encoded_image1> 
     } 
    }, 
    { 
     "image_bytes": { 
     "b64": <base64_encoded_image2> 
     } 
    } 
    ] 
} 

私たちは要求を分析してみましょう。まず、一式の画像をサービスに送付します。すべてのリクエストは、「インスタンス」という配列値の属性を持つJSONオブジェクトです。配列の各エントリは、予測のためにグラフを供給するためのインスタンスです。このため、エクスポートされるモデルで最も外側の寸法をNoneに設定する必要があるため、可変サイズのバッチを処理できる必要があります。

配列の各エントリ自体はJSONオブジェクトです。属性は、モデルをエクスポートするときに定義したinputのキーです。この例では、image_bytesと定義しました。 image_bytesはバイト文字列なので、データをbase64でエンコードする必要があります。これは、{"b64": <data>}という形式のJSONオブジェクトを渡して行います。サービスに複数のイメージを送信したい場合は、instance配列に各イメージの同様のエントリを追加できます。すべての応答は、「予測」と呼ばれる配列値属性を持つJSONオブジェクトです

{ 
    "predictions": [ 
    { 
     "caption": [ 
     "the", 
     "quick", 
     "brown", 
     "", 
     "", 
     "" 
     ] 
    }, 
    { 
     "caption": [ 
     "A", 
     "person", 
     "on", 
     "the", 
     "beach", 
     "" 
     ] 
    } 
    ] 
} 

さて、この例のサンプルのJSONレスポンスは、次のようになります。配列の各要素は、要求からのinstances配列内の対応する入力に関連付けられた予測値です。

配列内の各エントリは、以前にエクスポートしたoutputs dictのキーによって属性が決まるJSONオブジェクトです。この場合、入力あたり1つの出力がcaptionとなっています。キャプションのソーステンソルcaption_outは、実際には行列であり、行数はサービスに送信されたインスタンス数と定義された列数に一定であることに注意してください。ただし、行列を返す代わりに、サービスは行列の各行をprediction配列のエントリとして独立して返します。行列の第2次元は一定であり、おそらくモデルそのものが余分な単語を空の文字列として埋め込む(上記のように)。

非常に重要な注記:上記の例では、生のJSON要求/応答本文を示しました。あなたの投稿から、レスポンスを解析してその周囲に構造を追加しているGoogleの汎用クライアントを使用していることが明らかです。具体的には、印刷対象のオブジェクトはネストされたフィールド[data]とその後[modelData:protected]内の予測をラップします。

私の個人的なお勧めは、そのクライアントをサービスに使用せず、汎用のリクエスト/レスポンスライブラリ(Googleの認証ライブラリと一緒に)を使用することですが、機能しているので何でも使えます。

+0

なぜこのモデルはキャプションを文字列の配列として与えるのですか?複数の単語を含む1つの文字列を与えるように定義できますか? –

+0

このような出力を生成するTensorFlowモデルを定義できるのであれば、絶対に可能です。 – rhaertel80

関連する問題