/ML_project_3_Face_Verification

For ZJU Machine learning course group work project 3.

Primary LanguagePython

ML_project_3_Face_Verification

For ZJU Machine learning course group work project 3.

最后更新2018.11.23,后续更新不再更新README。


说明

本次任务是人脸认证,直接用Deep Learning来做,涉及到以下几个方面:

  • 深度学习框架
  • 网络结构
  • 训练效率(GPU加速、CUDA配置)

深度学习框架&环境搭建

我推荐用Keras,Keras是比较新兴的一个深度学习框架,主要特点就是API风格极简,代码可读性强,方便傻瓜式使用。Keras后端使用的是Theano或者TensorFlow,下文给出的环境配置中用的是TensorFlow。我个人也用的是TensorFlow。Google大法好!

Keras开发环境配置一条龙请参考:

Keras官方文档(使用指南)请参考:

目前中文版已经是最新的英文版翻译了,直接看应该没问题。

网络结构选择

11.10 现在打算用ResNet来做。

FTP上下发的参考文档里给出了几种比较新的网络结构,我们从中具体选择几种(目前估计是两种吧,太多了看不过来)弄明白它们架构的核心**,然后自行设计一个结合两种**的网络进行后面的训练。

给出的经典结构参考:

  • VGG
  • ResNet
  • Inception
  • DenseNet
  • ShuffleNet
  • MobileNet
  • SENet
  • Xception

目前我的想法是先去查一查人脸识别领域的资料,看看有没有推荐的网络结构,然后我们把它和给出的经典结构中的某个结合一下,有机会我们最好讨论一下。

11.23更新: 尝试了经典VGG,ResNet和VGG混合网络,DeepID,DeepID和ResNet的结合,最后决定使用加深的DeepID。

CUDA配置

CUDA用于给NVIDIA公司的GPU加速提供平台,如果你们的显卡是NVIDIA的而且想尝试GPU加速,请按照如下步骤配置CUDA:

  1. 查看显卡支持的CUDA版本:https://jingyan.baidu.com/article/6fb756ec4fabc4241858fbf7.html
  2. 确认你的TensorFlow版本支持哪个版本的CUDA,这个自己查吧...把版本匹配好
  3. 下载CUDA安装程序:https://developer.nvidia.com/cuda-toolkit-archive
  4. 找到你安装CUDA支持的CuDNN,官方下载CuDNN:https://developer.nvidia.com/cudnn 官方安装似乎需要做调查问卷,如果不想就百度网盘啥的看看吧
  5. 把CUDA,CuDNN装好即可

折腾CUDA这一条龙挺费时间的,如果你一定要用GPU加速的话,一定要记住:版本要匹配!!! 当初我就是版本搞错了...浪费了很多时间在环境配置上...

版本匹配大概是这些东西版本要匹配好:

  • CUDA
  • CuDNN
  • TensorFlow版本,注意TensorFlow分CPU版和GPU版,前面配置Keras的时候有提到
  • Keras版本

另外还要注意,如果显卡名是NVIDIA系带M字样的笔记本专用卡,请慎用GPU加速,Keras配置时给出的解释是有烧坏卡的风险...(我的破笔记本就是M系的卡...不过我还是装了CUDA...)

CUDA配置比较麻烦,请务必根据需要与否配置。 、 11.23更新: 最后借了ZJUSPC的服务器和卡...ありがとう!

关于Git同步

emmm,虽然我觉得应该没问题了,但是就那么几条指令还是在这里记一下吧。

  • 本地仓库初始化
    git init
  • 添加更改到commit
    git add .
    git commit -m "first commit"
  • 关联到远程库
    git remote add origin 你的远程库地址
  • 远程库与本地同步合并
    git pull --rebase origin master
  • 将本地库内容推送到远程
    git push -u origin master

自行编写的函数接口说明

注:这部分基本已经作废,基本没怎么用上。

提前写了一下数据读取、格式转换的接口,注意你的Python上一定要有下面几个库:

  • matplotlib
  • numpy
  • pillow

如果Python用的是anaconda版本的,应该已经预先装好了,查看库安装列表请在控制台里输入:

conda list

文件操作接口

注意:函数中文件调用目录请自己修改。

showPic(pic_path)

无返回值,显示数据集中路径为pic_path的图片。该参数一般来自数据集提供的索引文件。

readIndex(index_file_name)

返回list,参数为数据集文件夹内提供的索引.txt文件的路径。该函数将原始数据集转换成一个list,list每个元素为字符串,内容为一张图片的相对路径和类别标签。

genDataDict(index_list)

返回list,list的每个元素为dict,参数使用readIndex()的返回值。该函数返回dict的格式为{pic_path:<pic_path>, category:<pic_category>}

path2matr(pic_path)

返回numpy数组,参数使用genDataDict()所返回列表字典中的"pic_path"键对应值。该函数获取图片矩阵,并以numpy数组形式返回,用于后续对图片进行数据处理。

网络创建函数

做了最简单的包装,一共写了两个:

  1. VGG风格的网络
  2. ResNet风格的网络
  • VGG:genVGG(pic_classes)
  • ResNet:genResnet(pic_classes)

只是把网络搭建的过程藏起来了,没有按照生成一个指定size的网络的**去写,偷个懒。两个函数都会返回一个Keras的Model对象,VGG的是Sequential Model。此外,两个函数内调用了keras.utilsplot_model()函数,用于生成网络结构图。

数据集划分

一个不知道是不是数据集本身bug的问题:数据集提供的train和val集内类别数不同,train比val的类别少一类,目前暂时将这个类移出以便能正常训练。

用法详见data_division.py,用来将原始WebFace总数据集划分成训练集和验证集。训练集共1GB左右,验证集约40MB左右。

过程写的很简朴,没用到什么特别的技巧...所以跑起来可能很慢,划分数据集的脚本我一共花了30min多的时间跑完,在运行前一定检查好目录设置有没有错误,否则跑完了发现目录错了重新搞就很费事...

网络搭建

详见hpc_net_def.py,里面详细搭建了Keras风格的Functional和Sequential模型。