※ WIP。
Klassifizieren Sie Caltech-Bilder anhand des Caffe-Referenzmodells (* das Modell, das in bekannten Veröffentlichungen verwendet wurde, für die die Parametereinstellung abgeschlossen wurde). Ziel ist es, die folgende Ausgabe als konkrete sichtbare Form zu erzeugen.
(Bild. Sie können fortfahren, wenn die Implementierung erfolgreich abgeschlossen wurde.)
** SCHRITT 1. ** Laden Sie den zu klassifizierenden Bilddatensatz herunter ** SCHRITT 2. ** Extrahieren Sie Features aus Bildern in einem Datensatz ** SCHRITT 3. ** Trainieren Sie SVMs, um extrahierte Features durch lineare SVMs zu klassifizieren. ** SCHRITT 4. ** Klassifizierung anhand der Merkmalsmenge mit geschultem SVM
Wechseln Sie zur folgenden Seite und laden Sie sie herunter. http://www.vision.caltech.edu/Image_Datasets/Caltech101/#Download
$ scripts/download_model_binary.py models/bvlc_reference_caffenet
Extrahieren Sie Feature-Daten von Bildern mithilfe eines Referenzmodells. So wie Farben durch drei Zahlen, RGB, dargestellt werden, werden die Merkmale eines Bildes in diesem Modell durch ** 4096 Zahlen ** dargestellt. In 2-2., Eingabe: JPG-Daten, Ausgabe: 4096 numerische Daten, erstellen Sie ein Skript, um verschiedene Verarbeitungen durchzuführen.
Erstellen Sie Folgendes im Stammverzeichnis von caffe.
feature_extraction.py
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os, os.path, numpy as np, caffe
# path to git-cloned caffe dir
CAFFE_DIR = os.getenv('CAFFE_ROOT')
MEAN_FILE = os.path.join(CAFFE_DIR, 'python/caffe/imagenet/ilsvrc_2012_mean.npy')
MODEL_FILE = os.path.join(CAFFE_DIR, 'models/bvlc_reference_caffenet/deploy.prototxt')
PRETRAINED = os.path.join(CAFFE_DIR, 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel')
LAYER = 'fc7'
INDEX = 4
class FeatureExtraction:
def __init__(self):
net = caffe.Classifier(MODEL_FILE, PRETRAINED)
caffe.set_mode_cpu()
net.transformer.set_mean('data', np.load(MEAN_FILE))
net.transformer.set_raw_scale('data', 255)
net.transformer.set_channel_swap('data', (2,1,0))
self.net = net
def extract_features(self):
imageDirPath = sys.argv[1]
previousLabelName = ''
labelIntValue = 0
for root, dirs, files in os.walk(imageDirPath):
for filename in files:
if filename == '.DS_Store':
continue
fullPath = os.path.join(root, filename)
dirname = os.path.dirname(fullPath)
labelName = dirname.split("/")[-1]
if labelName != previousLabelName:
labelIntValue += 1
previousLabelName = labelName
image = caffe.io.load_image(fullPath)
feat = self.extract_features_from_image(image)
self.print_feature_with_libsvm_format(labelIntValue, feat)
def build_test_data(self, imagePaths):
for fullPath in imagePaths:
image = caffe.io.load_image(fullPath)
feat = self.extract_features_from_image(image)
self.print_feature_with_libsvm_format(-1, feat)
def extract_features_from_image(self, image):
self.net.predict([image])
feat = self.net.blobs[LAYER].data[INDEX].flatten().tolist()
return feat
def print_feature_with_libsvm_format(self, labelIntValue, feat):
formatted_feat_array = [str(index+1)+':'+str(f_i) for index, f_i in enumerate(feat)]
print str(labelIntValue) + " " + " ".join(formatted_feat_array)
Bereiten Sie ein Skript für die obige Ausführung vor
exec.py
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from feature_extraction import FeatureExtraction
FeatureExtraction().extract_features()
Führen Sie die folgenden Schritte aus, um Feature-Daten (feature.txt) zu erstellen.
python
$ python exec.py path/to/images_dir > feature.txt
Auf der Maschine zur Hand die erste Zeile
(10, 3, 227, 227)
Wird mit inbegriffen sein. Dies sind keine Feature-Daten, es ist wie ein Müllabdruck in einem anderen Prozess, also löschen Sie ihn.
...
4 1:0.89 2:0.19 3:0.10 ... 4096:0.77
1 1:0.01 2:0.99 3:0.11 ... 4096:0.97
...
() 1::...
In STEP3. Wird SVM von libsvm gelernt. Um von libsvm verarbeitet zu werden, müssen die Feature-Daten im folgenden Format geschrieben werden. Eine Daten werden in Form der Nummer des Etiketts, des numerischen Werts der ersten Merkmalsmenge und des numerischen Werts der 22. Merkmalsmenge dargestellt. In feature.txt gibt es so viele Zeilen wie die Anzahl der Bilder.
Das berühmte libsvm-Paket wird für SVM verwendet. Die Erklärung von libsvm und svm ist hier nett.
$ brew install libsvm
Zug SVM. Geben Sie den folgenden Befehl ein.
$ svm-scale -s scale.txt feature.txt > feature.scaled.txt
$ svm-train -c 0.03 feature.scaled.txt caltech101.model
svm-scale ist ein Befehl zum Skalieren mit libsvm, und svm-train ist ein Befehl zum Lernen. Die Bedeutung jeder Datei ist wie folgt.
scale.txt: Eine Datei, die speichert, wie Sie skaliert haben.
feature.scaled.txt: Feature-Daten nach der Skalierung
caltech101.model: Datei, in der die trainierten SVM-Parameter gespeichert sind
$ cp feature.txt feature_test.txt
$ svm-scale -r scale.txt feature_test.txt > feature_test.scaled.txt
$ svm-predict feature_test.scaled.txt caltech101.model result.txt
... Genauigkeit ist schlecht! jetzt debuggen ...
Hoffentlich werden alle drei im August sein. .. ..
libsvm
FAQ
A. Durchschnittliches Bild. Siehe unten.
http://qiita.com/uchihashi_k/items/8333f80529bb3498e32f
A. Eine mehrwertige Klassifizierung ist ebenfalls möglich. libsvm zählt beiläufig die Anzahl der eingegebenen Klassen von Lehrerdaten und erstellt bei Bedarf einen mehrwertigen Klassifikator. Es war keine süße Geschichte.
Recommended Posts