[C#] Cognitive Servicesで画像解析(Computer Vision API Analyze Image)

Cloud Application Engineerの内海です。

今回はMicrosoft AzureのCognitive Servicesの中から画像解析等が可能なComputer Vision APIを使って、画像解析を行ってみたいと思います。

Microsoftの提供するCaptionBotの裏側、と言えばわかりやすいと思います。

前回の記事との違いは、あちらが解析結果候補を複数取得できたのに対し、
こちらは解析結果候補が1つしか取得できません。
かわりに画像のカテゴライズや顔認識等の追加機能が実装されています。


REST APIへアクセスするために必要なもの

REST APIへのアクセスのためにSubscription keyが必要になります。

1.下記サイトの『Request new trials』より『Computer Vision – Preview』を作成
https://www.microsoft.com/cognitive-services/en-US/subscriptions

2.作成されたSubscriptionよりKeyを取得
(下記画面のShowを押下でKeyが可視化されます。)
computervisonapi1


今回サムネイル作成に利用する画像ファイル

以下の3点を満たしている必要があります。
・ 対応しているファイル形式はJPEGとPNG、GIF、BMP
・ ファイルサイズは4MB以下
・ ピクセル単位で50×50以上必要


REST APIへのアクセス手順

サムネイル作成を行いたい画像ファイルをHTTPリクエストでPOSTしましょう。

レスポンスとして画像に写っているオブジェクト等のタグと説明がjsonで返ってきます。

POST先アドレスは以下のものになります。

https://api.projectoxford.ai/vision/v1.0/analyze

さらに、POST先アドレスにパラメータを仕込みます。

Key Value
visualFeatures 解析する内容を指定
複数内容が欲しいときはカンマ区切りで指定することで同時に結果を得られる
・ “Categories” (画像のカテゴライズ結果を返す)
・ “Tags” (画像の内容に関したタグを返す)
・ “Description” (画像の説明をテキストで返す)
・ “Faces” (顔が写っているかどうか、写っている場合はその座標や性別年齢を返す)
・ “ImageType” (画像が写真かどうか判断、結果を返す)
・ “Color” (アクセントカラーを判断、モノクロかどうかも判断する)
・ “Adult” (画像が性的内容であるかどうか判断、結果を返す)
details 詳細設定
“Celebrities”しかない
・ “Celebrities” (有名人が写っていた場合はその結果を返す)

リクエストヘッダーは以下を設定しておきましょう。

Key Value
Content-Type 以下の3タイプの内から選択
どこかにアップロードした画像の場合
“application/json”
ローカル上の画像を送るなら以下のどちらか
“application/octet-stream”
“multipart/form-data”
Ocp-Apim-Subscription-Key 取得したSubscription Key

今回はローカル上のファイルを送るため、
リクエストボディには画像ファイルをByte配列として書き込みましょう。
画像ファイルのByte配列化はC#ならこんな感じ

var fs = new FileStream(/*ローカル上の画像ファイルパス*/, FileMode.Open, FileAccess.Read);
var byteData = new byte[fs.Length];
fs.Read(byteData, 0, byteData.Length);
fs.Close();

レスポンス

リクエストパラメータに加えリクエストヘッダーとボディに間違いがなければ画像のリクエストパラメータで設定した解析結果がjsonとして返ってきます。

{
  "categories": [
    {
      "name": "abstract_",
      "score": 0.00390625
    },
    {
      "name": "people_",
      "score": 0.83984375,
      "detail": {
        "celebrities": [
          {
            "name": "Satya Nadella",
            "faceRectangle": {
              "left": 597,
              "top": 162,
              "width": 248,
              "height": 248
            },
            "confidence": 0.999028444
          }
        ]
      }
    }
  ],
  "adult": {
    "isAdultContent": false,
    "isRacyContent": false,
    "adultScore": 0.0934349000453949,
    "racyScore": 0.068613491952419281
  },
  "tags": [
    {
      "name": "person",
      "confidence": 0.98979085683822632
    },
    {
      "name": "man",
      "confidence": 0.94493889808654785
    },
    {
      "name": "outdoor",
      "confidence": 0.938492476940155
    },
    {
      "name": "window",
      "confidence": 0.89513939619064331
    }
  ],
  "description": {
    "tags": [
      "person",
      "man",
      "outdoor",
      "window",
      "glasses"
    ],
    "captions": [
      {
        "text": "Satya Nadella sitting on a bench",
        "confidence": 0.48293603002174407
      }
    ]
  },
  "requestId": "0dbec5ad-a3d3-4f7e-96b4-dfd57efe967d",
  "metadata": {
    "width": 1500,
    "height": 1000,
    "format": "Jpeg"
  },
  "faces": [
    {
      "age": 44,
      "gender": "Male",
      "faceRectangle": {
        "left": 593,
        "top": 160,
        "width": 250,
        "height": 250
      }
    }
  ],
  "color": {
    "dominantColorForeground": "Brown",
    "dominantColorBackground": "Brown",
    "dominantColors": [
      "Brown",
      "Black"
    ],
    "accentColor": "873B59",
    "isBWImg": false
  },
  "imageType": {
    "clipArtType": 0,
    "lineDrawingType": 0
  }
}

サンプルコード

サンプルコードを載せておきます。

公式リファレンスに載っているサンプルコードにローカル上の画像ファイルのPOST処理、レスポンスバイナリをファイルに書き込む処理を加えたものになります。

using System;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Web;

namespace Computer_Vision_API
{
    class Program
    {
        static void Main(string[] args)
        {
            string filename = /*ファイルパス*/;
            AnalyzeImage(filename);
            Console.ReadLine();
        }
        static async void AnalyzeImage(string fname)
        {
            var client = new HttpClient();
            var queryString = HttpUtility.ParseQueryString(string.Empty);

            // Request headers
            client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", /*取得したSubscription Key*/);

            // Request parameters
            // visualFeaturesに欲しい解析内容を指定
            queryString["visualFeatures"] = "Tags,Adult";
            queryString["details"] = "Celebrities";
            var uri = "https://api.projectoxford.ai/vision/v1.0/analyze?" + queryString;

            HttpResponseMessage response;
            
            var fs = new FileStream(fname, FileMode.Open, FileAccess.Read);
            byte[] byteData = new byte[fs.Length];
            fs.Read(byteData, 0, byteData.Length);

            using (var content = new ByteArrayContent(byteData))
            {
                content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
                response = await client.PostAsync(uri, content);
            }
            var responceBody= await response.Content.ReadAsStringAsync();
            Console.WriteLine(responceBody);
        }
    }
}

One thought on “[C#] Cognitive Servicesで画像解析(Computer Vision API Analyze Image)

コメントは停止中です。