带有caffe的python中的VGG人脸描述符

Posted

技术标签:

【中文标题】带有caffe的python中的VGG人脸描述符【英文标题】:VGG Face Descriptor in python with caffe 【发布时间】:2016-02-23 01:16:16 【问题描述】:

我想在 python 中实现VGG Face Descriptor。但我不断收到错误:

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 = res1;

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

【问题讨论】:

你为什么不用caffe.io.load_image 如果我尝试caffe.io.load_image 我得到同样的错误TypeError: can only concatenate list (not "numpy.ndarray") to list。如果我尝试将单个元素列表传递给方法,我会收到错误 TypeError: unhashable type: 'numpy.ndarray' 尝试使用net.forward_all 而不是forward 同样的错误TypeError: unhashable type: 'numpy.ndarray' 你能得到一个堆栈跟踪来显示究竟是哪一行代码导致了这个错误吗? 【参考方案1】:

要使用 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 :)

现在 imgH-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 )

【讨论】:

这个平均值从何而来? @maxou 这是问题的一部分。【参考方案2】:

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)

【讨论】:

【参考方案3】:

尝试将单个元素列表传递给方法。

net.forward ([img])

【讨论】:

当我尝试它时,我得到了这个错误:TypeError: unhashable type: 'numpy.ndarray'

以上是关于带有caffe的python中的VGG人脸描述符的主要内容,如果未能解决你的问题,请参考以下文章

vgg16 和vgg19的区别

caffe 利用VGG训练自己的数据

caffe和vgg-16和googlenet的区别

值误差,使用VGG16的图像归一化误差,人脸识别和检测项目

caffe-ubuntu1604-gtx850m-i7-4710hq----VGG_ILSVRC_16_layers.caffemodel

anaconda3安装caffe