前のパートに戻る 完了して次のパートへ  

  1-2 Flickrから画像データをダウンロードしよう

Flickrから画像データをダウンロードしよう


このレクチャーでは、画像共有サービスサイトFlickrのAPIを使用して、画像分類AIモデルのトレーニングに使用する画像ファイルを検索し、クローリングを実行して画像ファイルをローカルマシンに保存していきます。


FlickerのAPIキーを作成しよう


画像共有サービスのFlickrを使って、画像をキーワードで検索し、検索結果から画像のURLを取り出して、画像ファイルをクローリングで集めていきます。

FlickrAPIについての情報は下記のURLのページから参照できます。

https://www.flickr.com/services/api/

PythonのコードからFlickrのAPI(外部からプログラムを呼び出して使用する仕組み)にアクセスするために、まずは下記のコマンドでFlickrAPIのPythonパッケージをインストールしましょう。

前の章で有効化した仮想環境内で

$ pip install flickrapi

を実行し、FlickrAPIパッケージをインストールします。

今後、パッケージが見つからないと言われた場合には

$ pip install パッケージ名

として不足しているパッケージを追加しましょう


APIキーを取得しよう


https://www.flickr.com/services/api/

の左上にある「Create an App」 のリンクをクリックすると

https://www.flickr.com/services/apps/create/

のページが表示されます。その中にある「Request an API Key」をクリックしてAPIキーの取得申請を行いましょう。

リンクをクリックすると、Yahoo!のアメリカのサイトが開きます。Yahoo!Japanのアカウントとは別途登録が必要です。

アカウントを作成したら、ログインして進みましょう。

すると、キーの種類を確認されるので、「APPLY FOR A NON-COMMERCIAL KEY」ボタンをクリックしましょう。

次に

  • アプリの名前(例:animalclassify)
  • 詳細(どのようなアプリを作るのか?)(例: create app to classify animal images)
  • 著作権違反をしない誓約に合意(チェックを入れる)
  • 利用条件に合意する(チェックを入れる)

を入力し「SUBMIT」ボタンをクリックしましょう。

すると、アクセスキーとパスワードが発行されますので、テキストファイルなどに記録しておきましょう。このキーのセットは後ほどPythonプログラムからFlickr APIにアクセスするときに使用します。


ダウンロードプログラムを作成しよう


FlickrAPIにアクセスして画像ファイルを検索し、順にデータをダウンロードするプログラムを作成していきます。

まずは今回のプログラムを保存するためのフォルダー(intro_deep_learning)を作成し、gen_data.pyという名前でファイルを新規に作成します。

intro_deep_learning
└── gen_data.py #新規作成

下記にサンプルコードを示します。

まずは必要なライブラリやクラス定義をインポートしましょう。

from flickrapi import FlickrAPI #FlikcrAPIクライアントのクラス定義
from urllib.request import urlretrieve #コマンドラインからhttp通信をする関数
import os, time, sys #Pythonからシステムにアクセスする関数, タイマー関数

APIキーとsecretをセットします。wait_timeはAPIの負荷を下げるために画像の取得リクエストを送信するインターバルを1秒にセットします。

# APIキーの情報
key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
secret = "xxxxxxxxxxxxxxxxxxxxx"
wait_time = 1 #リクエストを発行するインターバル

クローリングしたファイル群を保存するフォルダーを指定します。

# 保存フォルダの指定
animalname = sys.argv[1] #コマンドラインで2番目の引数を取得
savedir = "./" + animalname #引数で与えた単語名でフォルダーを作成

FlickrAPIのクライアントオブジェクトを生成し, search関数で検索を実行します。

# APIクライアントオブジェクトを生成
flickr = FlickrAPI(key, secret, format='parsed-json') 

# 検索を実行して、結果をresultに格納
result = flickr.photos.search(
    text = animalname, //検索ワード
    per_page = 400, //検索数上限
    media = 'photos', //データタイプ
    sort = 'relevance', //結果表示順, 最新から
    safe_search = 1, //子どもに不敵な画像を除外
    extras = 'url_q, licence' //オプション。データURL, ライセンスタイプ
)

検索結果から写真データを取り出し、photos変数に格納しましょう。

# 取得した結果から写真データを取り出してphotosにセットする
photos = result['photos']

続いては画像ファイルのurl_q(画像のダウンロードURL)を取得し、コマンドラインでURLを叩いてファイルを取得するurlretrieveを呼び出して、1秒おきにダウンロードを実行します。

for i, photo in enumerate(photos['photo']):
    url_q = photo['url_q'] #photoオブジェクトからダウンロードURLを取得
    filepath = savedir + '/' + photo['id'] + '.jpg' #ファイル名をフルパスで生成
    if os.path.exists(filepath): continue #ファイルがあれば次へ
    urlretrieve(url_q,filepath) #ファイルダウンロードを実行
    time.sleep(wait_time) #サーバー負荷を考慮して1秒あける

ダウンロードプログラムを実行しよう


上記プログラムをdownload.pyという名前で保存しましょう。

検索キーワードを引数に与えてプログラムを実行すると、カレントディレクトリ以下にキーワード名のフォルダー以下にダウンロードしたファイル群が保存されます。

$ python download.py 検索キーワード

として実行します。

私は、

  • monkey(サル)
  • boar(イノシシ)
  • crow(カラス)

の3つのキーワードで画像の検索, 保存を実行しました。

キーワードはご自身の好みの単語で実行してみてください。ただし、英語のサイトなので、英語でキーワードを指定する必要があります。また、動物でなくても、魚や花, 料理などの種類でもいいでしょう。


データのクレンジングをしよう


ファイルがダウンロードできたら、正解ラベルとしてふさわしくないデータをフォルダーから削除しましょう。

たとえば、私の場合は動物ではない絵画やぬいぐるみ、彫刻物などのデータを削除しました。

機械学習では正解データを与えてモデル(近似式)の最適化を行う「教師あり学習(Supervised Learning)」では、正解データ(教師データ, Ground Truth)に大きく外れた値がない(外れ値が少ない)ことがとても重要です。

今回のサンプルコードでは上限400ファイルを検索し、まずは200枚のデータでトレーニングを実行していきます。

議論

8 質問

このコースの評価は?