やりたいこと
機械学習をやっていくにあたって、学習用に画像を大量に取得しなければいけない事がありまして、MicrosoftAzureの画像検索APIを使えば、bingの検索結果から画像を取得できるようなのでやってみました。
query = #検索したい単語を入力してください
dir_name = #結果の保存先のディレクトリ名を指定してください
all_img = 1500 #取得したい画像の数を指定してください(最大数は1500です)
current_dir = #カレントディレクトリを指定してください
ENDPOINT = 'https://api.cognitive.microsoft.com/bing/v7.0/images/search'
HEADERS = { 'Ocp-Apim-Subscription-Key': '自分のAPIキーを入れてください' }
params = {'q': query,
'mkt': 'ja-JP',
'count': 50}
#count毎に分けてAPIから画像のURLを取得し、json形式で得られるので、ロードし
#てリストに加えます
def GetImageUrls(endpoint, headers, params):
ImageUrls = []
for i in range(int(all_img) // params['count']):
offset = i * params['count']
params['offset'] = offset
response_json=requests.get(endpoint
,headers=headers,params=params)
response = json.loads(response_json.text)
for i in range(params['count']):
try:
ImageUrls.append(response['value'][i]['contentUrl'])
except:
continue
return ImageUrls
#保存するディレクトリがなければ作ります
def mkdir(dir_name):
if os.path.isdir(current_dir + '\\' + dir_name) == False:
os.mkdir(current_dir + '\\' + dir_name)
else : pass
#先ほど作ったリストから画像を取得し、jpg形式で書き込みます
def DLimages(ImageUris, dir_name):
mkdir(dirname)
timeout = 5
num_err = 0
num_suc = 0
i = 1
for ImageUrl in ImageUrls:
try:
response_image = requests.get(ImageUrl, timeout=timeout)
image = response_image.content
except requests.exceptions.RequestException:
num_err += 1
continue
with open(current_dir + '\\' + dir_name + '\\' + str(i) + ".jpg", 'wb') as f:
f.write(image)
f.close()
i += 1
num_suc += 1
print('error:' + str(num_err))
print('suc:' + str(num_suc))
#関数を作り終わったので
image_urls = GetImageUrls(ENDPOINT, HEADERS, params)
DLimages(image_urls, dir_name)
以上で、指定したディレクトリに名前が数字のjpg画像が保存されています。
ただし、もともとbingの検索結果が1500もないと少なくなります。
また、画像のurlが指定されていないと追加されません
さらに、jpgだけに指定してしまっているので、結果を見るといくつか開けないファイルが存在します。これを防ぐためには、取得してきた時点でファイル形式を確認し、その形式に合わせて保存しなおす必要があります。