[PYTHON] Kategorisieren Sie Katzenbilder mit ChainerCV

<! - Klassifizieren Sie Katzenbilder mit chainercv -->

Überblick

Mit der maschinellen Lernbibliothek ChainerCV werden ungefähr 2000 Katzenbilder gesammelt, die von der Image-Posting-Site Pixabay gesammelt wurden. Ich habe versucht zu klassifizieren.

pixabay ist eine Website, die Bilder und Videos mit einer ziemlich losen Lizenz namens ~~ CC0 (gemeinfrei) ~~ Pixabay-Lizenz sammelt und veröffentlicht. Einige andere Bilder als Katzen werden tatsächlich in die Bilder gemischt, die durch Angabe von "Katze" als Suchbegriff gesammelt wurden. Letztendlich denke ich, dass es notwendig sein wird, nach menschlicher Kraft zu klassifizieren, aber das Ziel dieses Artikels ist es, zuerst die Dateien unter Verwendung eines vorhandenen trainierten Klassifizierungsmodells für die Vorverarbeitung zu trennen.

ChainerCV

Geschulte Modelle von VGGNet sind weit verbreitet, und es gibt verschiedene Methoden, die sie anwenden. Als ich nach einem Toolkit für die Bildklassifizierung suchte, kam ich zu ChainerCV: Eine Bibliothek für Computer Vision in Deep Learning. Unterstützt Objekterkennung und semantische Segmentierung.

Ich habe den Code geschrieben, um die Dateien damit zu klassifizieren. Es basiert auf dem Inhalt der Probe.

Code

#!/usr/nogpu/bin/python
# -*- coding: utf-8 -*-
import argparse

import chainer

from chainercv.datasets import voc_detection_label_names
from chainercv.links import SSD300
from chainercv import utils
import os

def main():
    chainer.config.train = False

    parser = argparse.ArgumentParser()
    parser.add_argument('--gpu', type=int, default=-1)
    parser.add_argument('--pretrained_model', default='voc0712')
    parser.add_argument('src_dir')
    parser.add_argument('dst_dir')
    args = parser.parse_args()

    model = SSD300(
        n_fg_class=len(voc_detection_label_names),
        pretrained_model=args.pretrained_model)

    if args.gpu >= 0:
        model.to_gpu(args.gpu)
        chainer.cuda.get_device(args.gpu).use()

    file_lists = []
    for f in os.listdir(args.src_dir):
        if not f.startswith("."):
            file_lists.append(f)

    if not os.path.exists(args.dst_dir):
        os.mkdir(args.dst_dir)

    cat_id = voc_detection_label_names.index('cat') #Erhalten Sie einen Index, der der Katze entspricht
    def has_cat(labels):
        for l in labels:
            if type(l) == int:
                if l == cat_id:
                    return True
            for ll in l: #Beschriftungen können ein Array von Arrays zurückgeben
                if ll == cat_id:
                    return True
                
        return False

    print("target file: %d files" % len(file_lists))
    count = 0
    for f in file_lists:
        fname = os.path.join(args.src_dir, f)
        img = utils.read_image(fname, color=True)
        bboxes, labels, scores = model.predict([img])
        if has_cat(labels):
            dst_fname = os.path.join(args.dst_dir, f)
            os.rename(fname, dst_fname)
            count += 1
            print("%d: move from %s to %s" % (count, fname, dst_fname))
    print("%d files moved." % count)
            
if __name__ == '__main__':
    main()

Kommentar

Es gibt verschiedene Methoden, die von ChainerCV unterstützt werden, aber als ich es mit Faster-RCNN und Single-Shot-Multibox-Detektor (Wei Liu et al. "SSD: Single-Shot-Multibox-Detektor" ECCV 2016) ausprobierte, war die SSD Es war schneller, also habe ich damit den Code geschrieben.

Das Pre-Training-Modell wird automatisch heruntergeladen, wenn Sie eine SSD300-Klasseninstanz erstellen. Dieses Mal habe ich "voc0712" gewählt, was dem Demo-Standard entspricht, der an Chainer CV angehängt ist. Dieser Download-Vorgang wird nur bei der ersten Ausführung ausgeführt und unter dem Dateinamen $ HOME / .chainer / dataset / pfnet / chainercv / models / ssd300_voc0712_2017_06_06.npz gespeichert. Dieses Modell unterstützt 20 Klassifizierungsarten. Dieses Modell ist kompatibel mit The PASCAL Visual Object Classes Challenge 2012 (VOC2012).

$ python
>>> from chainercv.datasets import voc_detection_label_names
>>> voc_detection_label_names
('aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor')

Richtigkeit

Auf den ersten Blick sieht es nicht schlecht aus. Zu den zu verarbeitenden Dateien gehören auch andere Katzen als Katzen (Löwen, Leoparden usw.). Da sie jedoch nicht unter VOC2012 fallen, scheinen Katzen und Hunde relativ ähnliche Eigenschaften zu haben. Es scheint, dass es oft als klassifiziert wird.

Aus den als Katzen klassifizierten Ergebnissen haben wir diejenigen ausgewählt, die eindeutig keine Katzen sind. Die Ergebnisse sind unten gezeigt.

Bilddatei Als Katze eingestuft Als anders als Katze eingestuft
Die Katze ist auf dem Bild 1635 70
Die Katze ist nicht auf dem Bild 7 337

Die Genauigkeit scheint hoch genug zu sein, aber im Vergleich zu der Umgebung, in der die Klassifizierungsgenauigkeit im Allgemeinen bewertet wird, da die Mehrheit der Probanden Katzenbilder sind (mäßig vergleichbare Bilder für jedes Etikett). Es ist vielleicht nicht ein bisschen fair zu tun.

Fehleinschätzungsfall

Schauen wir uns einige fehlgeschlagene Fälle an.

Obwohl es wie eine Katze aussieht, wird es als Hund beurteilt

猫を犬と誤判定

Steht das Objekt im Vordergrund im Weg?

前景にオブジェクトあり

網が良くない?

Werden Sie zum Hintergrundurteil gezogen?

背景の人間

Der Kontrast ist nicht gut

背景の人間

Nur Garn

毛糸

Statuen und Kuscheltiere

ぬいぐるみ

Der Fall, in dem die Klassifizierung korrekt ist, aber ich wollte, dass Sie spielen

Die auf dem Bild ist eine Katze (oder etwas, das so aussieht), und die folgenden sind Beispiele für Fälle, in denen Katzen auch als Katzen klassifiziert werden.

Es gibt einige Verhaltensweisen, die in gewissem Sinne korrekt sind, so dass es den Anschein hat, dass diese Dinge nur von Hand klassifiziert werden können.

Reproduktions-Repository

Die URL-Liste, die ich zum Sammeln von Bildern verwendet habe, ist auf github verfügbar. Wenn Sie Bilddaten basierend auf diesen Informationen vorbereiten, können Sie reproduzieren, was Sie in diesem Artikel getan haben.

von jetzt an

Da der erkannte Bereich auch erhalten werden kann, wäre es meiner Meinung nach schön, eine Verarbeitung wie das Abspielen von Bildern unter einem bestimmten Prozentsatz durchführen zu können. Wir planen, dieses Ergebnis für pix2pix zu verwenden (vorheriger Artikel).

Über die Lizenzänderung von PIXTA hinzugefügt

Ich kenne das genaue Datum nicht, aber Pixabay hat die CC0-Lizenz gelöscht und einige Einschränkungen hinzugefügt. Soweit ich mit Wayback Machine bestätigt habe, habe ich um Juli 2017 ein Limit hinzugefügt ist. Es ist eine ziemlich gute Lizenz für Trainingsdaten für maschinelles Lernen, aber denken Sie daran, dass es nicht mehr CC0 ist.

Recommended Posts

Kategorisieren Sie Katzenbilder mit ChainerCV
Laden Sie Bilder mithilfe von Anfragen herunter
Sammeln Sie Bilder mit icrawler
Speichern Sie Bilder mit Python3-Anforderungen
Laden Sie Bilder von "Irasutoya" mit Scrapy herunter
Geotag-Vorhersage aus Bildern mit DNN
Senden Sie Nachrichten und Bilder mit LineNotify
Generieren mehrsprachiger Textbilder mit Python
Site-Kategorisierung mit b-Bit Min Hash
Feedparser nimmt automatisch Katzenbilder auf