<! - Klassifizieren Sie Katzenbilder mit chainercv -->
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.
#!/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()
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')
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.
Schauen wir uns einige fehlgeschlagene Fälle an.
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.
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.
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).
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