GANのデータセットとしてIMDb-Faceのデータをダウンロードする方法

2019年9月25日

IMDb-Faceとは

 IMDb-Faceとは、主にGANで使用する訓練用の画像データのセットです。映画のスクリーンショットやポスターから抽出した画像に人手でアノテーションを加えたものです。登録等の手順が不要でデータをダウンロードできるのが魅力です。
 ただし、中にはポスターの画像など、人の顔以外の画像も混ざっているので不要な場合は取り除く必要があります。ダウンロードは、ここからできます。
 ダウンロードを選択すると、IMDb-Face.csvというファイルがダウンロードされてきます。

スクレイピング

 IMDb-Face.csvファイルには、画像の幅、高さ、画像の取得先のURLが記載されています。このURLをブラウザに入力すると、その画像をダウンロードできます。
 しかし、データ数が17万件ぐらいあるので、全部取得しようとすると相当な時間がかかります。そこでスクレイピングのコードを実行すれば、自動でURL先の画像を入手してくれます。スクレイピングとは、URL上にある画像データを取得するためのプログラムです。言語はPythonを使用します。IMDb-Face.csvのファイルを読み取って画像をダウンロードしてくれるコードは以下になります。

ファイル名:imdbscrape.py


import urllib.request as ureq
import time

# URLからファイル名を取得
def GetFileName(url):
    list = url.split('/')
    fileName = list[len(list) - 1]

    # 拡張子をjpgにする
    templist = fileName.split('.')
    kakutyoshi = templist[len(templist) - 1]

    if kakutyoshi != 'jpg':
        fileName = fileName.replace(kakutyoshi, 'jpg')

    return fileName

isFirst = False
PNG_ROW = 5

# (1)csvファイルを開く
with open('IMDb-Face.csv', 'r', encoding='utf-8') as fp:
    # 1行ずつ読む
    for line in fp:
        # 先頭は読み取らない
        if isFirst == False:
            isFirst = True
            continue

        line = line.strip() # 改行を削除
        cols = line.split(',')  # カンマ区切り

        # (2)ファイルのURLを取得
        url = cols[PNG_ROW]

        # (3)保存先のファイル名を取得
        saveFile = 'image' + '/' + GetFileName(url)
        print('Donwload:' + url)

        # (4)指定したURLからファイルをダウンロード
        try:
            ureq.urlretrieve(url, saveFile)
            # (5) 10秒間待ってから次のスクレイピングを行う
            time.sleep(10)
        except:
            print('Failted to downloading')

print("Finish to download")

 上のコードをざっと説明します。事前準備として、このPythonのコードと同じ場所に、IMDb-Face.csvファイル、及びimageフォルダを作成しておく必要があります。

 まず、(1)では、IMDb-Face.csvファイルの読み取りを行っています。このファイルは、1行目はヘッダーのため、読み込まないようにしています。

 (2)では、csvファイルから読み取ったURL情報を取得しています。csv内でURLのデータは6列目にあるので、0から数えたインデックスは5になります。

 (3)では、保存先のファイル名を、画像ファイルのURLを元にGetFileName関数を使って取得しています。GetFileName関数は、最初にURLからファイル名を取得します。URLは、「/」区切りで一番最後に画像ファイル名が付いているため、split関数で「/」区切りの配列を作成し、その配列の末尾を画像ファイル名として取得しています。また、取得したファイルの中には拡張子が「jpg」になっていないものもあります。そのままでは画像を開くことができないため、拡張子がjpgでないものはreplace関数を使って強制的に「jpg」の拡張子に置き換えます。

 (4)では、urllib.requestモジュールのurlretrieve関数より、指定したURL先からファイルをダウンロードし、指定した保存ファイル名でファイルの保存を行います。ただし、画像URLのリンクが切れているとエラーで強制終了してしまうため、途中で中断しないようにtry-exceptを入れています。こうすると、リンク切れ等のエラーが発生したとき、エラーメッセージが表示されますが、そのファイルは飛ばして処理を継続します。

 2019/09/25追記
 (5)に10秒待ってから次のスクレイピングの処理を行うよう処理を追加しました。何故これが必要になるかというと、待ち時間なしでスクレイピングを行うとダウンロード対象のサイトに短時間でアクセスを繰り返し、サーバーに負荷をかけてしまうためです。

 このプログラムをコマンドプロンプト上で以下のように実行します。
 
 python imdbscrape.py

 実行すると、作成したimageフォルダの中にダウンロードした画像ファイルを保存することができます。

スポンサードリンク