Pythonで画像クローラーを作成する方法 | iCrawlerを活用して効率的な画像収集を実現する
![アイキャッチ画像](https://tech.aru-zakki.com/wp-content/uploads/2023/07/eyecatch10.jpg)
はじめに
ディープラーニングを行う場合は画像が必要となります。色々なところで紹介されていますが、icrawlerを使うと、Bing, Googleなどから一括して画像を取得することができます。ディープラーニングのモデルを動かしてみたいとかそういう場合に画像が欲しい場合がありますが、これを使うと簡単に画像を集めることができます(迷惑がかからない範囲で使うのが良いと思います)。
icrawlerとは
icrawlerは、軽量のWebクローラで、メディアデータ・テキスト・その他のファイルをダウンロードするためのミニフレームワークです。icrawlerの公式ドキュメントはこちらです。
icrawlerでは、Filckr, Google, Bing, Baiduなどの検索エンジンから画像をダウンロードするための組み込みクローラが提供されていて、これを使うことで簡単に画像をダウンロードすることができます。
![](https://tech.aru-zakki.com/wp-content/uploads/2023/06/tabbycat.png)
クローラ(crawler)とは、超簡単に説明すると、Webサイトや画像・動画、テキストファイルなどのデータを収集するプログラムのことです
インストール方法
python環境があれば、インストールは非常に簡単で、以下を実行するだけです。
pip install icrawler
使い方(とりあえず使う場合はここだけ見ればOK)
とりあえず、サクッと使ってみたい場合は以下のコードを実行してください。
from icrawler.builtin import GoogleImageCrawler
google_crawler = GoogleImageCrawler(
storage={'root_dir': 'images'})
google_crawler.crawl(keyword='cat', max_num=100)
これだけで、Googleの画像検索で’cat’を検索した結果画像が100枚、imagesフォルダに保存されます。超簡単です。実際にスクリプトを実行したフォルダの直下のimageフォルダに100枚の猫画像が保存されていることが確認できました。
![](https://tech.aru-zakki.com/wp-content/uploads/2023/07/google-search-cat-836x1024.png)
色々なパラメータとか
ビルトインクローラにはいくつかありますが、ここでは、GoogleImageCrawlerとBingImageCrawlerのパラメータについて書いておきます。クローラでは、引数を使って色々指定することができます。
公式ぺーじのサンプルでは以下のようなコードが記載されており、画像の条件などを細かく指定できることが分かります。コードを見るとfiltersは辞書形式で先に定義しているみたいで、このような使い方が想定されていると思われます。
google_crawler = GoogleImageCrawler(
feeder_threads=1,
parser_threads=1,
downloader_threads=4,
storage={'root_dir': 'your_image_dir'})
filters = dict(
size='large',
color='orange',
license='commercial,modify',
date=((2017, 1, 1), (2017, 11, 30)))
google_crawler.crawl(keyword='cat', filters=filters, offset=0, max_num=1000,
min_size=(200,200), max_size=None, file_idx_offset=0)
以下は、GoogleImageCrawler
、BingImageCrawler
の引数です。これらの関数を呼び出すとクローラのオブジェクトが生成されます。
GoogleImageCrawler
, BingImageCrawler
のパラメータ
パラメータ名 | 説明 |
feeder_threads | フィーダーのスレッド数 |
parser_threads | パーサーのスレッド数 |
downloader_threads | ダウンローダーのスレッド数 |
storage | ダウンロードした画像を保存する場所を指定。辞書型で{'root_dir': pathname } の形で指定する。pathnameは任意のフォルダ名 |
以下は、クローラオブジェクトのcrawl
関数の引数です。
crawl()
のパラメータ一覧
パラメータ名 | 説明 |
keyword | ダウンロードする画像のキーワード |
filters | ダウンロードする画像の条件(filterオプション参照)。辞書型で設定 |
offset | 開始インデックス |
max_num | クロールする画像の最大数 |
min_size | 最小サイズ。タプルで指定。ex. (640, 480) |
max_size | 最大サイズ。タプルで指定。ex. (640, 480) |
file_idx_offset | ファイル名の開始番号 |
filtersパラメータは、辞書型で取得する画像の条件を細かく設定が可能です。ダウンロードした画像を商用りようしたい場合などには、licenseパラメータが有用かもしれません。
![](https://tech.aru-zakki.com/wp-content/uploads/2023/06/tabbycat.png)
commercial
を指定した場合に、実際に商用利用なものだけダウンロードできるのかは確認してません。
あと、date
パラメータで期間を指定できるのは便利です。
filterオプション一覧
パラメータ | 説明 | |
GoogleImageCrawler | 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”, or larger than a given size (e.g. “>640×480”), or exactly is a given size (“=1024×768”) | |
lisence | “noncommercial”(labeled for noncommercial reuse), “commercial”(labeled for reuse), “noncommercial,modify”(labeled for noncommercial reuse with modification), “commercial,modify”(labeled for reuse with modification). | |
date | “pastday”, “pastweek” or a tuple of dates, e.g. ((2016, 1, 1), (2017, 1, 1)) or ((2016, 1, 1), None) . | |
BingImageCrawler | type | “photo”, “clipart”, “linedrawing”, “transparent”, “animated”. |
color | “color”, “blackandwhite”, “red”, “orange”, “yellow”, “green”, “teal”, “blue”, “purple”, “pink”, “white”, “gray”, “black”, “brown” | |
size | “large”, “medium”, “small” or larger than a given size (e.g. “>640×480”). | |
lisence | “creativecommons”, “publicdomain”, “noncommercial”, “commercial”, “noncommercial,modify”, “commercial,modify”. | |
layout | “square”, “wide”, “tall”. | |
people | “face”, “portrait”. | |
date | “pastday”, “pastweek”, “pastmonth”, “pastyear”. |
まとめ
以上、icrawlerを使って、画像をgoogle検索してダウンロードする方法について解説しました。
ディープラーニングなどを行う場合は、画像を集める(ダウンロードする)作業がかなり面倒です。このようなクローラを使って一括ダウンロードするのはアリだと思います。
まぁ、使いすぎは良くない気もするので、利用は計画的に。