Laden Sie das Kaffeemodell mit Chainer und klassifizieren Sie die Bilder. Das Chainer-Beispiel hat auch eine Bildklassifizierung, aber ich kann nicht sagen, welches Bild in welche Kategorie klassifiziert wurde, indem ich nur die Erkennungsrate ausgebe. Ermöglicht die Ausgabe des Kategorienamens und der Punktzahl als Klassifizierungsergebnis. Den Quellcode finden Sie unter hier. (Eine klassifizierte Version des Codes in diesem Artikel) Wenn Sie Schwierigkeiten haben, den Artikel zu lesen, klonen Sie ihn bitte.
Dieses Mal verwenden wir bvlc_googlenet als Modell. 1000 Kategorien können klassifiziert werden. Auf der Seite bvlc_googlenet befindet sich ein Link zur Caffemodel-Datei. Laden Sie ihn daher von dort herunter.
Eine Etikettendatei wird generiert, damit die Kategorienummer des Klassifizierungsergebnisses und der Kategoriename verknüpft werden können. Unten finden Sie ein Skript zum Herunterladen von imagenet-bezogenen Dateien. https://github.com/BVLC/caffe/blob/master/data/ilsvrc12/get_ilsvrc_aux.sh Eine Etikettendatei wird durch Verarbeiten der in caffe_ilsvrc12.tar.gz enthaltenen synset_words.txt generiert.
synset_words.txt
n01440764 tench, Tinca tinca
n01443537 goldfish, Carassius auratus
n01484850 great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias
n01491361 tiger shark, Galeocerdo cuvieri
Führen Sie den folgenden Befehl aus
wget http://dl.caffe.berkeleyvision.org/caffe_ilsvrc12.tar.gz
tar -xf caffe_ilsvrc12.tar.gz
sed -e 's/^[^ ]* //g' synset_words.txt > labels.txt
Die Etikettendatei wird erstellt.
labels.txt
tench, Tinca tinca
goldfish, Carassius auratus
great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias
tiger shark, Galeocerdo cuvieri
hammerhead, hammerhead shark
Da es zwei Zeilen gibt, die als "Kran" bezeichnet werden, ist dies verwirrend. Ändern Sie daher die 135. Zeile in "Kran (Vogel)" und die 518. Zeile in "Kran (Maschine)".
Verwenden Sie Pillow (https://pillow.readthedocs.org/en/3.0.x/), um das Bild zu lesen, seine Größe zu ändern, es zu beschneiden und es dann in ein Numpy-Array zu konvertieren
import numpy as np
from PIL import Image
#Definition der Eingabebildgröße
image_shape = (224, 224)
#Bild lesen und in das RGB-Format konvertieren
image = Image.open('sample.png').convert('RGB')
#Bildgröße ändern und ausschneiden
image_w, image_h = self.image_shape
w, h = image.size
if w > h:
shape = (image_w * w / h, image_h)
else:
shape = (image_w, image_h * h / w)
x = (shape[0] - image_w) / 2
y = (shape[1] - image_h) / 2
image = image.resize(shape)
image = image.crop((x, y, x + image_w, y + image_h))
pixels = np.asarray(image).astype(np.float32)
#Pixel sind 3D und jede Achse ist[Y-Koordinate,X-Koordinate, RGB]Repräsentiert
#Eingabedaten sind 4 Dimensionen[Bildindex, BGR,Y-Koordinate,X-Koordinate]Führen Sie also die Array-Konvertierung durch
#Konvertieren Sie von RGB in BGR
pixels = pixels[:,:,::-1]
#Tauschen Sie die Achsen
pixels = pixels.transpose(2,0,1)
#Zeichnen Sie ein durchschnittliches Bild
mean_image = np.ndarray((3, 224, 224), dtype=np.float32)
mean_image[0] = 103.939
mean_image[1] = 116.779
mean_image[2] = 123.68
pixels -= self.mean_image
#Machen Sie es 4 Dimensionen
pixels = pixels.reshape((1,) + pixels.shape)
Laden Sie das Caffemodel und verwenden Sie das soeben generierte Array als Eingabedaten.
import chainer
import chainer.functions as F
from chainer.functions import caffe
#Laden Sie das Kaffeemodell
func = caffe.CaffeFunction('bvlc_googlenet.caffemodel')
#Schicht'loss3/classifier'Holen Sie sich die Ausgabe von und wenden Sie softmax an
x = chainer.Variable(pixels, volatile=True)
y, = func(inputs={'data': x}, outputs=['loss3/classifier'], disable=['loss1/ave_pool', 'loss2/ave_pool'], train=False)
prediction = F.softmax(y)
Das Klassifizierungsergebnis wird ausgegeben.
#Lesen Sie das Etikett
categories = np.loadtxt('labels.txt', str, delimiter="\n")
#Scores und Labels werden in absteigender Reihenfolge der Scores verknüpft und sortiert
result = zip(prediction.data.reshape((prediction.data.size,)), categories)
result = sorted(result, reverse=True)
#Zeigen Sie die Top 10 Ergebnisse an
for i, (score, label) in enumerate(result[:10]):
print '{:>3d} {:>6.2f}% {}'.format(i + 1, score * 100, label)
Als ich das in Asakusa aufgenommene Landschaftsbild erkannte, wurde es wie folgt. Die oberste Kategorie ist Moschee. Ich möchte, dass Sie Wolkenkratzer und Türme erkennen, aber sie scheinen nicht in dieser Kategorie zu sein.
1 38.85% mosque
2 6.07% fire engine, fire truck
3 5.15% traffic light, traffic signal, stoplight
4 3.97% radio, wireless
5 3.25% cinema, movie theater, movie theatre, movie house, picture palace
6 2.14% pier
7 2.01% limousine, limo
8 1.92% stage
9 1.89% trolleybus, trolley coach, trackless trolley
10 1.61% crane (machine)
Es werden mehrere geschulte Kaffeemodelle veröffentlicht, mit denen jeder Bilder klassifizieren kann. Dieses Mal wurde nur ein Bild eingegeben, es ist jedoch möglich, mehrere Bilder gleichzeitig einzugeben. Das Laden des Caffemodels dauert einige Zeit. Daher ist es besser, das Bild zu laden, während das Caffemodel geladen bleibt.
Versuchen Sie auf einem Mac ohne CUDA, ein Caffe-Modell mit Chainer zur Bilderkennung zu importieren
Recommended Posts