この記事では、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には以下のようなクローラーが用意されています。
- Bing
- Baidu
- Flickr
- Webサイトからすべての画像をクロールするクローラー
- URLリストから画像をダウンロードするクローラー
この記事では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


