• OpenCV之CNN年龄性别预测


    • 💂 个人主页:风间琉璃
    • 🤟 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主
    • 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)订阅专栏

    目录

    前言

    一、预处理

    二、模型加载

    三、执行推理

    四、解析输出


    前言

    在当今数字时代,计算机视觉技术正在不断发展,并在多个领域产生影响。其中之一是年龄和性别识别。这项技术对于广告定向、人脸解锁和安全访问控制等领域至关重要。

    卷积神经网络是一种深度学习模型,它在计算机视觉中表现出色。CNN的核心思想是通过多层卷积和池化操作,从图像中学习特征。这些特征可以用于各种任务,包括图像分类、对象检测和人脸识别。对于年龄和性别识别,CNN可以通过学习人脸的视觉特征来实现高精度。

    参考链接:Age and Gender Classification Using Convolutional Neural Networks - Tal Hassner

    一、预处理

    一般图片都需要进行尺寸大小,维度以及RGB通道的变换。图片尺寸大小要求可以在配置文件的输入网络中查看,年龄的配置文件输入层如下:

    1. //图像预处理
    2. Mat blob = blobFromImage(image, 1.0, Size(227, 227));

    其次,需要将网络模型的标签文件读取到内存中,如果标签类别较小也可以直接定义一个数组。

    1. //获取年龄的区间
    2. vector ageLabels()
    3. {
    4. vector ages;
    5. ages.push_back("0-2");
    6. ages.push_back("4-6");
    7. ages.push_back("8-13");
    8. ages.push_back("15-20");
    9. ages.push_back("25-32");
    10. ages.push_back("38-43");
    11. ages.push_back("48-53");
    12. ages.push_back("60-");
    13. return ages;
    14. }

    二、模型加载

    数据准备后,就可以从模型文件和配置文件中加载网络模型。

    1. //年龄预测网络模型
    2. String age_model = "F:/data/CQU/VS/CNN_Age_Gender/age_net.caffemodel";
    3. //年龄预测配置文件
    4. String age_config = "F:/data/CQU/VS/CNN_Age_Gender/deploy_age.prototxt";
    5. //性别预测网络模型
    6. String gender_model = "F:/data/CQU/VS/CNN_Age_Gender/gender_net.caffemodel";
    7. //性别预测配置文件
    8. String gender_config = "F:/data/CQU/VS/CNN_Age_Gender/deploy_gender.prototxt";
    9. //加载网络
    10. Net age_net = readNetFromCaffe(age_config, age_model);
    11. Net gender_net = readNetFromCaffe(gender_config, gender_model);

    三、执行推理

    然后就可以进行图像的预测,这里为了预测提高预测的准确度,所先要从图像中找到人脸部分,在送入给网络预测。

    人脸检测:

    1. //人脸检测文件
    2. String haar_file = "F:/data/CQU/VS/CNN_Age_Gender/haarcascade_frontalface_alt_tree.xml";
    3. //人脸检测
    4. CascadeClassifier detector;
    5. detector.load(haar_file);
    6. vector faces;
    7. Mat gray;
    8. cvtColor(src, gray, COLOR_BGR2GRAY);
    9. detector.detectMultiScale(gray, faces, 1.02, 1, 0, Size(40, 40), Size(500, 500));

    预测:

    1. // 预测分类
    2. Mat prob = net.forward("prob");

    四、解析输出

    推理之后就获取到了预测的结果,我们需要对预测结果进行解析,并显示。

    1. //预测年龄
    2. string predict_age(Net& net, Mat& image)
    3. {
    4. //图像预处理
    5. Mat blob = blobFromImage(image, 1.0, Size(227, 227));
    6. net.setInput(blob, "data");
    7. //预测分类
    8. Mat prob = net.forward("prob");
    9. //打平成一维
    10. Mat probMat = prob.reshape(1, 1);
    11. Point classNum;
    12. double classProb;
    13. vector ages = ageLabels();
    14. //提取最大概率的编号和概率值
    15. minMaxLoc(probMat, NULL, &classProb, NULL, &classNum);
    16. int classidx = classNum.x;
    17. return ages.at(classidx);
    18. }
    19. //预测性别
    20. String predict_gender(Net& net, Mat& image)
    21. {
    22. //图片预处理
    23. Mat blob = blobFromImage(image, 1.0, Size(227, 227));
    24. net.setInput(blob, "data");
    25. // 预测分类
    26. Mat prob = net.forward("prob");
    27. Mat probMat = prob.reshape(1, 1);
    28. //比较大小,得到预测结果
    29. String res = (probMat.at<float>(0, 0) > probMat.at<float>(0, 1) ? "Man" : "Female");
    30. return res;
    31. }
    32. //对检测到的人脸进行预测,所以只有在检测到人脸时才会进行预测
    33. String age,gender;
    34. for(size_t t = 0; t < faces.size(); t++)
    35. {
    36. rectangle(src, faces[t], Scalar(30, 255, 30), 2, 8, 0);
    37. //年龄、性别预测
    38. Mat face = src(faces[t]);
    39. age = predict_age(age_net, face);
    40. gender = predict_gender(age_net, face);
    41. putText(src, format("age:%s", age.c_str()), Point(20, 20), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0), 1);
    42. putText(src, format("gender:%s", gender.c_str()),Point(20, 40), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0), 1);
    43. }
    44. imshow("age-gende", src);

    运行结果:

    程序源码:下载:OpenCV年龄和性别预测资源-CSDN文库

    1. // CNN_Age_Gender.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    2. //
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. using namespace cv;
    9. using namespace cv::dnn;
    10. using namespace std;
    11. //人脸检测文件
    12. String haar_file = "F:/data/CQU/VS/CNN_Age_Gender/haarcascade_frontalface_alt_tree.xml";
    13. //年龄预测网络模型
    14. String age_model = "F:/data/CQU/VS/CNN_Age_Gender/age_net.caffemodel";
    15. //年龄预测配置文件
    16. String age_config = "F:/data/CQU/VS/CNN_Age_Gender/deploy_age.prototxt";
    17. //性别预测网络模型
    18. String gender_model = "F:/data/CQU/VS/CNN_Age_Gender/gender_net.caffemodel";
    19. //性别预测配置文件
    20. String gender_config = "F:/data/CQU/VS/CNN_Age_Gender/deploy_gender.prototxt";
    21. //获取年龄的区间
    22. vector ageLabels()
    23. {
    24. vector ages;
    25. ages.push_back("0-2");
    26. ages.push_back("4-6");
    27. ages.push_back("8-13");
    28. ages.push_back("15-20");
    29. ages.push_back("25-32");
    30. ages.push_back("38-43");
    31. ages.push_back("48-53");
    32. ages.push_back("60-");
    33. return ages;
    34. }
    35. //预测年龄
    36. string predict_age(Net& net, Mat& image)
    37. {
    38. //图像预处理
    39. Mat blob = blobFromImage(image, 1.0, Size(227, 227));
    40. net.setInput(blob, "data");
    41. //预测分类
    42. Mat prob = net.forward("prob");
    43. //打平成一维
    44. Mat probMat = prob.reshape(1, 1);
    45. Point classNum;
    46. double classProb;
    47. vector ages = ageLabels();
    48. //提取最大概率的编号和概率值
    49. minMaxLoc(probMat, NULL, &classProb, NULL, &classNum);
    50. int classidx = classNum.x;
    51. return ages.at(classidx);
    52. }
    53. //预测性别
    54. String predict_gender(Net& net, Mat& image)
    55. {
    56. //图片预处理
    57. Mat blob = blobFromImage(image, 1.0, Size(227, 227));
    58. net.setInput(blob, "data");
    59. // 预测分类
    60. Mat prob = net.forward("prob");
    61. Mat probMat = prob.reshape(1, 1);
    62. //比较大小,得到预测结果
    63. String res = (probMat.at<float>(0, 0) > probMat.at<float>(0, 1) ? "Man" : "Female");
    64. return res;
    65. }
    66. int main()
    67. {
    68. Mat src = imread("5.jpg");
    69. if(src.empty())
    70. {
    71. printf("could not load image...\n");
    72. return -1;
    73. }
    74. namedWindow("src", CV_WINDOW_AUTOSIZE);
    75. imshow("src", src);
    76. //人脸检测
    77. CascadeClassifier detector;
    78. detector.load(haar_file);
    79. vector faces;
    80. Mat gray;
    81. cvtColor(src, gray, COLOR_BGR2GRAY);
    82. detector.detectMultiScale(gray, faces, 1.02, 1, 0, Size(40, 40), Size(500, 500));
    83. //加载网络
    84. Net age_net = readNetFromCaffe(age_config, age_model);
    85. Net gender_net = readNetFromCaffe(gender_config, gender_model);
    86. //对检测到的人脸进行预测,所以只有在检测到人脸时才会进行预测
    87. String age,gender;
    88. for(size_t t = 0; t < faces.size(); t++)
    89. {
    90. rectangle(src, faces[t], Scalar(30, 255, 30), 2, 8, 0);
    91. //年龄、性别预测
    92. Mat face = src(faces[t]);
    93. age = predict_age(age_net, face);
    94. gender = predict_gender(age_net, face);
    95. putText(src, format("age:%s", age.c_str()), Point(20, 20), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0), 1);
    96. putText(src, format("gender:%s", gender.c_str()),Point(20, 40), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0), 1);
    97. }
    98. imshow("age-gende", src);
    99. waitKey(0);
    100. return 0;
    101. }

    结束语
    感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

    希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

    躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

    最后,博主要一下你们的三连呀(点赞、评论、收藏),不要钱的还是可以搞一搞的嘛~

    不知道评论啥的,即使扣个666也是对博主的鼓舞吖 💞 感谢 💐

  • 相关阅读:
    如何避免远程访问欺诈?让远程办公更加安全的六个建议
    7.js对象
    纯 CSS 实现搜索框的展示与隐藏
    VsCode备忘
    基于yolov5的电瓶车和自行车检测系统,可进行图像目标检测,也可进行视屏和摄像检测(pytorch框架)【python源码+UI界面+功能源码详解】
    无公网IP通过旁路由openwrt的Zerotier实现和在家一样访问家里每个设备
    Mysql8.x版本主从加读写分离(一) mysql8.x主从
    使用PAM保障开发运营安全
    算法竞赛进阶指南 0x57 倍增优化DP
    8万字带你入门Rust
  • 原文地址:https://blog.csdn.net/qq_53144843/article/details/132875422