[PYTHON] Utilisation d'icrawler plus simple pour la collecte de données d'apprentissage automatique

introduction

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.

Installation

pip install icrawler 
   or 
conda install -c hellock icrawler

Exemple d'exécution (recherchez "chat" sur Google et obtenez 100 images)

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.

Facile à utiliser et amélioré

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

la mise en oeuvre

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

Comment utiliser

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

résultat

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.

neko.png

finalement

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

Utilisation d'icrawler plus simple pour la collecte de données d'apprentissage automatique
Ensemble de données pour l'apprentissage automatique
Comment utiliser l'apprentissage automatique pour le travail? 03_Procédure de codage Python
Comment collecter des données d'apprentissage automatique
Comment utiliser l'apprentissage automatique pour le travail? 01_ Comprendre l'objectif de l'apprentissage automatique
scikit-learn Comment utiliser le résumé (apprentissage automatique)
Une introduction à OpenCV pour l'apprentissage automatique
Comment utiliser "deque" pour les données Python
Une introduction à Python pour l'apprentissage automatique
[Mise à jour Ver1.3.1] J'ai créé une bibliothèque de prétraitement de données DataLiner pour l'apprentissage automatique
Comment utiliser l'apprentissage automatique pour le travail? 02_Aperçu du projet de développement AI
Une introduction à l'apprentissage automatique pour les développeurs de robots
Comment utiliser les outils d'analyse de données pour les débutants
[Python] Collectez des images avec Icrawler pour l'apprentissage automatique [1000 feuilles]
[Pour les débutants] Introduction à la vectorisation dans l'apprentissage automatique
J'ai essayé de traiter et de transformer l'image et d'élargir les données pour l'apprentissage automatique
Introduction à l'apprentissage automatique
Créer un ensemble de données d'images à utiliser pour la formation
Script Python de collection d'images pour créer des ensembles de données pour l'apprentissage automatique
À propos du prétraitement des données des systèmes utilisant l'apprentissage automatique
Préparation au démarrage de «Python Machine Learning Programming» (pour macOS)
[Python] J'ai créé un classificateur pour les iris [Machine learning]
xgboost: modèle d'apprentissage automatique efficace pour les données de table
Tout pour que les débutants puissent faire du machine learning
[Python] Enregistrez le PDF de Google Colaboratory sur Google Drive! -Collectons des données pour l'apprentissage automatique
Prétraitement japonais pour l'apprentissage automatique
Une introduction à l'apprentissage automatique
Introduction à l'apprentissage automatique avec scikit-learn - De l'acquisition de données à l'optimisation des paramètres
Vérification des performances du prétraitement des données pour l'apprentissage automatique (données numériques) (partie 2)
Pour ceux qui souhaitent démarrer l'apprentissage automatique avec TensorFlow2
Création d'un outil qui facilite la définition des paramètres des modèles d'apprentissage automatique
Vérification des performances du prétraitement des données pour l'apprentissage automatique (données numériques) (partie 1)
Super introduction à l'apprentissage automatique
À utiliser avec Cabocha pour générer automatiquement des données d'apprentissage "IOB2 tag corpus"
Méthode Newton pour l'apprentissage automatique (de 1 variable à plusieurs variables)
Avant l'introduction à l'apprentissage automatique. ~ Technologie requise pour l'apprentissage automatique autre que l'apprentissage automatique ~
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer Chapitre 10 Introduction à Cupy
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer Chapitre 9 Introduction à scikit-learn
Introduction à la rédaction de notes d'apprentissage automatique
<Pour les débutants> bibliothèque python <Pour l'apprentissage automatique>
Apprentissage automatique dans Delemas (acquisition de données)
Présentation de la bibliothèque d'apprentissage automatique SHOGUN
Informations sur les réunions d'apprentissage automatique pour HRTech
Prétraitement dans l'apprentissage automatique 2 Acquisition de données
[Balisage recommandé pour l'apprentissage automatique # 4] Script d'apprentissage automatique ...?
Prétraitement dans l'apprentissage automatique 4 Conversion de données
Procédure d'apprentissage automatique de base: ② Préparer les données
J'ai créé un conteneur Docker pour utiliser JUMAN ++, KNP, python (pour pyKNP).
Méthode de mise en œuvre spécifique pour ajouter les données de performances passées des chevaux à la quantité de fonctionnalités d'apprentissage automatique
Recherche de blogs techniques par machine learning en mettant l'accent sur la "facilité de compréhension"
Prédiction des données en un clic pour le champ réalisée par apprentissage automatique entièrement automatique
Prenons la version gratuite "Introduction à Python pour l'apprentissage automatique" en ligne jusqu'au 27/04
J'ai commencé l'apprentissage automatique avec Python (j'ai également commencé à publier sur Qiita) Préparation des données
Introduction à l'apprentissage automatique: fonctionnement du modèle
L'espace de travail Emacs perspective.el est plus facile à utiliser
Faciliter l'utilisation de la fonction clic de SikuliX
Amplifiez les images pour l'apprentissage automatique avec Python
Enregistrez les étapes pour comprendre l'apprentissage automatique
Premiers pas pour les débutants en apprentissage automatique (IA)