L'icrawler de la bibliothèque Python est utile pour collecter des données d'image pour l'apprentissage automatique, et dans l'exemple officiel, il peut être installé et implémenté extrêmement facilement, comme indiqué ci-dessous.
pip install icrawler
or
conda install -c hellock icrawler
from icrawler.builtin import GoogleImageCrawler
google_crawler = GoogleImageCrawler(storage={'root_dir': 'your_image_dir'})
google_crawler.crawl(keyword='cat', max_num=100)
De cette façon, vous pouvez obtenir une image en seulement trois lignes.
Les deux points suivants ont été ajoutés pour faciliter son utilisation. ①. Je souhaite spécifier plusieurs mots de recherche (externes) ②. Je ne veux pas d'images en double
Pour (1), écrivez le mot recherché ligne par ligne dans un fichier texte externe et implémentez-le en le lisant. Concernant (2), en décrivant l'URL de l'image dans le nom du fichier, elle est automatiquement ignorée lors de l'enregistrement de la même image.
filesystem.py
class FileSystem(BaseStorage):
"""Use filesystem as storage backend.
The id is filename and data is stored as text files or binary files.
"""
def __init__(self, root_dir):
self.root_dir = root_dir
def write(self, id, data):
filepath = osp.join(self.root_dir, id)
folder = osp.dirname(filepath)
if not osp.isdir(folder):
try:
os.makedirs(folder)
except OSError:
pass
mode = 'w' if isinstance(data, six.string_types) else 'wb'
# with open(filepath, mode) as fout:
# fout.write(data)
try:
with open(filepath, mode) as fout:
fout.write(data)
except FileNotFoundError:
pass
Donc, je publierai d'abord l'implémentation ci-dessous.
img_collection.py
import base64
from icrawler import ImageDownloader
from six.moves.urllib.parse import urlparse
from icrawler.builtin import BaiduImageCrawler
from icrawler.builtin import BingImageCrawler
from icrawler.builtin import GoogleImageCrawler
import argparse, os
parser = argparse.ArgumentParser(description='img_collection')
parser.add_argument('--output_dir', default="",type=str, help='')
parser.add_argument('--N', default=10, type=int, help='')
parser.add_argument('--engine', choices=['baidu',"bing","google"],default="bing",type=str, help='')
args = parser.parse_args()
class Base64NameDownloader(ImageDownloader):
def get_filename(self, task, default_ext):
url_path = urlparse(task['file_url'])[2]
if '.' in url_path:
extension = url_path.split('.')[-1]
if extension.lower() not in [
'jpg', 'jpeg', 'png', 'bmp', 'tiff', 'gif', 'ppm', 'pgm'
]:
extension = default_ext
else:
extension = default_ext
# works for python 3
filename = base64.b64encode(url_path.encode()).decode()
return '{}.{}'.format(filename, extension)
def get_crawler(args, dir_name):
if args.engine == "baidu":
crawler = BaiduImageCrawler(downloader_cls=Base64NameDownloader,storage={'root_dir': dir_name })
elif args.engine == "bing":
crawler = BingImageCrawler(downloader_cls=Base64NameDownloader,storage={'root_dir': dir_name })
elif args.engine == "google": # dont work
crawler = GoogleImageCrawler(storage={'root_dir': dir_name })
return crawler
if __name__=="__main__":
# read ini file.
with open('./setting.txt', mode='r', encoding = "utf_8") as f:
read_data = list(f)
print("SELECTED ENGINE : "+args.engine)
for i in range(len(read_data)):
print("SEARCH WORD : "+read_data[i].replace('\n', ''))
print("NUM IMAGES : "+str(args.N))
dir_name = os.path.join(args.output_dir, read_data[i].replace('\n', '').replace(' ', '_'))
#init crawler
crawler = get_crawler(args, dir_name)
crawler.crawl(keyword=read_data[i], max_num=args.N)
Créez setting.txt dans la même hiérarchie que img_collection.py. Un mot de recherche est décrit ici, et dans l'exemple ci-dessous, trois types de mots de recherche sont spécifiés, et il n'est pas nécessaire d'exécuter chacun des trois mots.
setting.txt
Chat Chat
Chat adulte
Enfant chat
Entrez autant de mots de recherche que vous le souhaitez dans setting.txt et exécutez ce qui suit --N: Limite supérieure des images acquises (Max 1000. En fait, 1000 images ne peuvent pas être acquises en raison de la communication ou de la présence / absence de pages) --output_dir: chemin du répertoire de destination de la sortie --engine: moteur de recherche. Choisissez parmi bing et baidu. Google ne fonctionne pas maintenant.
python img_collection.py --N 1000 --output_dir D:\hogehoge\WebCrawler\out --engine bing
Même si le nombre de feuilles acquises est spécifié comme 1000, il semble qu'environ 600 sont effectivement laissées à cause d'erreurs de communication. Pour le moment, vous pouvez obtenir beaucoup d'images de chats. Le répertoire est divisé pour chaque mot de recherche, mais si vous rassemblez les images dans un répertoire, les images dupliquées seront fondamentalement fusionnées car les noms de fichiers sont en conflit.
Les robots d'exploration Web ont des droits délicats, assurez-vous donc de les gérer de manière appropriée en fonction de l'objectif d'utilisation.
Recommended Posts