DeepID算法实践

DeepID实践

转载请注明:

好久没有写博客了,I have failed my blog. 目前人脸验证算法可以说是DeepID最强,本文使用theano对DeepID进行实现。关于deepid的介绍,可以参见我这一片博文 DeepID之三代。

当然DeepID最强指的是DeepID和联合贝叶斯两个算法,本文中只实现了DeepID神经网络,并用它作为特征提取器来应用在其他任务上。

本文所用到的代码工程在github上:DeepID_FaceClassify,如果这篇博客帮到了你,求star。咳咳,为了github工程的star数我觉得我太无耻了,哈哈。

实践流程环境配置

本工程使用theano库,所以在实验之前,theano环境是必须要配的,theano环境配置可以参见。文档已经较为全面,本文不再赘述,在下文中,均假设读者已经装好了theano。

代码概览

本文所用到的代码结构如下:

src/├── conv_net│ ├── deepid_class.py│ ├── deepid_generate.py│ ├── layers.py│ ├── load_data.py│ └── sample_optimization.py└── data_prepare├── vectorize_img.py├── youtube_data_split.py└── youtube_img_crop.py

正如文件名命名所指出的,代码共分为两个模块,即数据准备模块(data_prepare)和卷积神经网络模块(conv_net)。

数据准备

我觉得DeepID的强大得益于两个因素,卷积神经网络的结构和数据,数据对于DeepID或者说对任何的卷积神经网络都非常重要。

可惜的是,我去找过论文作者要过数据,可是被婉拒。所以在本文的实验中,我使用的数据并非论文中的数据。经过下面的描述你可以知道,如果你还有其他的数据,可以很轻松的用python将其处理为本文DeepID网络的输入数据。

以youtube face数据为例。它的文件夹结构如下所示,包含三级结构,第一是以人为单位,然后每个人有不同的视频,每个视频中采集出多张人脸图像。

youtube_data/├── people_folderA│ ├── video_folderA│ │ ├── img1.jpg│ │ ├── img2.jpg│ │ └── imgN.jpg│ └── video_folderB└── people_folderB

拿到youtube face数据以后,需要做如下两件事:

对图像进行预处理,原来的youtube face图像中,人脸只占中间很小的一部分,我们对其进行裁剪,使人脸的比例变大。同时,将图像缩放为(47,55)大小。将数据集合划分为训练集和验证集。本文中划分训练集和验证集的方式如下:

经过划分后,得到7975张验证集和31900训练集。显然,根据这两个数字你可以算出一共有1595个类(人)。

数据准备的代码使用

注意: 数据准备模块中以youtube为前缀的的程序是专门用来处理youtube数据,因为其他数据可能图像属性和文件夹的结构不一样。如果你使用了其他数据,请阅读youtube_img_crop.py和youtube_data_split.py代码,然后重新写出适合自己数据的代码。数据预处理代码都很简单,相信在我代码的基础上,不需要改太多,就能适应另一种数据了。

youtube_img_crop.py

被用来裁剪图片,youtube face数据中图像上人脸的比例都相当小,本程序用于将图像的边缘裁减掉,然后将图像缩放为47×55(DeepID的输入图像大小)。

Usage: python youtube_img_crop.py aligned_db_folder new_folderaligned_db_folder: 原始文件夹new_folder: 结果文件夹,与原始文件夹的文件夹结构一样,只不过图像是被处理后的图像。youtube_data_split.py

用来切分数据,将数据分为训练集和验证集。

Usage: python youtube_data_split.py src_folder test_set_file train_set_file

test_set_file和train_set_file的格式如下,每一行分为两部分,第一部分是图像路径,第二部分是图像的类别标记。

youtube_47_55/Alan_Ball/2/aligned_detect_2.405.jpg,0youtube_47_55/Alan_Ball/2/aligned_detect_2.844.jpg,0youtube_47_55/Xiang_Liu/5/aligned_detect_5.1352.jpg,1youtube_47_55/Xiang_Liu/1/aligned_detect_1.482.jpg,1vectorize_img.py

用来将图像向量化,每张图像都是47×55的,所以每张图片变成一个47×55×3的向量。

为了避免超大文件的出现,本程序自动将数据切分为小文件,每个小文件中只有1000张图片,即1000×(47×55×3)的矩阵。当然,最后一个小文件不一定是1000张。

Usage: python vectorize_img.py test_set_file train_set_file test_vector_folder train_vector_folderConv_Net

走完了漫漫前路,终于可以直捣黄龙了。现在是DeepID时间。吼吼哈嘿。

在conv_net模块中,有五个程序文件

Conv_Net代码使用deepid_class.pyUsage: python deepid_class.py vec_valid vec_train params_file

注意:

DeepID训练过程有太多的参数需要调整,为了程序使用简便,我并没有把这些参数都使用命令行传参。如果你想要改变迭代次数、学习速率、批大小等参数,请在程序的最后一行调用函数里改。

deepid_generate.py

可以使用下面的命令来抽取DeepID的隐含层,即160-d的那一层。

Usage: python deepid_generate.py dataset_folder params_file result_folder效果展示DeepID 效果

跑完deepid_class.py以后,你可以得到输出如下。输出可以分为两部分,第一部分是每次迭代以及每个小batch的训练集误差,验证集误差等。第二部分是一个汇总,将epoch train error valid error. 按照统一格式打印了出来。

epoch 15, train_score 0.000444, valid_score 0.066000epoch 16, minibatch_index 62/63, error 0.000000epoch 16, train_score 0.000413, valid_score 0.065733epoch 17, minibatch_index 62/63, error 0.000000epoch 17, train_score 0.000508, valid_score 0.065333epoch 18, minibatch_index 62/63, error 0.000000epoch 18, train_score 0.000413, valid_score 0.070267epoch 19, minibatch_index 62/63, error 0.000000epoch 19, train_score 0.000413, valid_score 0.0645330 0.974349206349 0.9629333333331 0.890095238095 0.8974666666672 0.70126984127 0.6666666666673 0.392031746032 0.5201333333334 0.187619047619 0.3606666666675 0.20526984127 0.226 0.054380952381 0.1710666666677 0.0154920634921 0.1288 0.00650793650794 0.1001333333339 0.00377777777778 0.090933333333310 0.00292063492063 0.08611 0.0015873015873 0.079212 0.00133333333333 0.075466666666713 0.00111111111111 0.071466666666714 0.000761904761905 0.06815 0.000444444444444 0.06616 0.000412698412698 0.065733333333317 0.000507936507937 0.065333333333318 0.000412698412698 0.070266666666719 0.000412698412698 0.0645333333333

上述数据画成折线图如下:

它不同于旅游,那需要一个风景稍微漂亮的地方,

DeepID算法实践

相关文章:

你感兴趣的文章:

标签云: