互联网加竞赛 基于设深度学习的人脸性别年龄识别系统

news2025/1/30 16:19:41

文章目录

  • 0 前言
  • 1 课题描述
  • 2 实现效果
  • 3 算法实现原理
    • 3.1 数据集
    • 3.2 深度学习识别算法
    • 3.3 特征提取主干网络
    • 3.4 总体实现流程
  • 4 具体实现
    • 4.1 预训练数据格式
    • 4.2 部分实现代码
  • 5 最后

0 前言

🔥 优质竞赛项目系列,今天要分享的是

基于深度学习机器视觉的人脸性别年龄识别系统

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate


1 课题描述

随着大数据与人工智能逐渐走入人们的生活,计算机视觉应用越发广泛。如医疗影像识别、无人驾驶车载视觉、通用物体识别、自然场景下的文本识别等,根据不同的应用场景,人脸研究方向可以分为人脸检测、身份识别、性别识别、年龄预测、种族识别、表情识别等。近年来,人脸身份识别技术发展迅猛,在生活应用中取得了较好的效果,也逐渐趋于成熟,而年龄识别与性别预测,仍然是生物特征识别研究领域中一项具有挑战性的课题。

课题意义

相比人脸性别属性而言,人脸年龄属性的研究更富有挑战性。主要有两点原因,首先每个人的年龄会随着身体健康状况、皮肤保养情况而表现得有所不同,即便是在同一年,表现年龄会随着个人状态的不同而改变,人类识别尚且具有较高难度。其次,可用的人脸年龄估计数据集比较少,不同年龄的数据标签收集不易,现有大多数的年龄数据集都是在不同的复杂环境下的照片、人脸图片存在光照变化较复杂、部分遮挡、图像模糊、姿态旋转角度较大等一系列问题,对人脸模型的鲁棒性产生了较大的影响。

2 实现效果

这里废话不多说,先放上大家最关心的实现效果:

输入图片:
在这里插入图片描述

识别结果:

在这里插入图片描述

或者实时检测
在这里插入图片描述
在这里插入图片描述

3 算法实现原理

3.1 数据集

学长收集的数据集:
该人脸数据库的图片来源于互联网的爬取,而非研究机构整理,一共含有13000多张人脸图像,在这个数据集中大约有1860张图片是成对出现的,即同一个人的2张不同照片,有助于人脸识别算法的研究,图像标签中标有人的身份信息,人脸坐标,关键点信息,可用于人脸检测和人脸识别的研究,此数据集是对人脸算法效果验证的权威数据集.

在这里插入图片描述
该数据集包含的人脸范围比较全面,欧亚人种都有。

3.2 深度学习识别算法

卷积神经网络是常见的深度学习架构,而在CNN出现之前,图像需要处理的数据量过大,导致成本很高,效率很低,图像在数字化的过程中很难保留原有的特征,导致图像处理的准确率不高。CNN的出现使得提取特征的能力变得更强,为更多优秀网络的研究提供了有力的支撑。CNN的核心思想是利用神经网络模拟人脑视觉神经系统,构造多个神经元并建立彼此之间的联系。不同的神经元进行分工,浅层神经元处理低纬度图像特征,深层神经元处理图像高级特征、语义信息等,CNN的网络结构主要由卷积层、BN层、激活层、池化层、全连接层、损失函数层构成,多个层协同工作实现了特征提取的功能,并通过特有的网络结构降低参数的数量级,防止过拟合,最终得到输出结果.

CNN传承了多层感知机的思想,并受到了生物神经科学的启发,通过卷积的运算模拟人类视觉皮层的“感受野”。不同于传统的前馈神经网络,卷积运算对图像的区域值进行加权求和,最终以神经元的形式进行输出。前馈神经网络对每一个输入的信号进行加权求和:

  • (a)图是前馈神经网络的连接方式
  • (b)图是CNN的连接方式。

在这里插入图片描述
cnn框架如下:
在这里插入图片描述

3.3 特征提取主干网络

在深度学习算法研究中,通用主干特征提取网络结合特定任务网络已经成为一种标准的设计模式。特征提取对于分类、识别、分割等任务都是至关重要的部分。下面介绍本文研究中用到的主干神经网络。

ResNet网络
ResNet是ILSVRC-2015的图像分类任务冠军,也是CVPR2016的最佳论文,目前应用十分广泛,ResNet的重要性在于将网络的训练深度延伸到了数百层,而且取得了非常好的效果。在ResNet出现之前,网络结构一般在20层左右,对于一般情况,网络结构越深,模型效果就会越好,但是研究人员发现加深网络反而会使结果变差。

在这里插入图片描述

人脸特征提取我这里选用ResNet,网络结构如下:
在这里插入图片描述

3.4 总体实现流程

在这里插入图片描述

4 具体实现

4.1 预训练数据格式

在这里插入图片描述

在这里插入图片描述

4.2 部分实现代码

训练部分代码:



    from __future__ import absolute_import
    from __future__ import division
    from __future__ import print_function
    
    from six.moves import xrange
    from datetime import datetime
    import time
    import os
    import numpy as np
    import tensorflow as tf
    from data import distorted_inputs
    from model import select_model
    import json
    import re


    LAMBDA = 0.01
    MOM = 0.9
    tf.app.flags.DEFINE_string('pre_checkpoint_path', '',
                               """If specified, restore this pretrained model """
                               """before beginning any training.""")
    
    tf.app.flags.DEFINE_string('train_dir', '/home/dpressel/dev/work/AgeGenderDeepLearning/Folds/tf/test_fold_is_0',
                               'Training directory')
    
    tf.app.flags.DEFINE_boolean('log_device_placement', False,
                                """Whether to log device placement.""")
    
    tf.app.flags.DEFINE_integer('num_preprocess_threads', 4,
                                'Number of preprocessing threads')
    
    tf.app.flags.DEFINE_string('optim', 'Momentum',
                               'Optimizer')
    
    tf.app.flags.DEFINE_integer('image_size', 227,
                                'Image size')
    
    tf.app.flags.DEFINE_float('eta', 0.01,
                              'Learning rate')
    
    tf.app.flags.DEFINE_float('pdrop', 0.,
                              'Dropout probability')
    
    tf.app.flags.DEFINE_integer('max_steps', 40000,
                              'Number of iterations')
    
    tf.app.flags.DEFINE_integer('steps_per_decay', 10000,
                                'Number of steps before learning rate decay')
    tf.app.flags.DEFINE_float('eta_decay_rate', 0.1,
                              'Learning rate decay')
    
    tf.app.flags.DEFINE_integer('epochs', -1,
                                'Number of epochs')
    
    tf.app.flags.DEFINE_integer('batch_size', 128,
                                'Batch size')
    
    tf.app.flags.DEFINE_string('checkpoint', 'checkpoint',
                              'Checkpoint name')
    
    tf.app.flags.DEFINE_string('model_type', 'default',
                               'Type of convnet')
    
    tf.app.flags.DEFINE_string('pre_model',
                                '',#'./inception_v3.ckpt',
                               'checkpoint file')
    FLAGS = tf.app.flags.FLAGS
    
    # Every 5k steps cut learning rate in half
    def exponential_staircase_decay(at_step=10000, decay_rate=0.1):
    
        print('decay [%f] every [%d] steps' % (decay_rate, at_step))
        def _decay(lr, global_step):
            return tf.train.exponential_decay(lr, global_step,
                                              at_step, decay_rate, staircase=True)
        return _decay
    
    def optimizer(optim, eta, loss_fn, at_step, decay_rate):
        global_step = tf.Variable(0, trainable=False)
        optz = optim
        if optim == 'Adadelta':
            optz = lambda lr: tf.train.AdadeltaOptimizer(lr, 0.95, 1e-6)
            lr_decay_fn = None
        elif optim == 'Momentum':
            optz = lambda lr: tf.train.MomentumOptimizer(lr, MOM)
            lr_decay_fn = exponential_staircase_decay(at_step, decay_rate)
    
        return tf.contrib.layers.optimize_loss(loss_fn, global_step, eta, optz, clip_gradients=4., learning_rate_decay_fn=lr_decay_fn)
    
    def loss(logits, labels):
        labels = tf.cast(labels, tf.int32)
        cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
            logits=logits, labels=labels, name='cross_entropy_per_example')
        cross_entropy_mean = tf.reduce_mean(cross_entropy, name='cross_entropy')
        tf.add_to_collection('losses', cross_entropy_mean)
        losses = tf.get_collection('losses')
        regularization_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
        total_loss = cross_entropy_mean + LAMBDA * sum(regularization_losses)
        tf.summary.scalar('tl (raw)', total_loss)
        #total_loss = tf.add_n(losses + regularization_losses, name='total_loss')
        loss_averages = tf.train.ExponentialMovingAverage(0.9, name='avg')
        loss_averages_op = loss_averages.apply(losses + [total_loss])
        for l in losses + [total_loss]:
            tf.summary.scalar(l.op.name + ' (raw)', l)
            tf.summary.scalar(l.op.name, loss_averages.average(l))
        with tf.control_dependencies([loss_averages_op]):
            total_loss = tf.identity(total_loss)
        return total_loss
    
    def main(argv=None):
        with tf.Graph().as_default():
    
            model_fn = select_model(FLAGS.model_type)
            # Open the metadata file and figure out nlabels, and size of epoch
            input_file = os.path.join(FLAGS.train_dir, 'md.json')
            print(input_file)
            with open(input_file, 'r') as f:
                md = json.load(f)
    
            images, labels, _ = distorted_inputs(FLAGS.train_dir, FLAGS.batch_size, FLAGS.image_size, FLAGS.num_preprocess_threads)
            logits = model_fn(md['nlabels'], images, 1-FLAGS.pdrop, True)
            total_loss = loss(logits, labels)
    
            train_op = optimizer(FLAGS.optim, FLAGS.eta, total_loss, FLAGS.steps_per_decay, FLAGS.eta_decay_rate)
            saver = tf.train.Saver(tf.global_variables())
            summary_op = tf.summary.merge_all()
    
            sess = tf.Session(config=tf.ConfigProto(
                log_device_placement=FLAGS.log_device_placement))
    
            tf.global_variables_initializer().run(session=sess)
    
            # This is total hackland, it only works to fine-tune iv3
            if FLAGS.pre_model:
                inception_variables = tf.get_collection(
                    tf.GraphKeys.VARIABLES, scope="InceptionV3")
                restorer = tf.train.Saver(inception_variables)
                restorer.restore(sess, FLAGS.pre_model)
    
            if FLAGS.pre_checkpoint_path:
                if tf.gfile.Exists(FLAGS.pre_checkpoint_path) is True:
                    print('Trying to restore checkpoint from %s' % FLAGS.pre_checkpoint_path)
                    restorer = tf.train.Saver()
                    tf.train.latest_checkpoint(FLAGS.pre_checkpoint_path)
                    print('%s: Pre-trained model restored from %s' %
                          (datetime.now(), FLAGS.pre_checkpoint_path))


            run_dir = '%s/run-%d' % (FLAGS.train_dir, os.getpid())
    
            checkpoint_path = '%s/%s' % (run_dir, FLAGS.checkpoint)
            if tf.gfile.Exists(run_dir) is False:
                print('Creating %s' % run_dir)
                tf.gfile.MakeDirs(run_dir)
    
            tf.train.write_graph(sess.graph_def, run_dir, 'model.pb', as_text=True)
    
            tf.train.start_queue_runners(sess=sess)


            summary_writer = tf.summary.FileWriter(run_dir, sess.graph)
            steps_per_train_epoch = int(md['train_counts'] / FLAGS.batch_size)
            num_steps = FLAGS.max_steps if FLAGS.epochs < 1 else FLAGS.epochs * steps_per_train_epoch
            print('Requested number of steps [%d]' % num_steps)



            for step in xrange(num_steps):
                start_time = time.time()
                _, loss_value = sess.run([train_op, total_loss])
                duration = time.time() - start_time
    
                assert not np.isnan(loss_value), 'Model diverged with loss = NaN'
    
                if step % 10 == 0:
                    num_examples_per_step = FLAGS.batch_size
                    examples_per_sec = num_examples_per_step / duration
                    sec_per_batch = float(duration)
                    
                    format_str = ('%s: step %d, loss = %.3f (%.1f examples/sec; %.3f ' 'sec/batch)')
                    print(format_str % (datetime.now(), step, loss_value,
                                        examples_per_sec, sec_per_batch))
    
                # Loss only actually evaluated every 100 steps?
                if step % 100 == 0:
                    summary_str = sess.run(summary_op)
                    summary_writer.add_summary(summary_str, step)
                    
                if step % 1000 == 0 or (step + 1) == num_steps:
                    saver.save(sess, checkpoint_path, global_step=step)
    
    if __name__ == '__main__':
        tf.app.run()



5 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1454073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【IEEE-Trans】这本TOP刊一点不拖泥带水,审稿很利索!质量也很不错!

【SciencePub学术】 期刊信息简介 IEEE TRANSACTIONS ON INSTRUMENTATION AND MEASUREMENT IF(2022)&#xff1a;5.6&#xff0c;JCR1区&#xff0c;中科院2区TOP 期刊数据指标 ISSN&#xff1a;0018-9456 IF(2022)&#xff1a;5.6 自引率&#xff1a;23.20% 年发文量&a…

好的程序员不该局限技术故步自封,更多去了解产品,运营,销售,推广,公司运作吧

在当今技术迅速发展的时代&#xff0c;作为程序员&#xff0c;我们常常面临着学习速度跟不上技术变化的困扰。每年涌现的新技术、新框架&#xff0c;给我们带来了巨大的挑战。尤其是随着年龄增长&#xff0c;学习能力的下降似乎让我们更加被动。技术的发展也并非一帆风顺&#…

【大厂AI课学习笔记】【2.1 人工智能项目开发规划与目标】(6)特征工程初步

特征工程是一个非常重要的概念&#xff0c;从特征工程可以领会到机器学习的真谛。 特征工程就是从原始数据转换为特征向量的过程。 特征工程的特点&#xff1a; 特征工程是机器学习中很重要的起始步骤&#xff0c;直接影响效果&#xff0c;需要大量的时间。 数据和特征决定了…

NLP深入学习:《A Survey of Large Language Models》详细学习(六)

文章目录 1. 前言2. LLMs 能力与评价方法2.1 基础能力2.1.1 语言生成2.1.2 知识利用率2.1.3 复杂推理 2.2 高阶能力2.3 基准和评估方法2.3.1 评价基准2.3.2 评估方法2.3.3 评估方法优点和不足 3. 参考 1. 前言 最近正在读 LLM 论文的综述&#xff0c;当前采取的策略是部分内容…

【JVM】打破双亲委派机制

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;JVM ⛺️稳中求进&#xff0c;晒太阳 打破双亲委派机制 打破双亲委派机制三种方法 自定义类加载器 ClassLoader包含了四个核心方法 //由类加载器子类实现&#xff0c;获取二进制数据调用…

安装cockpit

1、下载cockpit yum -y install cockpit 下载相关环境 yum install qemu-kvm libvirt libvirt-daemon virt-install virt-manager libvirt-dbus 2、启动libvirtd systemctl start libvirtd.service systemctl enable libvirtd.service 3、设置开机自启动 systemctl enabl…

高程 | 继承与派生(c++)

文章目录 &#x1f4da;继承的概念和语法&#x1f4da;派生类生成过程&#x1f4da;继承权限和继承方式&#x1f407;公有继承&#x1f407;私有继承&#x1f407;保护继承 &#x1f4da;类型转换规则&#x1f4da;派生类构造函数和析构函数&#x1f4da;继承中的静态成员特性&…

并发编程之深入理解JVM并发三大特性

并发编程之深入理解JVM&并发三大特性 并发编程解决的问题 ​ 多线程同步&#xff08;一个线程需要等待另一个线程的结果&#xff0c;一个线程依赖于另一个线程&#xff09;&#xff0c;互斥&#xff08;一个资源只能一个线程使用&#xff09;&#xff0c;分工&#xff08…

华为配置直连二层组网隧道转发示例

配置直连二层组网隧道转发示例 组网图形 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件扩展阅读 业务需求 企业用户通过WLAN接入网络&#xff0c;以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时&#xff0c;不影响用户的业务使用。 组网需求 AC组…

Open CASCADE学习|布尔运算

目录 1、加法&#xff1a;BRepAlgoAPI_Fuse 2、减法&#xff1a;BRepAlgoAPI_Cut 3、交集&#xff1a;BRepAlgoAPI_Common 4、交线&#xff1a;BRepAlgoAPI_Section 1、加法&#xff1a;BRepAlgoAPI_Fuse #include <gp_Pnt.hxx>#include <BRepPrimAPI_MakeBox.hxx…

计算机网络-数据通信基础

目录 前言 一、数据通信基本概念 二、数据通信相关知识1 总结 前言 正在学习计算机网络体系&#xff0c;把每日所学的知识梳理出来&#xff0c;既能够当作读书笔记&#xff0c;又能分享出来和大家一同学习讨论。 一、数据通信基本概念 基本概念&#xff1a;信源、信道、信宿&…

怎么防止u盘里的东西被拷贝?

随着科技的进步&#xff0c;U盘作为便携式存储设备&#xff0c;在我们的日常工作和生活中扮演着越来越重要的角色。然而&#xff0c;这也带来了一个潜在的安全风险——U盘内的数据可能被未经授权的人员拷贝。 一、了解U盘拷贝数据的常见方式 在探讨如何防止U盘数据被拷贝之前&…

setTimeout及setInterval

setTimeout用法&#xff1a; 过100ms调用函数 setTimeout((a) > {console.log(111,a);}, 100,我是定时器); 参数&#xff1a; 第一个参数&#xff1a;必填&#xff0c;回调函数&#xff1b; 第二个参数&#xff1a;可选&#xff0c;延迟时间&#xff0c;单位ms 第三个参…

Apache Httpd 常见漏洞解析(全)

一、Apache HTTPD 换行解析漏洞 漏洞编号&#xff1a;CVE-2017-15715 Apache HTTPD是一款HTTP服务器&#xff0c;它可以通过mod_php来运行PHP网页。 其2.4.0~2.4.29版本中存在一个解析漏洞。 在解析PHP时&#xff0c;1.php\x0A将被按照PHP后缀进行解析&#xff0c;导致绕过…

springboot第56集:微服务框架,物联网IOT,SQL数据库MySQL底层,AOP收集业务操作日志架构周刊...

单点登录 1.配置代理信息 /*请求登陆的方法*/ "/modelLogin": {//本地服务接口地址&#xff0c;这是测试环境&#xff0c;正式环境需要更改下地址target: "http://127.0.0.1:6776/xxx-auth/",changeOrigin: true,pathRewrite: {"^/modelLogin": …

MATLAB知识点:ismembertol函数(★★☆☆☆)考虑了一定的容差的ismember函数

讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章&#xff1a;课后习题讲解中拓展的函数 在讲解第三…

人工智能学习与实训笔记(八):百度飞桨套件使用方法介绍

人工智能专栏文章汇总&#xff1a;人工智能学习专栏文章汇总-CSDN博客 本篇目录 八、百度飞桨套件使用 8.1 飞桨预训练模型套件PaddleHub 8.1.1 一些本机CPU可运行的飞桨预训练简单模型&#xff08;亲测可用&#xff09; 8.1.1.1 人脸检测模型 8.1.1.2 中文分词模型 8.1…

【开源】SpringBoot框架开发创意工坊双创管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员端2.2 Web 端2.3 移动端 三、系统展示四、核心代码4.1 查询项目4.2 移动端新增团队4.3 查询讲座4.4 讲座收藏4.5 小程序登录 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的创意工坊双创管理…

Portraiture插件2024官方版功能主要介绍

Portraiture插件的功能主要包括&#xff1a; 一键平滑处理&#xff1a;可以对眉毛、头发等毛发材质进行一键平滑处理&#xff0c;使其质感显得更加光鲜亮丽。同时&#xff0c;这种处理还能保证原有图像的画质。使用吸管工具添加肤色蒙版&#xff1a;这个工具可以吸取人物面部的…

php基础学习之匿名函数

匿名函数 描述 允许临时创建一个没有指定名称的函数&#xff0c;使用匿名函数可以方便地创建一次性或临时的功能块。 语法 function (){ //函数体 }; 样例 &#xff08;注&#xff1a;匿名函数定义后&#xff0c;需要将其赋值给一个变量&#xff0c;然后通过该变量来调用 这种调…