Blogger Syntax Highliter

Tuesday, December 18, 2018

Azure Cognitive Services Bing Image Search でデータセットを作成する

この記事は Microsoft Azure Advent Calendar 2018 の 11 日目の記事です。 https://qiita.com/advent-calendar/2018/azure

はじめに

こんにちは。みなさん Azure Cognitive Service を使ってますか? Cognitive Service は簡単にAIを自分のアプリケーションに組み込むことができて便利ですよね。ちなみに、僕が好きな Cognitive Service は、Custom Vision (preview) です。少ないデータセットで学習済みモデルを作れるだけでなく、簡単にTensorFlow や ONNX、Docker向けに学習済みモデルをエクスポートできるところが素敵です。

ところで、2017年末から2018年にかけて ImageNet を使った ResNet-50 の学習時間を競うニュースが発表されてましたね。

ディープラーニングの分散学習で世界最高速を達成(2018/11) https://www.sony.co.jp/SonyInfo/News/Press/201811/18-092/

Preferred Networks、深層学習の学習速度において世界最速を実現(2017/11) https://www.preferred-networks.jp/ja/news/pr20171110

こういうのを見ると自分でもImageNetの学習をしてみたくなりますね。ためしにImageNetのデータセットをダウンロードしてみましたが、20%ぐらいのURLがリンク切れになっていました。残念なことに、これからDeep Learningを試したい人は、当時よりも少ないデータセットで学習することになってしまいます。7年ぐらい経つと状況も変わりますよね…。

今回はImageNetのURLだけではなく、同じSynsetsを Azure Cognitive Services Bing Image Search を使って取得してみようと思います。Azure Cognitive ServicesをAIとして使うのではなく、学習のためのデータセットを作るために使います。

Azure Cognitive Services Bing Image Searchの作成

まずは、Microsoft Azureのポータルから、Azure Cognitive Services Bing Image Searchのサービスを作成します。「リソースの作成」から「AI + Machine Learning」の「Bing Search v7」を選択します。

次に、Bing Search v7のリソース設定を行います。「価格レベル」によって使用可能なリクエスト数が決まっているので注意してください。設定が終わったら「作成」を押します。

作成されたサービスを利用するために、APIアクセスに使用するKeyを取得します。「KEY 1」と「KEY 2」の2つのKeyがありますが、どちらのKeyを使っても構いません。2つのKeyを交互に使うことによりアプリで使用している鍵を新しい物に入れ替えることができます。

プログラムの作成

データセットを作成するプログラムを書いていきます。プログラム内で使用しているImageNetのSynsetsリストは以下のURLにあります。

https://gist.github.com/KentaroAOKI/5712515f66d1ec6a92acb3bf0b215a5b

import json
import os
import pandas as pd
import requests
 
def get_bing_images(search_word, offset = 0, count = 50):
    # ここのsubscription_keyにAzure Portalに書かれていたKeyを設定する
    subscription_key = "put here your azure bing search api key"
    search_url = "https://api.cognitive.microsoft.com/bing/v7.0/images/search"
    headers = {"Ocp-Apim-Subscription-Key" : subscription_key}
    params  = {"q": search_word, "mkt": "en-US", "safeSearch": "Moderate", "offset": str(offset), "count": str(count)}
    response = requests.get(search_url, headers=headers, params=params)
    response.raise_for_status()
    search_results = response.json()
    return search_results
 
def main():
    image_search_list = 'ILSVRC2012.csv'
    download_dir = 'download_images'
    number_of_image = 1500
    # Synsetsのリストを読み込む
    search_words = pd.read_csv(image_search_list, header=None, delimiter=',')
    search_words.columns = ['id', 'name']
 
    for index, row in search_words.iterrows():
        print(query)
        query = row['name']
        dir_name = os.path.join(download_dir, str(row['id']).zfill(5))
        if (os.path.exists(dir_name) == False):
            os.makedirs(dir_name)
        # Bingで検索してサムネイル画像のURLを取得
        thumbnail_urls = []
        next_offset = 0
        while(next_offset < number_of_image):
            searched_images_json = get_bing_images(query, offset=next_offset, count=50)
            print('{}/{}'.format(searched_images_json['nextOffset'], searched_images_json['totalEstimatedMatches']))
            next_offset = searched_images_json['nextOffset']
            thumbnail_urls.extend([img["thumbnailUrl"] for img in searched_images_json["value"][:]])
            if (next_offset > searched_images_json['totalEstimatedMatches']):
                break
        # 検索結果で得られたBingのサムネイル画像をダウンロード
        image_no = 0
        for url in thumbnail_urls:
            response = requests.get(url)
            content_type = response.headers['Content-Type']
            save_file = os.path.join(dir_name, str(image_no).zfill(5))
            save_file = save_file + '.' + content_type.split('/')[1]
            with open(save_file, 'wb') as saveFile:
                saveFile.write(response.content)
            image_no = image_no + 1
 
if __name__ == '__main__':
    main()

実行してみる

Pythonの環境を設定した後にプログラムを実行します。 Anacondaの環境を作って必要なパッケージをインストール。

conda create -n py36 python=3.6
activate py36
conda install pandas requests

プログラムを実行する。

python download_synsets_from_azure.py

ダウンロードに時間がかかりますが、それぞれの種類に分けてフォルダが作成され、フォルダの中には、同じ種類の画像が多数格納されます。

さいごに

Azure Cognitive Services Bing Image Search APIに渡す検索クエリは日本語も使用することができますが、英語でクエリを実行したほうが多くの検索結果を得られることができます。日本語圏で使われている文字でも検索結果が少ない場合は英語で検索してみてください。今回はImageNetを例にしましたが、Azure Cognitive Services Bing Image Searchを使えば、独自のデータセットを作成することができます。是非みなさんも使ってみてください。ではー。

Tuesday, December 11, 2018

Windows 10にNVIDIA GPUを使用したDeep Learning環境をインストール。(CUDA10、VS2017、Chainerのインストール)

こんにちは。2017年2月に Windows 10 の Deep Learning モデル開発環境を紹介しましたが、約2年経過し色々環境が変ってますね。RTX 20-も出ましたし。ですので、今回は最新(2018年11月時点)の環境構築方法を紹介します。NVIDIA GPU が搭載された Windows 10 に Chainer をインストールしていきます。

Deep Learning 環境としては Linuxを使用した記事が多く紹介されていますが、Windows 10 は使いやすいディスクトップ環境と NVIDIA GPUを使うことができるので、モデル開発作業環境としては最適だと思います。

Visual Studio 2017 のインストール

まずは、Visual Studio 2017 のビルド環境を整えます。CUDAのコード(特にChainerが使うcupy)をビルドするときに必要になります。今回紹介するDeep Learning環境で GPU を使わない場合は必要ありません。(たまにビルドが必要なPythonパッケージがありますので、インストールしておいたほうがいいと思います)

注意点としては、インストール時に、「C++ ワークロードを使用したデスクトップ開発」を選択することです。以下のページを参考にしてください。

Visual Studio 2017 を使わず、Pythonでビルドだけできればいい人は、以下の Tools for Visual Studio 2017(上と同じサイト)だけでも大丈夫です。インストーラーを立ち上げたら、ワークロードの「Visual C++ Build Tools」を選択します。

  • Tools for Visual Studio 2017

NVIDIA CUDA と cuDNN のインストール

CUDAをインストールする前に最新のNVIDIAドライバをインストールしてください。リリースノートによると CUDA 10.0.130 は、411.31以上のドライバが必要です。

Visual Studio 2017をインストールした後に、CUDA のインストールを行います。CUDAのインストーラーはインストールされている Visual Studio を探して最適な追加パッケージをインストールします。GPUを利用しない場合はCUDAと下記のcuDNNは必要ありません。

次にcuDNNをインストールします。Downloadページから、「Download cuDNN v7.4.1 (Nov 8, 2018), for CUDA 10.0」を選択、次に「cuDNN Library for Windows 10」を選択してダウンロードを行います。ダウンロードしたzipを展開して、CUDAのインストールフォルダ(C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0 )にコピーします。CUDAのフォルダ名称に合わせてcuDNNのファイルをコピーしてください。なお、cuDNNのダウンロードには、ユーザの登録が必要になりますので、先に登録しておいてください。

Pythonのインストール

Chainerを動かすためのプログラミング環境を整えていきます。機械学習をはじめとしたプログラミング言語としてはPythonが人気です。Python環境としてはAnacondaが有名で分析や機械学習を行うためのライブラリも問題なく利用できます。Azure Machine LearningでもAnacondaが使われているようです。

Anacondaは下記のサイトよりダウンロードします。利用しているOSに合わせて適切なパッケージをインストールしてください。ボタンをそのままクリックし続ける(標準の設定)だけで大丈夫です。

python の 環境の作成(Visual Studio 2017対応)

スタートメニューからAnaconda Promptを実行して、環境を作成していきます。環境を作ることで作業環境を分けることができます。

conda create -n py36 python=3.6

環境を作成したら、Anaconda環境で、Visual Studio 2017 を使えるように設定します。 先ほど作成した環境に変えて

activate py36

Visual Studio 2017 を使えるようにパッケージをインストール

conda install -c anaconda vs2017_win-64

これをインストールしておかないと、「 error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools 」のようなエラーメッセージが出てcupyをインストールできません。リンクも違っているし、VS2015も簡単にはダウンロードできないし。

Chainerのインストール

Chainerをインストールします。Chainerは容易に複雑なネットワークを作ることができるDeep Learningのフレームワークです。データによりノードを変えることができる Define by Run が特徴です。あと、質の良いサンプルコードも多く公開されているイメージです。

スタートメニューからAnaconda Promptを実行しますが、Chainerをインストールする前にcupyをインストールします。

インストールする前に環境を先ほど作成した環境に変えておきます。

activate py36

そして、インストール。インストール時に、Visual Studio 2017でビルドされます。

pip install cupy --no-cache-dir

次に、下記のコマンドでChainerをインストールします。

pip install chainer --no-cache-dir

ChainerやCuPyが正しくインストールされたことを確認します。

python -c "import chainer; chainer.print_runtime_info()"

以下のように Runtime Virsion などが取得できれば大丈夫です。

Platform: Windows-10-10.0.17134-SP0
Chainer: 5.0.0
NumPy: 1.15.4
CuPy:
  CuPy Version          : 5.0.0
  CUDA Root             : C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0
  CUDA Build Version    : 10000
  CUDA Driver Version   : 10000
  CUDA Runtime Version  : 10000
  cuDNN Build Version   : 7401
  cuDNN Version         : 7401
  NCCL Build Version    : None
iDeep: Not Available

NVIDIA GPUの状態を知る

実際にDeep Learningの学習を始めるとGPUが熱くなりますが、下記のコマンドを使うことによりGPUの状態を知ることができます。

cd C:\Program Files\NVIDIA Corporation\NVSMI
nvidia-smi.exe

実行すると下記のようにGPUの状態を知ることができます。寒い時期は安心してガンガンぶん回すことができますね。

(py36) C:\Program Files\NVIDIA Corporation\NVSMI>nvidia-smi.exe
Sun Nov 11 09:23:39 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 416.81       Driver Version: 416.81       CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 1070   WDDM  | 00000000:01:00.0  On |                  N/A |
| 27%   24C    P8     7W / 151W |    243MiB /  8192MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

さいごに

最近は、Windows 10 ディスクトップ環境で動くことを確認してから、多くのGPUが使えるAzure DSVMなどのクラウド環境で学習させてます。(2日ぐらいの学習であればディスクトップ環境でもいですが、他のことができなくなるので)LinuxでもWindowsでも動くPythonコードを書くように心がけるのが大事です。

あと、画像を使う場合はOpenCVなどを使いますが、下記のコマンドでインストールすることができます。

conda install opencv

CUDA 10になったし、GeForce RTX 20- も使えるようになったし、TensorCore も使える環境になりましたね!あとは、GPUを買うだけですね!d(´∀`*) ではー。