使用caffe在Python中实现VGG人脸描述符

6
我想在Python中实现VGG人脸描述符。但是我一直收到一个错误消息:

TypeError:只能将列表(而不是“numpy.ndarray”)连接到列表

我的代码:
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)

我可以帮您吗?
更新 1
这段工作代码是 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();

如果我尝试使用 caffe.io.load_image,我会得到相同的错误 TypeError: can only concatenate list (not "numpy.ndarray") to list。如果我尝试将单个元素列表传递给该方法,我会得到错误 TypeError: unhashable type: 'numpy.ndarray' - Iwn
尝试使用net.forward_all代替forward - Shai
错误发生在此文件的第173行 - 链接,这是图片链接 - Iwn
第173行是注释。你能复制这一行吗? - Shai
这里有 VGG_FACE_16_deploy.prototxt - 链接 - Iwn
显示剩余7条评论
3个回答

7

使用Python接口,您需要在将输入图像提供给网络之前对其进行转换。

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 :)

现在,img 是一个大小为H-by-W-by-3的numpy数组。
Caffe期望其输入是4D的:batch_index x channel x width x height。
因此,您需要transpose这个输入,并添加一个单例维度来表示“batch_index”的主导维度。
img = img.transpose((2,0,1)) 
img = img[None,:] # add singleton dimension

现在你可以运行前向传递。
out = net.forward_all( data = img )

这个平均值来自哪里? - maxbellec
@maxou 这是问题的一部分。 - Shai

1
OpenCV默认以BGR格式读入并按照255比例缩放,因此:
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)

0
尝试将单个元素列表传递给该方法。
net.forward ([img])

1
当我尝试运行它时,出现以下错误: 类型错误:不可哈希类型:'numpy.ndarray' - Iwn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接