[PYTHON] Die Verwendung von icrawler zum Sammeln von Daten zum maschinellen Lernen wurde vereinfacht

Einführung

Der icrawler der Python-Bibliothek ist nützlich zum Sammeln von Bilddaten für maschinelles Lernen. Im offiziellen Beispiel kann er wie unten gezeigt sehr einfach installiert und implementiert werden.

Installation

pip install icrawler 
   or 
conda install -c hellock icrawler

Ausführungsbeispiel (Suche bei Google nach "Katze" und erhalte 100 Bilder)

from icrawler.builtin import GoogleImageCrawler

google_crawler = GoogleImageCrawler(storage={'root_dir': 'your_image_dir'})
google_crawler.crawl(keyword='cat', max_num=100)

Auf diese Weise erhalten Sie ein Bild in nur drei Zeilen.

Einfach zu bedienen und verbessert

Die folgenden zwei Punkte wurden hinzugefügt, um die Verwendung zu vereinfachen. ①. Ich möchte mehrere Suchwörter angeben (extern) ② Ich möchte keine doppelten Bilder

Beschreiben Sie für (1) das Suchwort zeilenweise in einer externen Textdatei und implementieren Sie es durch Lesen. In Bezug auf (2) wird die URL des Bildes im Dateinamen automatisch übersprungen, wenn dasselbe Bild gespeichert wird.

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

Implementierung

Daher werde ich zuerst die unten stehende Implementierung veröffentlichen.

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)

Erstellen Sie settings.txt in derselben Hierarchie wie img_collection.py. Hierin wird ein Suchwort beschrieben, und im folgenden Beispiel werden drei Arten von Suchwörtern angegeben, und es ist nicht erforderlich, jedes der drei Wörter auszuführen.

setting.txt


Katze
Katze erwachsen
Katzenkind

Wie benutzt man

Geben Sie in settings.txt so viele Suchwörter ein, wie Sie möchten, und führen Sie Folgendes aus --N: Obergrenze der erfassten Bilder (Max1000. Tatsächlich können 1000 Bilder aufgrund von Kommunikation oder Vorhandensein / Fehlen von Seiten nicht erfasst werden.) --output_dir: Pfad des Ausgabeverzeichnisses ausgeben --engine: Suchmaschine. Wählen Sie aus Bing und Baidu. Google funktioniert jetzt nicht.

python img_collection.py  --N 1000 --output_dir D:\hogehoge\WebCrawler\out --engine bing

Ergebnis

Selbst wenn die Anzahl der erfassten Blätter mit 1000 angegeben ist, scheinen aufgrund von Kommunikationsfehlern tatsächlich etwa 600 übrig zu sein. Vorerst können Sie viele Bilder von Katzen bekommen. Das Verzeichnis wird für jedes Suchwort aufgeteilt. Wenn Sie die Bilder jedoch in einem Verzeichnis zusammenfassen, werden die doppelten Bilder grundsätzlich zusammengeführt, da die Dateinamen in Konflikt stehen.

neko.png

Schließlich

Webcrawler haben heikle Rechte. Behandeln Sie sie daher entsprechend dem Verwendungszweck entsprechend.

Recommended Posts

Die Verwendung von icrawler zum Sammeln von Daten zum maschinellen Lernen wurde vereinfacht
Datensatz für maschinelles Lernen
Wie nutzt man maschinelles Lernen für die Arbeit? 03_Python-Codierungsverfahren
Sammeln von Daten zum maschinellen Lernen
Wie nutzt man maschinelles Lernen für die Arbeit? 01_ Den Zweck des maschinellen Lernens verstehen
scikit-learn Verwendung der Zusammenfassung (maschinelles Lernen)
Eine Einführung in OpenCV für maschinelles Lernen
Verwendung von "deque" für Python-Daten
Eine Einführung in Python für maschinelles Lernen
[Ver1.3.1 Update] Ich habe DataLiner erstellt, eine Datenvorverarbeitungsbibliothek für maschinelles Lernen.
Wie nutzt man maschinelles Lernen für die Arbeit? 02_AI Entwicklungsprojektübersicht
Eine Einführung in maschinelles Lernen für Bot-Entwickler
Verwendung von Datenanalysetools für Anfänger
[Python] Sammeln Sie Bilder mit Icrawler für maschinelles Lernen [1000 Blatt]
[Für Anfänger] Einführung in die Vektorisierung beim maschinellen Lernen
Ich habe versucht, das Bild zu verarbeiten und zu transformieren und die Daten für maschinelles Lernen zu erweitern
Einführung in das maschinelle Lernen
Erstellen Sie einen Datensatz mit Bildern, die für das Training verwendet werden sollen
Bildersammlung Python-Skript zum Erstellen von Datensätzen für maschinelles Lernen
Informationen zur Datenvorverarbeitung von Systemen, die maschinelles Lernen verwenden
Vorbereitung zum Starten von "Python Machine Learning Programming" (für macOS)
[Python] Ich habe einen Klassifikator für Iris erstellt [Maschinelles Lernen]
xgboost: Effektives Modell für maschinelles Lernen für Tabellendaten
Alles für Anfänger, um maschinelles Lernen zu können
[Python] Speichern Sie PDF von Google Colaboratory in Google Drive! -Lass uns Daten für maschinelles Lernen sammeln-
Japanische Vorverarbeitung für maschinelles Lernen
Eine Einführung in das maschinelle Lernen
Einführung in das maschinelle Lernen mit scikit-learn-Von der Datenerfassung bis zur Parameteroptimierung
Leistungsüberprüfung der Datenvorverarbeitung für maschinelles Lernen (numerische Daten) (Teil 2)
Für diejenigen, die mit TensorFlow2 maschinelles Lernen beginnen möchten
Erstellt ein Tool, mit dem Sie bequem Parameter für Modelle des maschinellen Lernens festlegen können
Leistungsüberprüfung der Datenvorverarbeitung für maschinelles Lernen (numerische Daten) (Teil 1)
Super Einführung in das maschinelle Lernen
Generieren Sie mithilfe von Cabocha automatisch "IOB2-Tag-Corpus" -Lerndaten
Python-Lernnotiz für maschinelles Lernen von Chainer Kapitel 8 Einführung in Numpy
Newton-Methode für maschinelles Lernen (von 1 Variablen zu mehreren Variablen)
Vor der Einführung in das maschinelle Lernen. ~ Techniken, die für anderes maschinelles Lernen als maschinelles Lernen erforderlich sind ~
Python-Lernnotiz für maschinelles Lernen von Chainer Kapitel 10 Einführung in Cupy
Python-Lernnotiz für maschinelles Lernen von Chainer Kapitel 9 Einführung in das Scikit-Lernen
Einführung in das maschinelle Lernen Schreiben von Notizen
<Für Anfänger> Python-Bibliothek <Für maschinelles Lernen>
Maschinelles Lernen in Delemas (Datenerfassung)
Einführung in die Bibliothek für maschinelles Lernen SHOGUN
Informationen zum maschinell erlernten Meeting für HRTech
Vorverarbeitung beim maschinellen Lernen 2 Datenerfassung
[Empfohlenes Tagging für maschinelles Lernen # 4] Skript für maschinelles Lernen ...?
Vorverarbeitung beim maschinellen Lernen 4 Datenkonvertierung
Grundlegendes maschinelles Lernverfahren: ② Daten vorbereiten
Ich habe einen Docker-Container erstellt, um JUMAN ++, KNP, Python (für pyKNP) zu verwenden.
Spezifische Implementierungsmethode zum Hinzufügen früherer Leistungsdaten von Pferden, um die Menge des maschinellen Lernens zu bestimmen
Suchen Sie nach technischen Blogs durch maschinelles Lernen mit dem Schwerpunkt "Verständlichkeit"
Ein-Klick-Datenvorhersage für das Feld, realisiert durch vollautomatisches maschinelles Lernen
Lassen Sie uns die kostenlose "Einführung in Python für maschinelles Lernen" bis zum 27. April online stellen
Ich habe mit Python mit dem maschinellen Lernen begonnen (ich habe auch angefangen, in Qiita zu posten). Datenvorbereitung
Einführung in das maschinelle Lernen: Funktionsweise des Modells
Der Arbeitsbereich von Emacs perspektive.el ist einfacher zu verwenden
Vereinfachen Sie die Verwendung der Klickfunktion von SikuliX
Verstärken Sie Bilder für maschinelles Lernen mit Python
Notieren Sie die Schritte zum Verständnis des maschinellen Lernens
Erste Schritte für Anfänger des maschinellen Lernens (KI)