この記事では、Icrawlerを使って画像を大量にダウンロードする方法を解説します。
Icrawler
は、検索エンジンや Flickr から画像を一括でダウンロードできる外部ライブラリです。例えば、機械学習のトレーニング用の画像が集めたい時などに使えます。
それでは、Icrawler
の使い方を見てきましょう!
- Python 3.5以降 推奨
インストール
Icrawler
は、pip
でインストールできます。
pip install icrawler
使ってみる
まずは簡単なコードを見てみましょう!
from icrawler.builtin import GoogleImageCrawler
# 検索エンジンクローラーの生成(今回はグーグル)
google_crawler = GoogleImageCrawler(storage={'root_dir': 'images'})
# クロール開始
google_crawler.crawl(keyword='犬', max_num=5)
上記コードを実行すると犬の写真が指定したディレクトリに5枚ダウンロードされます。
このように簡単に任意のキーワードの画像を収集することができます。
クローラー
Icrawler
を使用するにはクローラーを使います。先程の「使ってみる」では、Googleクローラーを生成していました。
from icrawler.builtin import GoogleImageCrawler
google_crawler = GoogleImageCrawler(storage={'root_dir': 'images'})
Icrawler
には以下のようなクローラーが用意されています。
この記事ではGoogleクローラーをメインに解説していきます。他のクローラーを使いたい方は以下のサイトを参考にしてください。
LinkBuilt-in crawlers — icrawler 0.6.6 documentation
スレッド数の変更
feeder_threads
引数でフィーダー、parser_threads
引数でパーサー、downloader_threads
引数でダウンローダーのスレッド数を変更することができます。
GoogleImageCrawler(
feeder_threads=2,
parser_threads=2,
downloader_threads=4
)
保存場所の変更
クローラーのstorage
引数を指定することでダウンロードした画像を保存する場所を変更できます。storage
引数は辞書なのでkey
とvalue
を指定する必要があります。
key
には'root_dir'
を指定し、value
には保存場所を文字列で指定します。
# 保存するディレクトリ名
dirname = '保存場所'
crawler = GoogleImageCrawler(storage={'root_dir': dirname})
クロール
クローラーからcrawl()
メソッドを実行することでクロールを開始することができます。このメソッドは、フィーダー、パーサー、ダウンロードを開始し、すべてのスレッドが終了するまで待ちます。
def crawl(
keyword: Any,
filters: Any | None = None,
offset: int = 0,
max_num: int = 1000,
min_size: Any | None = None,
max_size: Any | None = None,
language: Any | None = None,
file_idx_offset: int = 0,
overwrite: bool = False
) -> None
以下のような引数が定義されています。
keyword | ダウンロードする画像のキーワード。 |
---|---|
filters | ダウンロードする画像の条件。後述。 |
offset | 開始インデックスを示す整数。 |
max_num | クロールする画像の最大数を表す整数。 |
min_size | 最小サイズ。タプルで指定(480, 300)とか。 |
max_size | 最大サイズ。タプルで指定(1280, 720)とか。 |
language | GoogleImageCrawler を使用する場合に言語を指定できる。 |
file_idx_offset | 整数を設定するとファイル名はfile_idx_offset + 1 から始まる。 |
overwrite | 同名ファイルが存在する場合に上書きするかどうか。 |
例えば、以下のような感じで指定できます。
# 猫の画像を探す
keyward = '猫'
# クロール数
max_num = 10
# 最小サイズ
min_size = (160, 90)
# 最大サイズ
max_size = (1280, 720)
# 言語
language = 'jp'
# ファイル名のオフセット
file_idx_offset = 10
# 上書きするかどうか
overwrite = True
# クロール開始
google_crawler.crawl(
keyword=keyward, max_num=max_num, min_size=min_size,
max_size=max_size, language=language,
file_idx_offset=file_idx_offset, overwrite=overwrite)
フィルターの設定
フィルターを設定することでタイプや色、サイズや日付によってクロールしたデータをダウンロードするか決定することができます。
フィルターは検索エンジンごとに使えるオプションが異なります。ここではGoogleクローラーをメインに解説していきます。他のクローラーを使う場合は以下のサイトを参考にしてください。
LinkSearch engine crawlers - Built-in crawlers — icrawler 0.6.6 documentation
フィルターは辞書で指定します。以下のような key と value が設定できます。
type | photo、face、clipart、linedrawing、animated |
---|---|
color | color、blackandwhite、transparent、red、orange、yellow、green、teal、blue、purple、pink、white、gray、black、brown |
size | large、medium、icon または 指定されたサイズより大きい場合は「>640x480」、同じ場合は「=640x480」、小さい場合は「<640x480」 |
license | noncommercial、commercial、noncommercial,modify、commercial,modify |
date | pastday、pastweek または タプルで指定します ((2022, 1, 1), (2023, 1, 1)) |
例えば以下のコードでは、色が黒っぽく、サイズが640x480より大きく、2022,1,1 ~ 2023,1,1 の間の画像をダウンロードします。
# 猫の画像を探す
keyward = '猫'
# クロール数
max_num = 10
# フィルター
filters = dict(
color='black',
size='>640x480',
date=((2022, 1, 1), (2023, 1, 1))
)
# クロール開始
google_crawler.crawl(keyword=keyward, max_num=max_num, filters=filters)
まとめ
この記事では、Icrawler
を使って画像をダウンロードする方法を解説しました。
画像を一枚一枚ダウンロードするとめちゃくちゃめんどくさいのでIcrawler
を使って一括でダウンロードしちゃいましょう!
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ
参考Welcome to icrawler — icrawler 0.6.6 documentation