flickr APIで富士山の画像を自動取得


Udemyで【画像判定AIアプリ開発・パート2】Django・TensorFlow・転移学習による高精度AIアプリ開発を受講した。オリジナルの機械学習プログラムを作る際に、インターネット上から画像を取得するのが非常に手間だと感じていたので、画像取得自動化の方法を記録しておく。

flicker APIのKey取得

flickerのホームページ
→ フッターのナビゲーションバーからDevelopersを選択
→ 画面上部からAPIを選択
→ Getting Startedの①にあるRequest an API keyを選択
→ ①のGet your API keyにあるRequest an API keyを選択
→ 商用利用ではないので、APPLY FOR A NON-COMMERCIAL KEYを選択
→ 作りたいアプリケーションの名前、アプリケーションの説明を入力
→ チェックボックスを埋めて、SUBMITを選択
→ KeyとSecretの取得完了!

画像をダウンロードするPythonファイル

これから目的の画像を取得する。

flickr APIのパッケージを仮想環境内にインストールする。私はAnaconda仮想環境を使っており、パッケージのインストールにはpip installではなくconda installを使うようにしているが、Anaconda Cloudで「flickrapi」で検索しても情報がほとんどなかったため、pip installを使った。(それっぽいパッケージもあるにはあるが、300ダウンロードにも満たないものだったので避けた。)

$ pip install flickrapi

今回はdownload.pyというファイルで富士山の画像のダウンロードを自動でおこなう。download.pyと同じディレクトリにdataというディレクトリを作成し、さらにその内部にmt.fujiというディレクトリを作成した。このmt.fujiの中に画像をダウンロードする。ソースコードは以下の通りである。

from flickrapi import FlickrAPI
from urllib.request import urlretrieve
import os, time, sys

key ="**************************"  # 先ほど取得したKeyをコピー&ペースト
secret = "****************"  # 先ほど取得したSecretをコピー&ペースト
wait_time = 1

keyword = sys.argv[1]
savedir = "./data/" + keyword

flickr = FlickrAPI(key, secret, format='parsed-json')
result = flickr.photos.search(
    text = keyword,
    per_page = 400,
    media = 'photos',
    sort = 'relevance',
    extras = 'url_q, license',
    )

photos = result['photos']

for i, photo in enumerate(photos['photo']):
    url_q = photo['url_q']
    filepath = savedir + '/' + photo['id'] + '.jpg'
    if os.path.exists(filepath):
        continue
    urlretrieve(url_q, filepath)
    time.sleep(wait_time)

このように書いたうえでターミナルで

$ python download.py mt.fuji

と入力すると画像のダウンロードが始まる。数分後、mt.fujiの中身を確認すると、以下のように画像がダウンロードされている。

これで、画像を手作業でダウンロードするという手間を大幅に省くことができた。しかしこのままでは関係ない画像も多く混じっているため、もっと工夫が必要である。