【caffe】基于CNN的年龄和性别检测

转载 2017年04月16日 17:18:46

自2012年深度学习火起来后,AlexNet,vgg16,vgg19,gooGleNet,caffeNet,faster RCNN等,各种模型层出不群,颇有文艺复兴时的形态。

在各种顶会论文中,对年龄和性别的检测的论文还是比较少的。而本文将要讲解的是2015年的一篇cvpr,Age and Gender Classification using Convolutional Neural Networks。官方链接为http://www.openu.ac.il/home/hassner/projects/cnn_agegender/

理论基础:

其整体结构如下图所示,输入一幅图片,然后经过3个卷基层,2个全链接层,最后经过svm分类器分类,输出相应的结果。

详细结构如下图所示,其中norm层为了提高模型的泛化能力,drop层是为了防止过拟合。

其中左中右分别为第一二三个卷基层,下面的为第六七八个全连接层。

程序运行:

可以写一个简单的shell脚本来进行运行测试,touch一个.sh文件,随便起个名字,输入如下的脚本,然后命令行运行就可以输出结果。其中路径名换成自己电脑的实际路径名。

[plain] view plaincopy
  1. #!/bin/bash
  2. #directed by watersink(watersink2016@gmail.com)
  3. echo "Begin gender....."
  4. ./build/examples/cpp_classification/classification.bin \
  5. models/cnn_age_gender/deploy_gender.prototxt \
  6. models/cnn_age_gender/gender_net.caffemodel \
  7. data/cnn_age_gender/mean.binaryproto \
  8. data/cnn_age_gender/genderlabels.txt \
  9. data/cnn_age_gender/example_image.jpg
  10. echo "Begin age....."
  11. ./build/examples/cpp_classification/classification.bin \
  12. models/cnn_age_gender/deploy_age.prototxt \
  13. models/cnn_age_gender/age_net.caffemodel \
  14. data/cnn_age_gender/mean.binaryproto \
  15. data/cnn_age_gender/agelabels.txt \
  16. data/cnn_age_gender/example_image.jpg
  17. echo "Done.
[plain] view plain copy
  1. #!/bin/bash
  2. #directed by watersink(watersink2016@gmail.com)
  3. echo "Begin gender....."
  4. ./build/examples/cpp_classification/classification.bin \
  5. models/cnn_age_gender/deploy_gender.prototxt \
  6. models/cnn_age_gender/gender_net.caffemodel \
  7. data/cnn_age_gender/mean.binaryproto \
  8. data/cnn_age_gender/genderlabels.txt \
  9. data/cnn_age_gender/example_image.jpg
  10. echo "Begin age....."
  11. ./build/examples/cpp_classification/classification.bin \
  12. models/cnn_age_gender/deploy_age.prototxt \
  13. models/cnn_age_gender/age_net.caffemodel \
  14. data/cnn_age_gender/mean.binaryproto \
  15. data/cnn_age_gender/agelabels.txt \
  16. data/cnn_age_gender/example_image.jpg
  17. echo "Done.

classification.bin为caffe自带的二进制文件,用于实现分类。

deploy_gender.prototxt,deploy_age.prototxt分别为性别,年龄部署或者测试时候的模型文件

gender_net.caffemodel,age_net.caffemodel分别为性别,年龄训练好的权值文件

mean.binaryproto,为训练的样本的均值文件,减均值时使用,可以达到更好的检测效果

genderlabels.txt,agelabels.txt为性别,年龄的标签文件,具体内容如下

genderlabels.txt中的内容:

[plain] view plaincopy
  1. male 1
  2. female 0
[plain] view plain copy
  1. male 1
  2. female 0

agelabels.txt中的内容:

[plain] view plaincopy
  1. 0-2 0
  2. 4-6 1
  3. 8-13 2
  4. 15-20 3
  5. 25-32 4
  6. 38-43 5
  7. 48-53 6
  8. 60- 7
[plain] view plain copy
  1. 0-2 0
  2. 4-6 1
  3. 8-13 2
  4. 15-20 3
  5. 25-32 4
  6. 38-43 5
  7. 48-53 6
  8. 60- 7

example_image.jpg,为随便一张想要测试的图片

实验结果:


性别识别率:

年龄识别率:

训练自己的模型:

论文的原作者给出了自己的5-folder训练文件,首先我们对原作者的训练数据进行分析。

通过上面的数据可以看出,性别数据反面基本是1:1比例进行的。而年龄方面并没有执行大概的1:1:1:1:1:1:1:1比例,而是3:3:3:3:6:3:1:1,对于这样的训练比例,我个人认为是很不科学和合理的,所谓的mini-batch,应该是每个batch中的属性和整体的基本是一样的才可以。简单的说,任意给一张图像,这张图像中人物属于哪一个年龄段是都有可能的,也就是是平均概率的。(个人见解,如有错误,希望大家指正)

下面通过一个简单的c++程序来获得和作者一样的txt文件。

[cpp] view plaincopy
  1. int main()
  2. {
  3. vector<string>file_folder;
  4. file_folder.push_back("fold_0_data.txt");
  5. file_folder.push_back("fold_1_data.txt");
  6. file_folder.push_back("fold_2_data.txt");
  7. file_folder.push_back("fold_3_data.txt");
  8. file_folder.push_back("fold_4_data.txt");
  9. ofstream file_stream_gender_out("gender.txt", ios::app);
  10. ofstream file_stream_age_out("age.txt", ios::app);
  11. char buffer[500];
  12. char str1[50], str2[50], str3[50], str4[50], str5[50], str6[50];
  13. for (int i = 0; i < file_folder.size();i++)
  14. {
  15. ifstream file_stream_in(file_folder[i]);
  16. file_stream_in.getline(buffer, 400);//提取标题
  17. while (!file_stream_in.eof())
  18. {
  19. file_stream_in.getline(buffer,400);
  20. sscanf(buffer, "%s %s %s %s %s %s", &str1, &str2, &str3, &str4, &str5, &str6);
  21. string tmp1 = str3, tmp2 = str2;
  22. string address = "F:\\MydataSet\\Adience\\aligned\\landmark_aligned_face." + tmp1 + "." + tmp2;
  23. Mat image = imread(address);
  24. if (image.data)
  25. {
  26. if (str4[0] == '(')
  27. file_stream_age_out << "Adience/" << "landmark_aligned_face." << str3 << "." << str2 << " " << str4 << " " << str5 << endl;
  28. if (strcmp(str6, "f") == 0 || strcmp(str6, "m") == 0 )
  29. file_stream_gender_out << "Adience/" << "landmark_aligned_face." << str3 << "." << str2 << " " << str6<<endl;
  30. else
  31. {
  32. if(strcmp(str5, "f") == 0 || strcmp(str5, "m") == 0)
  33. file_stream_gender_out << "Adience/" << "landmark_aligned_face." << str3 << "." << str2 << " " << str5 << endl;
  34. }
  35. }
  36. }
  37. file_stream_in.close();
  38. }
  39. file_stream_gender_out.close();
  40. file_stream_age_out.close();
  41. return 0;
  42. }
[cpp] view plain copy
  1. int main()
  2. {
  3. vector<string>file_folder;
  4. file_folder.push_back("fold_0_data.txt");
  5. file_folder.push_back("fold_1_data.txt");
  6. file_folder.push_back("fold_2_data.txt");
  7. file_folder.push_back("fold_3_data.txt");
  8. file_folder.push_back("fold_4_data.txt");
  9. ofstream file_stream_gender_out("gender.txt", ios::app);
  10. ofstream file_stream_age_out("age.txt", ios::app);
  11. char buffer[500];
  12. char str1[50], str2[50], str3[50], str4[50], str5[50], str6[50];
  13. for (int i = 0; i < file_folder.size();i++)
  14. {
  15. ifstream file_stream_in(file_folder[i]);
  16. file_stream_in.getline(buffer, 400);//提取标题
  17. while (!file_stream_in.eof())
  18. {
  19. file_stream_in.getline(buffer,400);
  20. sscanf(buffer, "%s %s %s %s %s %s", &str1, &str2, &str3, &str4, &str5, &str6);
  21. string tmp1 = str3, tmp2 = str2;
  22. string address = "F:\\MydataSet\\Adience\\aligned\\landmark_aligned_face." + tmp1 + "." + tmp2;
  23. Mat image = imread(address);
  24. if (image.data)
  25. {
  26. if (str4[0] == '(')
  27. file_stream_age_out << "Adience/" << "landmark_aligned_face." << str3 << "." << str2 << " " << str4 << " " << str5 << endl;
  28. if (strcmp(str6, "f") == 0 || strcmp(str6, "m") == 0 )
  29. file_stream_gender_out << "Adience/" << "landmark_aligned_face." << str3 << "." << str2 << " " << str6<<endl;
  30. else
  31. {
  32. if(strcmp(str5, "f") == 0 || strcmp(str5, "m") == 0)
  33. file_stream_gender_out << "Adience/" << "landmark_aligned_face." << str3 << "." << str2 << " " << str5 << endl;
  34. }
  35. }
  36. }
  37. file_stream_in.close();
  38. }
  39. file_stream_gender_out.close();
  40. file_stream_age_out.close();
  41. return 0;
  42. }

程序运行结束后,将会生成age.txt和gender.txt

有了这2个文件就可以进行相应的训练工作了。当然为了得到更好的效果,可以考虑以下3点建议。

(1)对txt中的数据平均分配,不要好多相同的标签在一起,如果不这样做的话,需要在输入层设置shuffle,同样可以达到相同的效果。

(2)增加一定的样本,使得年龄的每一个阶段数量都大致相同

(3)将图像缩放到256*256,并做aligement

本人处理后数据如下图所示,大小256*256,做了aligement

将cafferoot/examples/imagenet/ (cafferoot为自己的caffe的根目录)下的create_imagenet.sh,

make_imagenet_mean.sh,train_caffenet.sh复制到自己的工程下,分别改名为,create_age.sh,make_age_mean.sh,train_age.sh,再复制一份,改名为,create_gender.sh,make_gender_mean.sh,train_gender.sh,并对其中的参数做相应的修改。(如果这一步有疑问,请留言)

年龄的训练:

执行 create_age.sh,

执行,make_age_mean.sh,

执行,train_age.sh,可以看到得到了68.95%的识别率

性别的训练:

执行create_gender.sh,

执行,make_gender_mean.sh,

执行,train_gender.sh,可以看到得到了95.75%的识别率

本人实际在ubuntu14.04+corei7cpu+TitanX上跑的cpu进行年龄或者性别判断的时间为150ms左右,gpu的时间为2-3ms左右。

在windows7+XeonE3上测试,cpu+debug为120ms左右,cpu+release为30ms左右。

欢迎大家指证与交流……

【caffe】基于CNN的年龄和性别检测相关推荐

  1. 基于 CNN的年龄和性别检测

    自2012年深度学习火起来后,AlexNet,vgg16,vgg19,gooGleNet,caffeNet,faster RCNN等,各种模型层出不群,颇有文艺复兴时的形态. 在各种顶会论文中,对年龄 ...

  2. 基于Tensorflow卷积神经网络(CNN)的人脸年龄和性别检测系统

    文件大小:150M 开发环境:Python3.7.OpenCV4.0.1.24.Tensorflow1.13.1.PyCharm2020 点击下载:点击下载 简要概述:基于Tensorflow卷积神经 ...

  3. 用 OpenCV 进行年龄和性别检测

    在本文中,我将带您完成用 Python 进行机器学习的年龄和性别检测的任务.年龄和性别检测属于计算机视觉的范畴,因此我将在Python中使用OpenCV库. 在开始使用Python进行年龄和性别检测任 ...

  4. 使用 Python 进行年龄和性别检测,这个结果搞笑了

    在本文中,我将使用 Python 编程语言带您完成使用机器学习进行年龄和性别检测的任务.年龄和性别检测是计算机视觉的任务,因此我将使用 Python 中的 OpenCV 库. 在开始使用 Python ...

  5. 基于 CNN 特征区域进行目标检测

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 目标检测是目前计算机视觉领域最热门的技术之一,该领域的研究一直在以 ...

  6. 基于CNN的性别、年龄识别及Demo实现

    一.相关理论 本篇博文主要讲解2015年一篇paper<Age and Gender Classification using Convolutional Neural Networks> ...

  7. 深度学习(十四)基于CNN的性别、年龄识别

    CNN应用之性别.年龄识别 原文地址:http://blog.csdn.net/hjimce/article/details/49255013 作者:hjimce 一.相关理论 本篇博文主要讲解201 ...

  8. 使用python+Keras检测年龄和性别

    目标 本文的主要目的是通过给定的数据集检测年龄和性别.我们将使用简单的 python 和 Keras 方法来检测年龄和性别. 数据集:https://www.kaggle.com/nipunarora ...

  9. cnn生成图像显著图_基于CNN与图像前背景分离的显著目标检测

    基于 CNN 与图像前背景分离的显著目标检测 东野长磊 ; 万文鑫 [期刊名称] <软件导刊> [年 ( 卷 ), 期] 2020(019)001 [ 摘 要 ] 为 了 解 决 计 算 ...

  10. 使用Python+OpenCV预测年龄与性别

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:深度学习与计算机视觉 现在越来越多的应用程序与年龄和性别 ...

最新文章

  1. Zbrush2021写实人物肖像雕刻学习教程
  2. 适合初学者学java技术的书籍推荐!
  3. 探索自动驾驶领域中的3D多目标跟踪(ICCV 2021)
  4. win8更改计算机账户密码忘记了怎么办,密码忘记怎么办?WIN8平板电脑如何重置密码?...
  5. LeetCode 题解汇总
  6. Boost:返回报告错误report errors
  7. docker中创建Jmeter及在外部使用JMeter-Server控制
  8. Android开发环境搭建全程演示(jdk+eclipse+android sdk)
  9. 安装hadoop伪分布式集群心得
  10. APP网络测试要点和弱网模拟
  11. PHP的curl实现get,post 和 cookie(几个实例)
  12. 3种团队分组适应项目_业务团队怎样做目标管理?更能激励员工?(附实操方法)...
  13. 圣诞美妆海报还没想好怎么设计,看这里,PSD分层模板!
  14. 我最大的乐趣是不厌其烦地收集人生的各种经历和体验。我喜欢享受人生的各种经历和体验所带给我的难以言表的乐趣...
  15. c#解决浏览器跨域问题
  16. 文件上传的测试点整理
  17. MHL技术介绍及接口检测原理
  18. Nodejs内存溢出原因
  19. jQuery中的end()方法使用介绍
  20. 6D姿态估计算法汇总

热门文章

  1. css模拟title和alt的提示效果[转]
  2. 【HAVENT原创】前端使用 jsrsasign 进行 RSA 加密、解密、签名、验签
  3. 某IDC服务商机房宕机致银行业务中断 银监会发布风险提示
  4. SliderBar4.0常用滑块滚动效果封装
  5. 【笔记】《编写高质量代码:改善c#程序的157个建议》-第1章 基本语言要素(SamWang)...
  6. 安装Ubuntu系统后的配置工作
  7. java中数组操作常见的三个错误
  8. 如何获得一个干净的 gnome 开发环境?
  9. 新手指引,php什么是常量、变量、数组、类和对象及方法?
  10. 数据结构之线性表代码实现顺序存储,链式存储,静态链表(选自大话数据结构)...