sh1’s diary

プログラミング、読んだ本、資格試験、ゲームとか私を記録するところ

C# で GCP (無料トライアル) の画像認識をする (VisualStuio 2015)

環境

Addin (NuGet)

Google Cloud Vision

GCP (Google Cloud Platform) は、大きなクラウドサービスで、たくさんの機能を提供している。だから、「何のためのもの」という説明が難しい。
ともかく、その機能のひとつに「Cloud Vision API」がある。これ、画像認識(に使える)。

なんに使って遊ぶものかは知りませんが、上の URL の中でテストできるところがあるので、それでおおよそわかる感じ。

f:id:shikaku_sh:20181029145643p:plain:w450

ゲームのキャラクター画像で試してみたところ、 bestGuessLabels というパラメーターがキャラクターの名前を言い当てていた。しかも、アダルトの警戒レベルがひとつ上がっています。
あと、ニドラン♀の画像で試したら、「nidoran」だった。おしい。

作り方

基本的には、この記事がわかりやすい。

ただ、前準備の項目は以下が抜けている(か、省略されている)ので、この記事は、次の補足を目的とした記事です。

環境変数の追加

f:id:shikaku_sh:20181029145744p:plain:w100 f:id:shikaku_sh:20181029145728p:plain:w250

Windows の場合は、普通に環境変数に追加すればよいです。私はシステム環境変数に追加しました。
このときは、「システム」>「システムの詳細設定」>「環境変数」でアクセスします。
GOOGLE_APPLICATION_CREDENTIALS は、jsonファイルへのパスを単純に指定しているだけです。
なので、次のコードが動かなかったら、環境変数の変数に誤りがあるはず。(ImageAnnotatorClient.Create(); が例外になる)

var path = Environment.GetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS");

using (var file = File.OpenRead(path))
{
    var p = NewtonsoftJsonSerializer.Instance.Deserialize<JsonCredentialParameters>(file);
}

File.OpenRead でエラーになったら、通常のファイルパス指定に誤りがあるはずって感じです。

課金の設定

実際のところで費用は発生しないけど、請求先アカウント管理者を設定しておかないと、以下のエラーがプログラム実行時に発生しました。テストとはいえ(テストだからこそ?)ユーザーがいないとダメみたいですね。

This API method requires billing to be enabled. Please enable billing on project #************ by visiting https://console.developers.google.com/billing/enable?project=********** then retry. If you enabled billing for this project recently, wait a few minutes for the action to propagate to our systems and retry.

無料トライアル中はヘッダー部分に大きく「トライアル」であることが表示されています。安心。
また、途中から勝手に有料に切り替えられることもないみたいです。今のところ。

f:id:shikaku_sh:20181029150142p:plain:w400

実行時の結果

一応、コードはこんな感じ。

static void Main(string[] args)
{
    var client = ImageAnnotatorClient.Create();
    var fileName = Console.ReadLine();

    var image = Image.FromFile(fileName);

    var response = client.DetectLabels(image);
    var info = client.DetectWebInformation(image);

    Console.WriteLine($"About file: {fileName} is ...");

    foreach (var label in response) 
    {
        Console.WriteLine(label.Description);
    }

    var name = info.BestGuessLabels;

    Console.WriteLine($"{name[0]?.Label ?? "error"}");

    Console.ReadKey();
}

すごい。こんな手軽に画像認識できるんですね。

f:id:shikaku_sh:20181029150054p:plain:w400

リセットの画像を調べると、画像情報から「hime cut」という ほんまどうでもいいことを教えてくれました。ありがとうございます。

f:id:shikaku_sh:20181029150110p:plain:w400

ニドランは、残念ながら性別の情報は得られませんでした。種族値個体値は教えてくれませんでした。


f:id:shikaku_sh:20181029151530p:plain:w400

はじめて GCP を使ってみたけど、それなりの成果は得られた感じです。
最後に APIダッシュボードを見ると、私にはすぎるだけの機能レポートがありました。これ、なんに使うんでしょうかね。

テストコード

「GCPVisionSample」というサンプルをあげています。