OpenCV -3 -年龄性别预测

OpenCV -3 -年龄性别预测

使用语言:Java 1.8
操作系统:windows x64
OpenCV:4.1.1


OpenCV关于预测模型介绍

自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/ 【很明显这段是小抄,是接下来使用的模型的理论基础,反正我看不懂╮(╯_╰)╭】

基于 CNN模型的年龄和性别检测

关于CNN模型的算法等等的,全部略过。。。。

首先,先下载模型的文件:age_net.caffemodel、deploy_age.prototxt、gender_net.caffemodel、deploy_gender.prototxt;

然后,使用OpenCV的readNetFromCaffe方法加载预测模型。【该方法可以读取以Caffe框架格式存储的网络模型】

结果,把图片预处理一下,丢进去执行分析预测方法,就会返回结果了。

用现成的模型还是很简单的,而对于预测的准确性啥的,一般般能就行了,肯定比不了那些商用模型的。

实际实现代码分析

年龄预测
 /**
     * 年龄预测  这个就是上一篇文章里面调用的方法
     * 参数为人脸识别之后,截取人脸的图片
     */
    static String age_model = "D:/OpenCV/opencv/sources/samples/data/dnn/age_gender/age_net.caffemodel";
    static String age_text = "D:/OpenCV/opencv/sources/samples/data/dnn/age_gender/deploy_age.prototxt";
    static Net ageNet = readNetFromCaffe(age_text, age_model);

    public static String predict_age(Mat image){

        if (OpenCVTools.ageNet.empty()){
            System.out.println("could not load net...\n");
        }
        // 输入图片,这里的大小是依据模型训练的时候设定的 
        // 在之后自己训练的时候可以看到地点点原因
        Mat blob = blobFromImage(image, 1.0, new Size(227,227));
        ageNet.setInput(blob,"data");
        // mat  reshape 在不复制数据的情况下更改二维矩阵的形状和/或通道数。
        Mat prob = ageNet.forward("prob");
        Mat probMat = prob.reshape(1, 1);
		// 这里是对预测值做处理
        Core.MinMaxLocResult mmr = Core.minMaxLoc(probMat);
        org.opencv.core.Point matchLoc = mmr.maxLoc;

        double classidx = matchLoc.x;
        System.out.println("年龄"+"???"+matchLoc.x);
        // 预测对应的年龄数据
        List ages = new ArrayList();
        ages.add("0-2");
        ages.add("4 - 6");
        ages.add("8 - 12");
        ages.add("15 - 20");
        ages.add("25 - 32");
        ages.add("38 - 43");
        ages.add("48 - 53");
        ages.add("60 - 100");
        return ages.get(((int)classidx))+"";
    }
性别预测
/**
     * 性别预测
     * 参数为人脸识别之后,截取人脸的图片
     */
    static String gender_model = "D:/OpenCV/opencv/sources/samples/data/dnn/age_gender/gender_net.caffemodel";
    static String gender_text = "D:/OpenCV/opencv/sources/samples/data/dnn/age_gender/deploy_gender.prototxt";
    static Net sexNet = readNetFromCaffe(gender_text, gender_model);

    public static String predict_gender(Mat image){

        if (sexNet.empty()){
            System.out.println("could not load net...\n");
        }
        // 输入
        Mat blob = blobFromImage(image, 1.0, new Size(227,227));
        sexNet.setInput(blob,"data");
        // 预测分类 运行forward pass以计算名为output name的层的输出。
        Mat prob = sexNet.forward("prob");
        Mat probMat = prob.reshape(1, 1);

        double[] sexData0 = probMat.get(0,0);
        double[] sexData1 = probMat.get(0,1);
        // 试一下其他的写法  依据标签的写法
//        Core.MinMaxLocResult mmr = Core.minMaxLoc(probMat);
//        org.opencv.core.Point matchLoc = mmr.maxLoc;
//        System.out.println("性别"+"???"+sexData0[0]+sexData1[0]);
//        System.out.println("性别"+"???"+matchLoc);
//        List ages = new ArrayList();
//        ages.add("male");
//        ages.add("female");
//        System.out.println("性别"+":::"+ages.get(((int)matchLoc.x))+"");
        return sexData0[0] > sexData1[0] ? "Man" : "Woman";
    }

小结一下

这里需要一个结果的图片:
在这里插入图片描述

到这里,其实基本的图像识别就已经完成,普通的玩一下的话,可以收工了。

如果需要提升识别精度,或者更多的识别物体,就需要:换一个大佬训练好的模型,或者自己训练一个。

因为,打算学习OpenCV是需要做分享的,所有还要继续换gooGleNet模型试一下,据说能识别1000+的物件。

然后,还有自己训练一个人脸对应名称的模型玩一下,理解一下基本训练模型的流程的简单入参。


2019-11-04 小杭 ε=(´ο`*)))唉 学习使我快乐【学习真累。。。。。。


参考


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用Python OpenCV库进行人脸性别年龄预测的代码示例: ```python import cv2 import math # 加载人脸检测器和性别年龄分类器 face_detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml") gender_age_detector = cv2.dnn.readNetFromCaffe("deploy_gender.prototxt", "gender_net.caffemodel") # 定义性别年龄标签 gender_labels = ["Male", "Female"] age_labels = ["0-2", "4-6", "8-12", "15-20", "25-32", "38-43", "48-53", "60-"] # 加载输入图像 img = cv2.imread("image.jpg") # 转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 检测人脸 faces = face_detector.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5, minSize=(30, 30)) # 对每个检测到的人脸进行处理 for (x,y,w,h) in faces: # 提取人脸区域 face_img = img[y:y+h, x:x+w].copy() # 将人脸区域转换为blob格式 blob = cv2.dnn.blobFromImage(face_img, 1, (227, 227), (78.4263377603, 87.7689143744, 114.895847746), swapRB=False) # 输入blob到性别年龄分类器 gender_age_detector.setInput(blob) predictions = gender_age_detector.forward() # 解析预测结果 gender_prediction = gender_labels[predictions[0].argmax()] age_prediction = age_labels[int(math.floor(predictions[1].argmax() / 3.0))] # 打印预测结果 print("Gender prediction: {}".format(gender_prediction)) print("Age prediction: {}".format(age_prediction)) ``` 注意,在运行此代码之前,你需要下载并提供以下文件: - haarcascade_frontalface_default.xml:OpenCV的人脸检测器 - deploy_gender.prototxt:性别年龄分类器的网络架构文件 - gender_net.caffemodel:性别年龄分类器的预训练权重文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小_杭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值