对人脸图像进行性别和年龄的判断

判断性别和年龄

    • 导入必要的库
    • 加载预训练的人脸检测模型
    • 加载预训练的性别和年龄识别模型
    • 定义性别和年龄的标签列表
    • 创建Tkinter窗口:
    • 定义选择图片的函数:
    • 创建一个按钮,用于打开文件选择对话框
    • 定义显示图片的函数
    • 创建预测性别和年龄的函数
    • 创建预测性别和年龄的按钮
    • 运行Tkinter事件循环
    • 完整代码

导入必要的库

cv2:OpenCV库,用于图像处理。
numpy:用于数值计算。
tkinter:Python的标准GUI库,用于创建图形用户界面。
filedialog:Tkinter的文件对话框,用于打开文件。
Image:PIL(Pillow)库,用于图像处理。
ImageTk:PIL(Pillow)库的Tkinter封装,用于将PIL图像转换为Tkinter支持的格式。

import cv2
import numpy as np
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk

加载预训练的人脸检测模型

使用cv2.CascadeClassifier加载Haar级联分类器,用于检测图像中的人脸。

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

加载预训练的性别和年龄识别模型

使用cv2.dnn.readNetFromCaffe加载Caffe模型,用于预测人脸的性别和年龄。

gender_net = cv2.dnn.readNetFromCaffe('deploy_gender.prototxt', 'gender_net.caffemodel')
age_net = cv2.dnn.readNetFromCaffe('deploy_age.prototxt', 'age_net.caffemodel')

定义性别和年龄的标签列表

创建两个列表,分别用于存储性别和年龄的标签。

gender_list = ['man', 'woman']
age_list = ['(0-10)', '(10-15)', '(15-20)', '(20-30)', '(45-55)', '(55-65)', '(65-80)', '(80-100)']

创建Tkinter窗口:

创建一个名为"选择图片"的窗口,并设置其大小。

root = tk.Tk()
root.title("选择图片")
root.geometry("1000x620")

定义选择图片的函数:

使用filedialog.askopenfilename打开一个文件选择对话框,让用户选择要处理的图片。
如果用户选择了图片,则调用display_image函数来显示图片。

def select_image():file_path = filedialog.askopenfilename()if file_path:img = cv2.imread(file_path)if img is not None:display_image(file_path)

创建一个按钮,用于打开文件选择对话框

创建一个按钮,当用户点击时,会调用select_image函数。

open_image_btn = tk.Button(root, text="选择图片",font=('微软雅黑', 12), command=select_image)
open_image_btn.place(x=250,y=10)

定义显示图片的函数

读取用户选择的图片,并将其转换为PIL图像。
将PIL图像转换为Tkinter支持的格式,并在窗口中显示。

def display_image(file_path):# 确保 img 变量已经定义global imgimg = cv2.imread(file_path)if img is not None:# 调整图像大小到相等的大小img = cv2.resize(img, (300, 350))# 将 OpenCV 图像转换为 PIL 图像pil_image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))# 将 PIL 图像转换为 tkinter 支持的格式image_tk = ImageTk.PhotoImage(pil_image)# 在 root 窗口中创建一个标签来显示图像label = tk.Label(root, image=image_tk)label.image = image_tk  # 保持引用,否则图像在重新绘制时会丢失label.place(x=60, y=50)

创建预测性别和年龄的函数

检测图片中的人脸。
对于每个检测到的人脸,裁剪出人脸区域。
将裁剪出的人脸区域转换为Caffe模型所需的格式,并输入模型进行预测。
预测出性别和年龄后,在原图上画出人脸框,并在框内显示性别和年龄。
将处理后的图片转换为PIL图像,并转换为Tkinter支持的格式,以便在窗口中显示。

def predict_gender_and_age():# 确保 img 变量已经定义global imgif img is not None:# 复制原始图像,以免影响其他预测result_img = img.copy()# 转换为灰度图像gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 检测人脸faces = face_cascade.detectMultiScale(gray, 1.1, 4)# 遍历检测到的人脸for (x, y, w, h) in faces:# 从原始图像中裁剪人脸区域face_img = img[y:y + h, x:x + w].copy()# 预处理人脸图像以适应神经网络输入blob = cv2.dnn.blobFromImage(face_img, 1, (227, 227), (78.4263377603, 87.7689143744, 114.895847746), swapRB=False)# 预测性别gender_net.setInput(blob)gender_preds = gender_net.forward()gender = gender_list[gender_preds[0].argmax()]# 预测年龄age_net.setInput(blob)age_preds = age_net.forward()age = age_list[age_preds[0].argmax()]# 在人脸周围画框并显示性别和年龄cv2.rectangle(result_img, (x, y), (x + w, y + h), (255, 255, 0), 2)cv2.putText(result_img, f'{gender}, {age}', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2, cv2.LINE_AA)# 将 OpenCV 图像转换为 PIL 图像pil_image = Image.fromarray(cv2.cvtColor(result_img, cv2.COLOR_BGR2RGB))# 将 PIL 图像转换为 tkinter 支持的格式image_tk = ImageTk.PhotoImage(pil_image)# 在 root 窗口中创建一个标签来显示图像label = tk.Label(root, image=image_tk)label.image = image_tk  # 保持引用,否则图像在重新绘制时会丢失label.place(x=550, y=50)

创建预测性别和年龄的按钮

创建一个按钮,当用户点击时,会调用predict_gender_and_age函数。

predict_gender_age_btn = tk.Button(root, text="预测性别和年龄",font=('微软雅黑', 12), command=predict_gender_and_age)
predict_gender_age_btn.place(x=650,y=10)

运行Tkinter事件循环

启动Tkinter的事件循环,使窗口保持打开状态。

root.mainloop()

完整代码

import cv2
import numpy as np
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk# 加载预训练的人脸检测模型
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 加载预训练的性别和年龄识别模型
gender_net = cv2.dnn.readNetFromCaffe('deploy_gender.prototxt', 'gender_net.caffemodel')
age_net = cv2.dnn.readNetFromCaffe('deploy_age.prototxt', 'age_net.caffemodel')# 定义性别和年龄的标签列表
gender_list = ['man', 'woman']
age_list = ['(0-10)', '(10-15)', '(15-20)', '(20-30)', '(45-55)', '(55-65)', '(65-80)', '(80-100)']# 创建 tkinter 窗口
root = tk.Tk()
root.title("选择图片")
root.geometry("1000x620")
# 定义选择图片的函数
def select_image():file_path = filedialog.askopenfilename()if file_path:img = cv2.imread(file_path)if img is not None:display_image(file_path)# 创建一个按钮,用于打开文件选择对话框
open_image_btn = tk.Button(root, text="选择图片",font=('微软雅黑', 12), command=select_image)
open_image_btn.place(x=250,y=10)# 定义显示图片的函数
def display_image(file_path):# 确保 img 变量已经定义global imgimg = cv2.imread(file_path)if img is not None:# 调整图像大小到相等的大小img = cv2.resize(img, (300, 350))# 将 OpenCV 图像转换为 PIL 图像pil_image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))# 将 PIL 图像转换为 tkinter 支持的格式image_tk = ImageTk.PhotoImage(pil_image)# 在 root 窗口中创建一个标签来显示图像label = tk.Label(root, image=image_tk)label.image = image_tk  # 保持引用,否则图像在重新绘制时会丢失label.place(x=60, y=50)# label.pack()# 创建预测性别和年龄的函数
def predict_gender_and_age():# 确保 img 变量已经定义global imgif img is not None:# 复制原始图像,以免影响其他预测result_img = img.copy()# 转换为灰度图像gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 检测人脸faces = face_cascade.detectMultiScale(gray, 1.1, 4)# 遍历检测到的人脸for (x, y, w, h) in faces:# 从原始图像中裁剪人脸区域face_img = img[y:y + h, x:x + w].copy()# 预处理人脸图像以适应神经网络输入blob = cv2.dnn.blobFromImage(face_img, 1, (227, 227), (78.4263377603, 87.7689143744, 114.895847746), swapRB=False)# 预测性别gender_net.setInput(blob)gender_preds = gender_net.forward()gender = gender_list[gender_preds[0].argmax()]# 预测年龄age_net.setInput(blob)age_preds = age_net.forward()age = age_list[age_preds[0].argmax()]# 在人脸周围画框并显示性别和年龄cv2.rectangle(result_img, (x, y), (x + w, y + h), (255, 255, 0), 2)cv2.putText(result_img, f'{gender}, {age}', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2, cv2.LINE_AA)# 将 OpenCV 图像转换为 PIL 图像pil_image = Image.fromarray(cv2.cvtColor(result_img, cv2.COLOR_BGR2RGB))# 将 PIL 图像转换为 tkinter 支持的格式image_tk = ImageTk.PhotoImage(pil_image)# 在 root 窗口中创建一个标签来显示图像label = tk.Label(root, image=image_tk)label.image = image_tk  # 保持引用,否则图像在重新绘制时会丢失label.place(x=550, y=50)# 创建预测性别和年龄的按钮
predict_gender_age_btn = tk.Button(root, text="预测性别和年龄",font=('微软雅黑', 12), command=predict_gender_and_age)
predict_gender_age_btn.place(x=650,y=10)# 运行 tkinter 事件循环
root.mainloop()

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/4c3da06144d14c74a6952d75d6dddcd3.png

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue2 bug求助!!!(未解决,大概是浏览器缓存的问题或者是路由的问题)

我的vue2项目出现了一个超级恶心的bug 过程: 1 操作流程:页面a点击a标签->到页面b->页面b用户退出刷新页面->点击浏览器的返回按钮返回上一页 2 结果:返回页面后页面没有刷新导致用户名还显示着,页面没有发生任何变化&a…

基于Pytorch框架的深度学习ShufflenetV2神经网络十七种猴子动物识别分类系统源码

第一步:准备数据 17种猴子动物数据: self.class_indict ["白头卷尾猴", "弥猴", "山魈", "松鼠猴", "叶猴", "银色绒猴", "印度乌叶猴", "疣猴", "侏绒"…

​研学活动方案模板,详细制作步骤!​

研学活动,作为教育实践的重要组成部分,为我们的学生提供了一个广阔的学习平台。在这个平台上,学生们能够将书本上的知识与现实世界紧密联系起来,通过实践探索来培养能力。但对于咱们老师来说,学校组织研学活动要考虑到…

“雪糕刺客”爆改“红薯刺客”,钟薛高给了消费品牌哪些启示?

夏日袭来,一支价格高昂却让人眼前一亮的雪糕,曾一度成为市场热议的焦点。然而,随着消费者对性价比的日益关注,曾经的“雪糕刺客”钟薛高,其创始人林盛近期以直播带货红薯开启他的还债之路,高打情怀“直播自…

STM32学习和实践笔记(33):待机唤醒实验

1.STM32待机模式介绍 很多单片机具有低功耗模式,比如MSP430、STM8L等,我们的STM32也不例外。默认情况下,系统复位或上电复位后,微控制器进入运行模式。在运行模式下,HCLK 为CPU提供时钟,并执行程序代码。这…

java配置文件解析yml/xml/properties文件

XML 以mybatis.xml:获取所有Environment中的数据库并连接session为例 import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException;import javax.xml.parsers.DocumentBuilder; impo…

springboot基本使用十一(自定义全局异常处理器)

例如:我们都知道在java中被除数不能为0,为0就会报by zero错误 RestController public class TestController {GetMapping("/ex")public Integer ex(){int a 10 / 0;return a;}} 打印结果: 如何将这个异常进行处理? 创…

2024年06月在线IDE流行度最新排名

点击查看最新在线IDE流行度最新排名(每月更新) 2024年06月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多,人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…

跨越百亿营收的今世缘,全国化进程仍挑战重重?

当前,白酒市场正在经历一场深度调整,随着存量时代到来,白酒品牌地位的更替和竞争格局的重构已经展开。这一背景下,今世缘等地方性酒企也正在凭借对区域市场的深耕,展现出较快的成长速度,并希望能借此占领市…

AI视频下载:ChatGPT数据科学与机器学习课程

ChatGPT是一个基于OpenAI开发的GPT-3.5架构的AI对话代理。作为一种语言模型,ChatGPT能够理解并对各种主题生成类似人类的响应,使其成为聊天机器人开发、客户服务和内容创作的多用途工具。 此外,ChatGPT被设计为高度可扩展和可定制的,允许开发人员对其响应进行微调并将其集成到…

C/C++动态内存管理(new与delete)

目录 1. 一图搞懂C/C的内存分布 2. 存在动态内存分配的原因 3. C语言中的动态内存管理方式 4. C内存管理方式 4.1 new/delete操作内置类型 4.2 new/delete操作自定义类型 1. 一图搞懂C/C的内存分布 说明: 1. 栈区(stack):在…

ERV-Net:一种用于脑肿瘤分割的高效3D残差神经网络| 文献速递-深度学习肿瘤自动分割

Title 题目 ERV-Net: An efficient 3D residual neural network for brain tumor segmentation ERV-Net:一种用于脑肿瘤分割的高效3D残差神经网络 01 文献速递介绍 脑肿瘤在全球范围内是致命的,与其他类型的肿瘤相比。胶质瘤是最具侵略性的脑肿瘤类…

【机器学习】深入探索机器学习:利用机器学习探索股票价格预测的新路径

❀机器学习 📒1. 引言📒2. 多种机器学习算法的应用📒3. 机器学习在股票价格预测中的应用现状🎉数据收集与预处理🎉模型构建与训练🌈模型评估与预测🌞模型评估🌙模型预测⭐注意事项 &…

教你本地化部署与使用一款免费的LLM应用工程化平台

随着LLM应用的不断成熟,特别是在B端企业场景中的逐渐落地,其不再停留在原型与验证阶段,将面临着更高的工程化要求,无论是输出的稳定性、性能、以及成本控制等,都需要实现真正的“生产就绪”;但由于大量的应…

剖析【C++】——类和对象(下篇)——超详解——小白篇

目录 1.再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1.3 explicit 关键字 2. Static成员 2.1 概念 2.2 特性 3. 友元 3.1 友元函数 3.2 友元类 3.3总结: 4. 内部类 1.概念 2.特性 示例代码: 代码分析 3.总结 5.再次理解类和对象 …

【Java面试】七、SpringMvc的执行流程、SpringBoot自动装配原理

文章目录 1、SpringMVC的执行流程1.1 视图阶段1.2 前后端分离阶段 2、SpringBoot自动配置原理3、框架常用的注解3.1 Spring的注解3.2 SpringMvc的注解3.3 SpringBoot的注解 4、面试 1、SpringMVC的执行流程 1.1 视图阶段 旧项目中,未前后端分离时,用到…

《mysql轻松学习·二》

1、创建数据表 contacts:数据表名 auto_increament:自动增长 primary key:主键 engineInnoDB default charsetutf8; 默认字符集utf8,不写就默认utf8 对数据表的操作: alter table 数据表名 add sex varchar(1); //添…

【C语言】字符串左旋(三种方法)

(方法3只给出思路参考) 问题 描述: 实现一个函数,可以左旋字符串中的k个字符。 例如: ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 分析 我们先来理解一下,什么叫“左旋”?其实是这…

d2-crud-plus 使用小技巧(六)—— 表单下拉选择 行样式 溢出时显示异常优化

问题 vue2 elementUI d2-crud-plus,数据类型为select时,行样式显示为tag样式,但是如果选择内容过长就会出现下面这种bug,显然用户体验不够友好。 期望 代码 js export const crudOptions (vm) > {return {...columns:…

QT 如何在 QListWidget 的选项中插入自定义组件

有时我们需要 QListWidget 完成更复杂的操作,而不仅限于添加文本或者图标,那么就会使用到 setItemWidget 函数,但是这也会伴生一个问题,插入自定义组件后,QListWidget 对选项点击事件的获取会收到阻塞,因…