※ WIP。
Classez les images Caltech en utilisant le modèle de référence de Caffe (* le modèle utilisé dans des articles célèbres pour lesquels le réglage des paramètres a été effectué). Le but est de produire la sortie suivante sous une forme concrètement visible.
(Image. Vous pouvez continuer lorsque l'implémentation est terminée avec succès)
** ÉTAPE1. ** Téléchargez l'ensemble de données d'image à classer ** STEP2. ** Extraire des entités à partir d'images dans un jeu de données ** ÉTAPE3. ** Former les SVM pour classer les entités extraites par SVM linéaires ** ÉTAPE 4. ** Classer en fonction de la quantité de fonctionnalités avec SVM formé
Aller à la page suivante et télécharger. http://www.vision.caltech.edu/Image_Datasets/Caltech101/#Download
$ scripts/download_model_binary.py models/bvlc_reference_caffenet
Extraire les données d'objets des images à l'aide d'un modèle de référence. Tout comme les couleurs sont représentées par trois nombres, RVB, les caractéristiques d'une image sont représentées par ** 4096 nombres ** dans ce modèle. En 2-2., Entrée: données jpg, sortie: 4096 données numériques, créez un script pour effectuer divers traitements.
Créez ce qui suit dans le répertoire racine de 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)
Préparez un script pour l'exécution ci-dessus
exec.py
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from feature_extraction import FeatureExtraction
FeatureExtraction().extract_features()
Exécutez ce qui suit pour créer des données d'objet (feature.txt).
python
$ python exec.py path/to/images_dir > feature.txt
Sur la machine à portée de main, la première ligne
(10, 3, 227, 227)
Sera inclus. Ce ne sont pas des données de caractéristiques, c'est comme une impression de déchets dans un autre processus, alors supprimez-les.
Dans STEP3., SVM est appris par libsvm. Afin d'être manipulé par libsvm, il est nécessaire d'écrire les données de fonctionnalité dans le format suivant.
...
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 données
(numéro d'étiquette) 1:Valeur numérique du premier montant de caractéristique 2:Valeur numérique de la deuxième quantité de fonction...
Il est exprimé sous la forme de. Dans feature.txt, il y a autant de lignes que le nombre d'images.
Le célèbre paquet libsvm est utilisé pour SVM. L'explication de libsvm et svm est ici gentille.
$ brew install libsvm
Former SVM. Tapez la commande suivante.
$ svm-scale -s scale.txt feature.txt > feature.scaled.txt
$ svm-train -c 0.03 feature.scaled.txt caltech101.model
svm-scale est une commande à mettre à l'échelle avec libsvm, et svm-train est une commande à apprendre. La signification de chaque fichier est la suivante.
$ 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
... la précision est mauvaise! débogage maintenant ...
Espérons que les trois seront en août. .. ..
libsvm
FAQ
A. Image moyenne. Voir ci-dessous.
http://qiita.com/uchihashi_k/items/8333f80529bb3498e32f
A. La classification à valeurs multiples est également possible. libsvm compte avec désinvolture le nombre de classes de données d'enseignants que vous avez saisies et fait un bon travail en créant un classificateur à valeurs multiples si nécessaire ... ce n'était pas une belle histoire.
Recommended Posts