打算用caffe做人臉識別,用的是vgg,如何使用model?

VGG Face Descriptor,下載好的.caffemodel如何使用,還有這個模型的數據集從哪裡獲得?


最近正在重新配置Caffe的環境,簡要地說明一下,希望可以幫助到題主。

首先,你應該通過各種方式了解Caffe | Deep Learning Framework的基本信息。

簡單來講,Caffe是一個深度卷積神經網路的學習框架,使用Caffe可以比較方便地進行CNN模型的訓練和測試。

基本的圖像分類任務可以這樣描述:

訓練階段

通過指定相關的配置文件,指定網路結構信息、數據集信息、訓練參數,可以使用Caffe的train功能進行網路的訓練,訓練的最終結果是得到一個.caffemodel模型文件。

測試階段

通過Caffe的測試介面(通常是Python或Matlab的介面),載入.caffemodel模型文件,在內存里生成網路模型。指定輸入數據(通常是一個或多個圖像文件),獲得網路的輸出作為分類結果。

假設題主暫時只希望使用Caffe進行人臉識別功能的測試功能,即輸入一張圖片,給出人臉識別的結果,題主需要完成的基本流程如下:(由於個人並沒有使用過Caffe進行人臉識別的任務, 如果介紹內容有偏差希望海涵。)

一、配置Caffe環境

如果沒有搭建Caffe的相關環境,從零開始的話,可能包括的基本流程如下:

  • 安裝Linux操作系統
  • 配置Caffe所需要的一些依賴庫,具體參見:Caffe | Installation
  • 下載Caffe的源碼:BVLC/caffe - C++
  • (可選)如果有nvidia顯卡支持,配置cuda環境(Caffe的優勢特點在於使用GPU加速運算)
  • 修改Caffe源碼中的Makefile.config文件,執行make編譯。

具體編譯過程中可能會遇到各種問題,運氣不好的話確實比較麻煩。祝好運。

二、 執行測試

在網站VGG Face Descriptor中提供了模型和源碼,具體使用參考相關說明即可,基本的流程應該比較簡單:

  • 在腳本源碼中指定Caffe庫的路徑,指定.caffemodel模型,指定輸入數據,通過函數調用網路的測試功能,獲取網路輸出結果。
  • 執行腳本源碼。

如果源碼的使用說明不能夠充分理解,可以參考Jupyter Notebook Viewer的示例。

基本流程與ImageNet的分類任務應該是相同的。

另外,模型的數據集在VGG Face Descriptor相關論文的第三章有說明。

http://www.robots.ox.ac.uk/~vgg/publications/2015/Parkhi15/parkhi15.pdf


這問題好像是很早之前問的了,今天回答,就當作是記錄一下自己的工作,併當作是之後跟我一樣的菜鳥的入門小文檔吧,至少能夠初步學會怎麼使用model zoo這個神奇之地,學會怎麼分析caffemodel文件的結構吧

###########################################################################

今天畢設準備搞人臉識別這一模塊的功能了,到model zoo上也找到了你說的這個

下載了他的model

解壓後文件結構如下:

忽略最後四個文件吧(fr是我為了查看model的結構寫的代碼,judge是我寫的人臉識別的python代碼,result1是我記錄執行結果的文件,最後一個是下載的壓縮包,所以都可以忽略)

開始我也寫不來,於是查看其中的matcaffe的demo,demo內容如下;

% Copyright (c) 2015, Omkar M. Parkhi
% All rights reserved.

img = imread("ak.png");
img = single(img);

averageImg = [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 = http://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的python介面(其實就是用不來Matlab才這麼乾的。。。)

所以我需要把上面的Matlab代碼改成python,代碼如下(寫的很爛歡迎輕噴。。。):

import numpy as np
import matplotlib.pyplot as plt
import sys
import caffe

plt.rcParams["figure.figsize"] = (10,10)
plt.rcParams["image.interpolation"] = "nearest"
plt.rcParams["image.cmap"] = "gray"

caffe_root = "C:/Program Files/caffe/caffe-master/caffe-master"
sys.path.insert(0, caffe_root+"python")

caffe.set_mode_cpu()
model_def="F:/face-recognition/vgg_face_caffe/vgg_face_caffe/VGG_FACE_deploy.prototxt"#你自己的路徑
model_weights="F:/face-recognition/vgg_face_caffe/vgg_face_caffe/VGG_FACE.caffemodel"#你自己的路徑
labels_filename="F:/face-recognition/vgg_face_caffe/vgg_face_caffe/names.txt"#你自己的路徑
mean_data=np.array([129.1863,104.7624,93.5940])

net = http://caffe.Net(model_def, model_weights, caffe.TEST)

transformer = caffe.io.Transformer({"data":net.blobs["data"].data.shape})
transformer.set_transpose("data", (2,0,1))
transformer.set_mean("data",mean_data)
transformer.set_raw_scale("data", 255)
transformer.set_channel_swap("data", (2,1,0))
# net.blobs["data"].reshape(1,3,227,227)

image = caffe.io.load_image("F:/face-recognition/age_gender/lzh.jpg")
transformed_image = transformer.preprocess("data", image)
net.blobs["data"].data[...] = transformed_image

labels=np.loadtxt(labels_filename,str,delimiter="
")
output = net.forward()
prob = output["prob"][0]
index1=prob.argsort()[-1]
index2=prob.argsort()[-2]
index3=prob.argsort()[-3]
index4=prob.argsort()[-4]
index5=prob.argsort()[-5]

print index1,"--",labels[index1],"--",prob[index1]
print index2,"--",labels[index2],"--",prob[index2]
print index3,"--",labels[index3],"--",prob[index3]
print index4,"--",labels[index4],"--",prob[index4]
print index5,"--",labels[index5],"--",prob[index5]
# print output_prob
# print labels[output_prob.argmax()]

另附上我的fr代碼:

import numpy as np
import matplotlib.pyplot as plt
import sys
import caffe

caffe.set_mode_cpu()
caffe_root = "C:/Program Files/caffe/caffe-master/caffe-master"
sys.path.insert(0, caffe_root+"python")
model_def="F:/face-recognition/vgg_face_caffe/vgg_face_caffe/VGG_FACE_deploy.prototxt"
model_weights="F:/face-recognition/vgg_face_caffe/vgg_face_caffe/VGG_FACE.caffemodel"
net = http://caffe.Net(model_def, model_weights, caffe.TEST)
print "The structure of the NET is shown as following:"
for layer_name, blob in net.blobs.iteritems():
print layer_name+" "+str(blob.data.shape)

執行結果也即神經網路層次結構如下:

data (1L, 3L, 224L, 224L)

conv1_1 (1L, 64L, 224L, 224L)

conv1_2 (1L, 64L, 224L, 224L)

pool1 (1L, 64L, 112L, 112L)

conv2_1 (1L, 128L, 112L, 112L)

conv2_2 (1L, 128L, 112L, 112L)

pool2 (1L, 128L, 56L, 56L)

conv3_1 (1L, 256L, 56L, 56L)

conv3_2 (1L, 256L, 56L, 56L)

conv3_3 (1L, 256L, 56L, 56L)

pool3 (1L, 256L, 28L, 28L)

conv4_1 (1L, 512L, 28L, 28L)

conv4_2 (1L, 512L, 28L, 28L)

conv4_3 (1L, 512L, 28L, 28L)

pool4 (1L, 512L, 14L, 14L)

conv5_1 (1L, 512L, 14L, 14L)

conv5_2 (1L, 512L, 14L, 14L)

conv5_3 (1L, 512L, 14L, 14L)

pool5 (1L, 512L, 7L, 7L)

fc6 (1L, 4096L)

fc7 (1L, 4096L)

fc8 (1L, 2622L)

prob (1L, 2622L)

感覺效果不是很好,正在分析原因(畢竟敢放到model zoo上的都是大神的作品,感覺是不是自己太過於自作主張,把demo裡面的fc7層輸出自己改成了prob了,分析成功了再更新吧)

~~~~~~~~~~

嗯,補充一下,之前說效果不好的原因是,圖片事先沒有做一個人臉檢測。。。。

好低級的錯誤


下載鏈接vgg上有,但是國內下載很慢,求下載完的童鞋共享下,你可以用自己數據finetuning,不過vgg face model很大,還是自己實現一遍主流paper吧


我現在在用tensorflow,請問能下載VGG的模型直接導入的嗎?

VGG Face Descriptor

我是在這個網址上下載的,但好像都是針對matlab,有關係嗎?

或者有沒有代碼直接共享出來,我只需要VGG的卷積層代碼就可以了。我的QQ郵箱是1643206826,謝謝


推薦閱讀:

有沒有雲端的深度學習計算服務?
用matlab做深度學習,有什麼工具箱可以直接調用嗎?
caffe finetune問題:按照網上的教程微調alexnet為什麼loss一直是87.3365?
caffe SolverParameter中的iter_size參數什麼作用?

TAG:人臉識別 | 深度學習DeepLearning | Caffe深度學習框架 |