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开发环境配置一条龙请参考:
- Windows环境搭建:https://keras-cn.readthedocs.io/en/latest/for_beginners/keras_windows/
- Linux环境搭建:https://keras-cn.readthedocs.io/en/latest/for_beginners/keras_linux/
Keras官方文档(使用指南)请参考:
目前中文版已经是最新的英文版翻译了,直接看应该没问题。
11.10 现在打算用ResNet来做。
FTP上下发的参考文档里给出了几种比较新的网络结构,我们从中具体选择几种(目前估计是两种吧,太多了看不过来)弄明白它们架构的核心**,然后自行设计一个结合两种**的网络进行后面的训练。
给出的经典结构参考:
- VGG
- ResNet
- Inception
- DenseNet
- ShuffleNet
- MobileNet
- SENet
- Xception
目前我的想法是先去查一查人脸识别领域的资料,看看有没有推荐的网络结构,然后我们把它和给出的经典结构中的某个结合一下,有机会我们最好讨论一下。
11.23更新: 尝试了经典VGG,ResNet和VGG混合网络,DeepID,DeepID和ResNet的结合,最后决定使用加深的DeepID。
CUDA用于给NVIDIA公司的GPU加速提供平台,如果你们的显卡是NVIDIA的而且想尝试GPU加速,请按照如下步骤配置CUDA:
- 查看显卡支持的CUDA版本:https://jingyan.baidu.com/article/6fb756ec4fabc4241858fbf7.html
- 确认你的TensorFlow版本支持哪个版本的CUDA,这个自己查吧...把版本匹配好
- 下载CUDA安装程序:https://developer.nvidia.com/cuda-toolkit-archive
- 找到你安装CUDA支持的CuDNN,官方下载CuDNN:https://developer.nvidia.com/cudnn 官方安装似乎需要做调查问卷,如果不想就百度网盘啥的看看吧
- 把CUDA,CuDNN装好即可
折腾CUDA这一条龙挺费时间的,如果你一定要用GPU加速的话,一定要记住:版本要匹配!!! 当初我就是版本搞错了...浪费了很多时间在环境配置上...
版本匹配大概是这些东西版本要匹配好:
- CUDA
- CuDNN
- TensorFlow版本,注意TensorFlow分CPU版和GPU版,前面配置Keras的时候有提到
- Keras版本
另外还要注意,如果显卡名是NVIDIA系带M字样的笔记本专用卡,请慎用GPU加速,Keras配置时给出的解释是有烧坏卡的风险...(我的破笔记本就是M系的卡...不过我还是装了CUDA...)
CUDA配置比较麻烦,请务必根据需要与否配置。 、 11.23更新: 最后借了ZJUSPC的服务器和卡...ありがとう!
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数组形式返回,用于后续对图片进行数据处理。
做了最简单的包装,一共写了两个:
- VGG风格的网络
- ResNet风格的网络
- VGG:
genVGG(pic_classes)
- ResNet:
genResnet(pic_classes)
只是把网络搭建的过程藏起来了,没有按照生成一个指定size的网络的**去写,偷个懒。两个函数都会返回一个Keras的Model对象,VGG的是Sequential Model。此外,两个函数内调用了keras.utils
的plot_model()
函数,用于生成网络结构图。
一个不知道是不是数据集本身bug的问题:数据集提供的train和val集内类别数不同,train比val的类别少一类,目前暂时将这个类移出以便能正常训练。
用法详见data_division.py,用来将原始WebFace总数据集划分成训练集和验证集。训练集共1GB左右,验证集约40MB左右。
过程写的很简朴,没用到什么特别的技巧...所以跑起来可能很慢,划分数据集的脚本我一共花了30min多的时间跑完,在运行前一定检查好目录设置有没有错误,否则跑完了发现目录错了重新搞就很费事...
详见hpc_net_def.py
,里面详细搭建了Keras风格的Functional和Sequential模型。