チュートリアル:C# 用の Bing Visual Search SDK で画像をトリミングする
警告
2020 年 10 月 30 日に、Bing Search API は Azure AI サービスから Bing Search サービスに移行されました。 このドキュメントは、参考用としてのみ提供されています。 更新されたドキュメントについては、Bing search API のドキュメントを参照してください。 Bing 検索用の新しい Azure リソースを作成する手順については、「Azure Marketplace から Bing Search リソースを作成する」を参照してください。
Bing Visual Search SDK を使用すると、類似したオンライン画像を検索する前に画像をトリミングすることができます。 このアプリケーションでは、複数の人が含まれる画像から 1 人をトリミングした後、オンラインで見つかった似た画像を含む検索結果を返します。
エラー処理と注釈が追加されたこのアプリケーションの完全なソース コードは、GitHub で入手できます。
このチュートリアルでは、次の方法を示します。
- Bing Visual Search SDK を使用して要求を送信する
- Bing Visual Search で検索するために画像の範囲をトリミングする
- 応答を受信して処理する
- 応答でアクション項目の URL を検索する
前提条件
- Visual Studio 2019 のいずれかのエディション。
- Linux/macOS を使用している場合、このアプリケーションは Mono を使用して実行できます。
- NuGet Custom Search パッケージがインストール済みであること。
- Visual Studio のソリューション エクスプローラーでプロジェクトを右クリックし、メニューから [NuGet パッケージの管理] を選択します。
Microsoft.Azure.CognitiveServices.Search.CustomSearch
パッケージをインストールします。 NuGet Custom Search パッケージをインストールすると、次のアセンブリもインストールされます。- Microsoft.Rest.ClientRuntime
- Microsoft.Rest.ClientRuntime.Azure
- Newtonsoft.Json
- Visual Studio のソリューション エクスプローラーでプロジェクトを右クリックし、メニューから [NuGet パッケージの管理] を選択します。
Azure リソースを作成する
次のいずれかの Azure リソースを作成して、Bing Visual Search API の使用を開始します。
- ご自身でリソースを削除するまでは Azure portal からご利用いただけます。
S9
価格レベルを選択します。
- ご自身でリソースを削除するまでは Azure portal からご利用いただけます。
- 複数の Azure AI サービス全体で同じキーとエンドポイントをアプリケーションに使用します。
画像のトリミング範囲を指定する
このアプリケーションでは、Microsoft シニア リーダーシップ チームの画像の範囲をトリミングします。 このトリミング範囲を定義するには、画像全体に対する割合として表された、左上と右下の座標を使用します。
この画像は、トリミング範囲から ImageInfo
オブジェクトを作成し、ImageInfo
オブジェクトを VisualSearchRequest
に読み込むことによって、トリミングされます。 ImageInfo
オブジェクトには、画像の URL も含まれます。
CropArea CropArea = new CropArea(top: (float)0.01, bottom: (float)0.30, left: (float)0.01, right: (float)0.20);
string imageURL = "https://learn.microsoft.com/azure/cognitive-services/Bing-visual-search/media/ms_srleaders.jpg";
ImageInfo imageInfo = new ImageInfo(cropArea: CropArea, url: imageURL);
VisualSearchRequest visualSearchRequest = new VisualSearchRequest(imageInfo: imageInfo);
トリミング範囲に類似する画像を検索する
変数 VisualSearchRequest
には、画像のトリミング範囲に関する情報とその URL が含まれています。 VisualSearchMethodAsync()
メソッドを使用して結果を取得します。
Console.WriteLine("\r\nSending visual search request with knowledgeRequest that contains URL and crop area");
var visualSearchResults = client.Images.VisualSearchMethodAsync(knowledgeRequest: visualSearchRequest).Result;
URL データを ImageModuleAction
から取得します。
Bing Visual Search の結果は ImageTag
オブジェクトです。 各タグには、ImageAction
オブジェクトのリストが含まれます。 各 ImageAction
には、アクションのタイプに依存する値のリストである Data
フィールドが含まれます。
次のコードを使用すると、さまざまなタイプを表示できます。
Console.WriteLine("\r\n" + "ActionType: " + i.ActionType + " -> WebSearchUrl: " + i.WebSearchUrl);
完全なアプリケーションでは、次の項目が返されます。
ActionType | URL |
---|---|
PagesIncluding WebSearchURL | |
MoreSizes WebSearchURL | |
VisualSearch WebSearchURL | |
ImageById WebSearchURL | |
RelatedSearches WebSearchURL | |
Entity -> WebSearchUrl | https://www.bing.com/cr?IG=E40D0E1A13404994ACB073504BC937A4&CID=03DCF882D7386A442137F49BD6596BEF&rd=1&h=BvvDoRtmZ35Xc_UZE4lZx6_eg7FHgcCkigU1D98NHQo&v=1&r=https%3a%2f%2fwww.bing.com%2fsearch%3fq%3dSatya%2bNadella>p=DevEx,5380.1 |
TopicResults -> WebSearchUrl | https://www.bing.com/cr?IG=E40D0E1A13404994ACB073504BC937A4&CID=03DCF882D7386A442137F49BD6596BEF&rd=1&h=3QGtxPb3W9LemuHRxAlW4CW7XN4sPkUYCUynxAqI9zQ&v=1&r=https%3a%2f%2fwww.bing.com%2fdiscover%2fnadella%2bsatya&p=DevEx,5382.1 |
ImageResults -> WebSearchUrl | https://www.bing.com/cr?IG=E40D0E1A13404994ACB073504BC937A4&CID=03DCF882D7386A442137F49BD6596BEF&rd=1&h=l-WNHO89Kkw69AmIGe2MhlUp6MxR6YsJszgOuM5sVLs&v=1&r=https%3a%2f%2fwww.bing.com%2fimages%2fsearch%3fq%3dSatya%2bNadella&p=DevEx,5384.1 |
上で示されているように、Entity
ActionType には、認識可能な人物、場所、または物に関する情報を返す Bing 検索クエリが含まれています。 TopicResults
タイプと ImageResults
タイプには、関連する画像のクエリが含まれています。 リスト内の URL は、Bing Search の結果にリンクしています。
PagesIncluding
ActionType
イメージの URL の取得
実際の画像 URL を取得するには、キャストにより、ActionType
を、値のリストを持つ Data
要素が含まれる ImageModuleAction
として読み取る必要があります。 各値は、画像の URL です。 次のコードでは、PagesIncluding
アクション タイプを ImageModuleAction
にキャストして、値を読み取ります。
if (i.ActionType == "PagesIncluding")
{
foreach(ImageObject o in (i as ImageModuleAction).Data.Value)
{
Console.WriteLine("ContentURL: " + o.ContentUrl);
}
}