tensorflow精进之路(二十八)——人脸识别(下)(MTCNN人脸检查和人脸对齐+CASIA-WebFace数据集模型)

本文详细介绍了如何从下载CASIA-WebFace数据集开始,通过MTCNN进行人脸检测和对齐预处理,再到使用Facenet框架训练人脸识别模型的过程,包括解决训练中遇到的显存不足等问题。
ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

1、概述


这一讲,我们来训练自己的人脸识别模型。

2、下载CASIA-WebFace人脸数据集


CASIA-WebFace人脸数据集包含了10575个人的494414张人脸图片,需要在

http://www.cbsr.ia.ac.cn/

网站申请,反正我没成功打开人脸数据集的申请界面,在万能的百度上找到了一个,我把它放到百度云上了,下载链接如下,有点大,4.4G,

链接: https://pan.baidu.com/s/1LOAcYEE4fV6-63WdOLy9GA 密码: 42hx

CASIA-WebFace人脸数据集的目录结构跟LFW类似,每个人对应一个文件夹,不同的是,CASIA-WebFace人脸数据集每个文件夹下都有多张同一个人脸的图片,结构如下图所示,

3、人脸检测和人脸对齐


和上一讲一样,先用MTCNN对数据集进行预处理------人脸检测和人脸对齐,在facenet-master下执行命令,

 python src/align/align_dataset_mtcnn.py ../CASIA-WebFace ../CASIA-WebFace_align_182 --image_size 182 --margin 44

经过N个小时的运行,总算结束了,运行结果为,

下图是预处理前的图片,

下图是预处理后的图片,

处理后的图像大小为182*182,而送入神经网络的图像大小是160*160,之所以处理后的图像大小为182*182,是为了预留一定空间给数据增强时裁剪。

4、开始训练


训练的代码是src/train_softmax.py,使用的是中心损失来训练模型,因为中心损失要用Softmax损失配合训练,所以取了这样的文件名。

执行命令,

python src/train_softmax.py --logs_base_dir ../log --models_base_dir ../models --data_dir ../CASIA-WebFace_align_182/ --model_def models.inception_resnet_v1  --image_size 160 --lfw_dir ../lfw_align_160/ --optimizer RMSPROP --learning_rate -1 --max_nrof_epochs 80 --random_crop --random_flip --learning_rate_schedule_file data/learning_rate_schedule_classifier_casia.txt --weight_decay 5e-5 --center_loss_factor 1e-2 --center_loss_alfa 0.9

报错,

totalMemory: 1.95GiB freeMemory: 1.71GiB

2018-08-26 20:09:10.257341: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1423] Adding visible gpu devices: 0

2018-08-26 20:09:10.434062: I tensorflow/core/common_runtime/gpu/gpu_device.cc:911] Device interconnect StreamExecutor with strength 1 edge matrix:

2018-08-26 20:09:10.434084: I tensorflow/core/common_runtime/gpu/gpu_device.cc:917]      0 

2018-08-26 20:09:10.434089: I tensorflow/core/common_runtime/gpu/gpu_device.cc:930] 0:   N 

2018-08-26 20:09:10.434269: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1041] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 1993 MB memory) -> physical GPU (device: 0, name: GeForce GTX 950, pci bus id: 0000:01:00.0, compute capability: 5.2)

2018-08-26 20:09:10.438385: E tensorflow/stream_executor/cuda/cuda_driver.cc:936] failed to allocate 1.95G (2090270720 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY

2018-08-26 20:09:10.442601: E tensorflow/stream_executor/cuda/cuda_driver.cc:936] failed to allocate 1.75G (1881243648 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY

Running training

2018-08-26 20:09:32.671532: E tensorflow/stream_executor/cuda/cuda_dnn.cc:403] could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR

2018-08-26 20:09:32.671592: E tensorflow/stream_executor/cuda/cuda_dnn.cc:370] could not destroy cudnn handle: CUDNN_STATUS_BAD_PARAM

2018-08-26 20:09:32.671601: F tensorflow/core/kernels/conv_ops.cc:712] Check failed: stream->parent()->GetConvolveAlgorithms( conv_parameters.ShouldIncludeWinogradNonfusedAlgo<T>(), &algorithms) 

Aborted

应该又是显存不够的原因,那么,每次训练的batch调小点试试,新增参数--batch_size 1,再试试,

python src/train_softmax.py --logs_base_dir ../log --models_base_dir ../models --data_dir ../CASIA-WebFace_align_182/ --model_def models.inception_resnet_v1  --image_size 160 --lfw_dir ../lfw_align_160/ --optimizer RMSPROP --learning_rate -1 --max_nrof_epochs 80 --random_crop --random_flip --learning_rate_schedule_file data/learning_rate_schedule_classifier_casia.txt --weight_decay 5e-5 --center_loss_factor 1e-2 --center_loss_alfa 0.9 --batch_size 1

还是内存溢出,为什么它每次都要分配1.95G的显存呢?看看源码还有那些参数设置了这个的?打开src/train_softmax.py,搜索memory,看到--gpu_memory_fraction参数,注释大概意思是为每个线程分配这么多的显存,这里默认值是1.0,即为每个线程分配1G的显存,显然我的破显卡是没那么大的显存的,那么,设置该参数为0.5试试。执行命令,

python src/train_softmax.py --logs_base_dir ../log --models_base_dir ../models --data_dir ../CASIA-WebFace_align_182/ --model_def models.inception_resnet_v1  --image_size 160 --lfw_dir ../lfw_align_160/ --optimizer RMSPROP --learning_rate -1 --max_nrof_epochs 80 --random_crop --random_flip --learning_rate_schedule_file data/learning_rate_schedule_classifier_casia.txt --weight_decay 5e-5 --center_loss_factor 1e-2 --center_loss_alfa 0.9 --gpu_memory_fraction 0.5

还是显存溢出,那么,同时修改--batch_size的大小,将它改成1试试,运行命令,

python src/train_softmax.py --logs_base_dir ../log --models_base_dir ../models --data_dir ../CASIA-WebFace_align_182/ --model_def models.inception_resnet_v1  --image_size 160 --lfw_dir ../lfw_align_160/ --optimizer RMSPROP --learning_rate -1 --max_nrof_epochs 80 --random_crop --random_flip --learning_rate_schedule_file data/learning_rate_schedule_classifier_casia.txt --weight_decay 5e-5 --center_loss_factor 1e-2 --center_loss_alfa 0.9 --batch_size 1 --gpu_memory_fraction 0.5

这下能跑起来了,说明我们的判断对了,适当的将batch_size改大一点,我试着改成20还是内存溢出,改成10就好了,所以最终的命令为,

python src/train_softmax.py --logs_base_dir ../log --models_base_dir ../models --data_dir ../CASIA-WebFace_align_182/ --model_def models.inception_resnet_v1  --image_size 160 --lfw_dir ../lfw_align_160/ --optimizer RMSPROP --learning_rate -1 --max_nrof_epochs 80 --random_crop --random_flip --learning_rate_schedule_file data/learning_rate_schedule_classifier_casia.txt --weight_decay 5e-5 --center_loss_factor 1e-2 --center_loss_alfa 0.9 --batch_size 10 --gpu_memory_fraction 0.5

接下来的工作就交给机器吧。

本以为工作就这样完了,没想到运行了一下就出错了,错误打印如下,

Saving variables

Variables saved in 0.39 seconds

Saving metagraph

Metagraph saved in 2.38 seconds

Runnning forward pass on LFW images

............

Accuracy: 0.60733+-0.01493

Validation rate: 0.01900+-0.00716 @ FAR=0.00133

Saving statistics

Traceback (most recent call last):

  File "src/train_softmax.py", line 581, in <module>

    main(parse_arguments(sys.argv[1:]))

  File "src/train_softmax.py", line 261, in main

    for key, value in stat.iteritems():

AttributeError: 'dict' object has no attribute 'iteritems'

百度了一下,说python3.5将iteritems变为了items,所以将261行的iteritems改为items,再运行。

跑了一下,又内存溢出了,那还是将batch_size改为1好了。

至于其他参数的含义,看源码的注释吧。
 

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

### 关于CASIA-WebFace人脸数据集 #### 数据集概述 CASIA-WebFace 是一个人脸图像数据集,广泛应用于人脸识别人脸检测等领域的研究与开发工作。该数据集由中科院自动化研究所(CASIA)发布,其特点是包含大量标注好的人脸图片,适合用于训练测试各种人脸识别算法[^1]。 #### 数据集规模 此数据集的压缩文件大小约为 **4.1GB**,解压后可以得到大量的高质量人脸图像样本。根据统计数据显示,在当时它属于公开可用的数据集中规模最大之一,这使得 CASIA-WebFace 对推动人脸识别技术进步起到了重要作用[^2]。 #### 下载方法 对于希望获取该数据集的研究者来说,可以通过以下途径完成下载操作: - 百度网盘链接:通过指定资源分享页面可以直接访问到存储有 CASIA-WebFace 的百度云盘地址。 - 链接示例:`https://pan.baidu.com/s/...` (需提取码) - 谷歌云端硬盘选项也被提供作为备用方案以便国际用户更容易取得资料[^2]: - 地址实例:`https://drive.google.com/file/d/...` 注意实际使用过程中可能遇到权限设置或者有效期满等问题,则建议联系原上传者解决具体问题。 #### 使用指导 当成功获得数据之后,按照如下指南来加载并利用这些数据是非常重要的: 1. 解压所下载档案至本地目录; 2. 编写脚本来读取每张照片及其标签信息;以下是 Python 示例代码片段展示如何遍历此类结构化数据集合: ```python import os def load_webface_data(data_dir): images = [] labels = [] for label_name in os.listdir(data_dir): # 假设每个子文件夹代表一类(即某个人) person_path = os.path.join(data_dir, label_name) if not os.path.isdir(person_path): continue for img_file in os.listdir(person_path): img_path = os.path.join(person_path, img_file) try: image = cv2.imread(img_path) # 加载单幅图像 if image is None or image.size == 0: raise ValueError(f"Failed to read {img_path}") images.append(image) labels.append(label_name) except Exception as e: print(e) return images, labels ``` 以上函数会返回两个列表——一个是所有图像对象组成的数组形式,另一个则是对应的身份标识符字符串向量[^1]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值