もう Deep Learning で学習させる画像収集に時間を使いたくないのよ私

  • 29
    いいね
  • 0
    コメント

検証の際、画像データセットを収集するのは結構な悩みではないだろうか。もちろん既に社内で画像データセットが整っている場合は別だが出来る限り時間をかけたくない作業だろう。

例えば、以下のサイトではあらかじめ利用できる公開データセットが提供されいている。
https://deeplearning4j.org/opendata
http://deeplearning.net/datasets/

便利だが種類や枚数等に制限があるため場合によってはオレオレデータセットを作成したいケースもあるだろう。そんな時に便利なのがBing Image Search APIだ。Azure でBing Image Search APIを利用する場合はAPI TypeにBing Search APIを指定する(下図参照)。お値段は1000calls/$3からでもちろん日本リージョンの選択も可能だ。

 
サーチエンジンでBing Image Search APIのコードを調べると少し古い記事が出てくるので新しいバージョン(2014/04/07時点)に対応したサンプルコードをのせておく。
sushiでヒットした200枚の画像を非同期でダウロードして指定フォルダに保存することができる。

using System;
using System.Net.Http;
using System.Web;
using Newtonsoft.Json.Linq;
using System.Net;

namespace DLImageWithBingSearch
{
    static class Program
    {
        static void Main()
        {
            MakeRequest();
            Console.WriteLine("Hit ENTER to exit...");
            Console.ReadLine();
        }

        static async void MakeRequest()
        {
            var client = new HttpClient();
            var queryString = HttpUtility.ParseQueryString(string.Empty);

            // Request Header
            client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "[作成したCognitive ServicesのKeyを指定]);

            // Request parameters (Please update here)
            string keyword = "sushi"; 
            string path = "C:\\temp\\";      
            queryString["q"] = keyword;     
            queryString["count"] = "200";
            queryString["offset"] = "0";
            queryString["mkt"] = "en-us";
            queryString["safeSearch"] = "Moderate";

            // Generate URI
            var uri = "https://api.cognitive.microsoft.com/bing/v5.0/images/search?" + queryString;

            // Request
            var response = await client.GetAsync(uri);
            response.EnsureSuccessStatusCode();
            var json = await response.Content.ReadAsStringAsync();

            var values = JObject.Parse(json).SelectTokens("value[*].contentUrl");

            // Store Image
            foreach (var url in values)
            {
                Console.WriteLine(url);
                Guid guidValue = Guid.NewGuid();
                path = path + keyword + "_" + guidValue.ToString() + ".jpeg";
                Console.WriteLine(path);            
                WebClient wc = new WebClient();
                wc.DownloadFileAsync(new Uri((string)url), path);
            }
        }
    }
}

Qiita初投稿だが時間をかけるとまた筆不精になる自分がいるので、短時間でPOSTしてフィードバックを頂いて改善していくサイクルにしたいと思う。何かあれば「編集リスクスト」を頂ければ幸いである。(まだ使い方がよくわかっていませんがw)