VS 2017では通常通りにコンソールアプリを作成すればよい(ただし、デバッグを実行するには、上で設定した環境変数GOOGLE_APPLICATION_CREDENTIALSが有効である必要がある)。
プロジェクトを作成したら、ソリューションエクスプローラーでプロジェクトを右クリックしてコンテキストメニューから[NuGet パッケージの管理]を選択する。パッケージの管理画面が表示されたら[参照]タブを選択して、検索ボックスに「Google.Cloud.Vision」などと入力する。
[Google.Cloud.Vision.V1]パッケージと[Google.Cloud.Vision.V1P1Beta1]パッケージの2つが見つかるが、ここでは前者をインストールする(後者は新機能を提供するβ版となっている)。
インストールができたら、次のようなコードを書いてみよう。
using System;
using Google.Cloud.Vision.V1;
namespace VSGCPTest
{
class Program
{
static void Main(string[] args)
{
if (args.Length == 0) return;
var client = ImageAnnotatorClient.Create();
foreach (var file in args)
{
var image = Image.FromFile(file);
var response = client.DetectLabels(image);
Console.WriteLine($"About file: {file}");
foreach (var label in response)
{
Console.WriteLine(label.Description);
}
Console.WriteLine();
}
Console.ReadKey();
}
}
}
これはコマンドラインで指定された画像ファイルをCloud Vision APIに渡して、その画像に関する情報を得るプログラムだ。ここでは以下の2つの画像ファイルを渡すものとする(プロジェクトにこれらを追加して、ビルド時に出力ディレクトリにコピーするように設定し、プロジェクトのプロパティ画面で[デバッグ]タブを選び、[コマンドライン引数]にこれらのファイルを記述しておく)。
これを実行すると、次のようになる。
ミーアキャットについてはそのものズバリの「meerkat」や「mongoose」といった記述が見られる。さわやかのハンバーグについては食べ物やハンバーグステーキ(salisbury steak)、肉といった情報が得られている(が、多くのネット民を虜にしているさわやかのハンバーグであることはまでは分からないようだ)。
それはともかく、Cloud Vision APIの基本的な利用方法が上のコードでは示されている。
実際にはAnnotateImageRequestクラスを利用して、リクエストの詳細な設定も行える。また、上のコードでは画像ファイルごとにリクエストを送信しているが、これを1つのリクエストにまとめることも可能だ。そこで、AnnotateImageRequestクラスとリクエストをまとめて送信するBatchAnnotateImagesメソッドを利用してみよう。実際のコードが以下だ。
static void Main(string[] args)
{
if (args.Length == 0) return;
var client = ImageAnnotatorClient.Create();
var list = new List<AnnotateImageRequest>();
foreach (var file in args)
{
list.Add(new AnnotateImageRequest()
{
Image = Image.FromFile(file),
Features = {
new Feature
{
Type = Feature.Types.Type.LabelDetection,
MaxResults = 5
}
}
});
}
var response = client.BatchAnnotateImages(list);
int cnt = 0;
foreach (var res in response.Responses)
{
Console.WriteLine($"About {args[cnt++]}:");
foreach (var label in res.LabelAnnotations)
{
Console.WriteLine(label.Description);
}
}
Console.ReadKey();
}
AnnotateImageRequestクラスのImageプロパティには先ほどと同様にImage.FromFileメソッドで画像ファイルをセットして、FeaturesプロパティにはCloud Vision APIにしてほしい処理(Typeプロパティ)と返送結果の上限数(MaxResultsプロパティ)を指定している。Typeプロパティ(Feature.Types.Type列挙型)では例えば以下のような値を指定可能だ(一部を抜粋)。
上のコードではこれらの処理から「LebelDetection」を指定している。また、リクエストはリストにまとめておき、クライアントのBatchAnnotateImagesメソッドに渡している。その結果もまとめて返送されるので、最後にこれらを取り出して表示している。本稿で見たのはDetectLabelsメソッドとBatchAnnotateImagesメソッドの2つだが、クライアントを介してCloud Vision APIを呼び出すメソッドとしては以下のようなものがある(一部。また、それぞれのメソッドには対応する非同期版のメソッドも用意されている)。
メソッド名にAnnotateを含むものは上で見たAnnotateImageRequestクラスを使ってリクエストの内容をセットアップするもので、Detectを含むものは個別の機能を直接呼び出すためのショートカット的な存在となる。
例えば、最初に使用したDetectLabelsメソッドはAnnotateImageRequestクラスのFeaturesプロパティのTypeプロパティにLabelDetectionを指定してAnnotateメソッドを呼び出す代わりのショートカットだと考えればよい(ただし、Annotateメソッドの戻り値にはTypeプロパティで指定できる各種処理に対応する処理結果が統合されているので、APIを呼び出した後の処理も若干変更する必要がある)。これらのメソッドの中から、自分がしたい処理に応じたものを呼び出すようにしよう。
上のコードの実行結果を以下に示す。上のコードではMaxResultsプロパティを「5」に設定しているので、先ほどとはラベルの取得数が異なっている点に注意されたい。
最後に上で見たCloud Vision APIの利用方法に今見た事項を追加してまとめると次のようになる。
Google Cloud Libraries for .NETを使うと、このように極めて簡単にC#からGCP提供の各種APIを利用できる。なお、Cloud Vision APIの詳細な情報についてはそのドキュメントを参照されたい。
今回はGoogle Cloud Libraries for .NETを利用して、C#コードからGCPのCloud Vision APIを呼び出すプログラムを作りながら、GCPの利用法(プロジェクトの設定、認証の情報の作成、NuGetパッケージを介したAPI呼び出しなど)について見た。次回はGCPが.NET開発者に向けて提供しているCloud SDK、Cloud Tools for VSを取り上げる予定だ。
Copyright© Digital Advantage Corp. All Rights Reserved.