2015-11-20 9 views
6

Ich möchte implementieren VGG Face Descriptor in Python. Aber ich erhalte eine Fehlermeldung:VGG Gesichtsdeskriptor in Python mit Caffe

TypeError: can only concatenate list (not "numpy.ndarray") to list

Mein Code:

import numpy as np 
import cv2 
import caffe 
img = cv2.imread("ak.png") 
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) 
net = caffe.Net("VGG_FACE_deploy.prototxt","VGG_FACE.caffemodel", caffe.TEST) 
print net.forward(img) 

Können Sie mir helfen?

UPDATE 1

Diese Arbeits Code ist beispielsweise in Matlab

% Copyright (c) 2015, Omkar M. Parkhi 
% All rights reserved. 
img = imread('ak.png'); 
img = single(img); 

    Img = [129.1863,104.7624,93.5940] ; 

img = cat(3,img(:,:,1)-averageImage(1),... 
    img(:,:,2)-averageImage(2),... 
    img(:,:,3)-averageImage(3)); 

img = img(:, :, [3, 2, 1]); % convert from RGB to BGR 
img = permute(img, [2, 1, 3]); % permute width and height 

model = 'VGG_FACE_16_deploy.prototxt'; 
weights = 'VGG_FACE.caffemodel'; 
caffe.set_mode_cpu(); 
net = caffe.Net(model, weights, 'test'); % create net and load weights 

res = net.forward({img}); 
prob = res{1}; 

caffe_ft = net.blobs('fc7').get_data(); 
+0

Warum verwenden Sie nicht 'caffe.io.load_image'? – Shai

+0

Wenn ich 'caffe.io.load_image's versuche, bekomme ich den gleichen Fehler' TypeError: kann nur die Liste verketten (nicht "numpy.darray"), um sie aufzulisten. Wenn ich versuche, eine einzelne Elementliste an Methode zu übergeben, bekomme ich den Fehler 'TypeError: unshashable type: 'numpy.darray'' – Iwn

+0

versuche' net.forward_all' statt 'forward'. – Shai

Antwort

7

Python-Schnittstelle nutzen zu können, müssen das Eingangsbild verwandeln, bevor sie an das Netz

img = caffe.io.load_image("ak.png") 
img = img[:,:,::-1]*255.0 # convert RGB->BGR 
avg = np.array([93.5940, 104.7624, 129.1863]) # BGR mean values 
img = img - avg # subtract mean (numpy takes care of dimensions :) 

Jetzt img ist H -by- W -mit-3 numpy Array füttern.
Caffe erwartet seine Eingaben als 4D: batch_index x Kanal x Breite x Höhe.
Deshalb müssen Sie die Eingabe in transpose und eine Singleton Dimension fügen Sie den „batch_index“ zu repräsentieren Dimension führende

img = img.transpose((2,0,1)) 
img = img[None,:] # add singleton dimension 

Jetzt können Sie den Vorwärtslauf laufen

out = net.forward_all(data = img) 
+0

@Iwn Sie sind herzlich willkommen;) – Shai

+0

Woher kommt dieser Durchschnitt? – maxbellec

+0

@maxou war es ein Teil der Frage. – Shai

0

Versuchen ein einzelnes Element Liste an die Methode übergeben.

net.forward ([img]) 
+1

Whetn ich es versuchen, bekomme ich diesen Fehler: TypeError: nicht hashbar Typ: 'numpy.ndarray ' – Iwn

1

OpenCV in BGR liest und skaliert 255 Format standardmäßig, also:

img = cv2.imread('ak.png') 
avg = np.array([93.5940,104.7624,129.1863]) # BGR mean from VGG 
img -= avg # subtract mean 
img = img.transpose((2,0,1)) # to match image input dimension: 3x224x224 
img = img[None,:] # add singleton dimension to match batch dimension 
out = net.forward_all(data = img)