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

判断性别和年龄

    • 导入必要的库
    • 加载预训练的人脸检测模型
    • 加载预训练的性别和年龄识别模型
    • 定义性别和年龄的标签列表
    • 创建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.mzph.cn/pingmian/21734.shtml

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

相关文章

Docker大学生看了都会系列(二、Mac通过Homebrew安装Docker)

系列文章目录 第一章 Docker介绍 第二章 Mac通过Homebrew安装Docker 文章目录 前言Mac通过Homebrew安装本机环境系统要求terminal命令安装查看安装信息配置阿里云镜像加速登陆阿里云配置加速地址其他国内加速地址 总结 前言 在上一章了解了Docker容器是什么之后,本…

solidworks二维样条曲线使用实例

单位mm 绘制一个圆 直径为50mm, 基准面 上视基准面,距离50mm, 2个六边形 一个内嵌圆 另一个直径60mm, 将两个六边形改成构造线 选择样条曲线,将六边形的顶点连接在一起 放样曲面 插入–曲面–放样曲面 平面区域…

RabbitMQ不完整的笔记

同步的不足 1、拓展性差,当要添加功能时,需要在原来的功能代码上做修改,高耦合。 2、性能下降,调用者需要等待服务提供者执行完返回结果后,才能继续向下执行 3、级联失败,由于我们是基于OpenFeign调用交易…

Visual Studio Code使用(C++项目新建,运行)

VS Code 直接在官网下载安装。 接下来安装插件,下图是C所需的对应插件 1.新建项目 VS Code下载安装完成后,直接进入欢迎页: 在访达/文件夹中新建一个文件夹,欢迎页点击【打开】,选择刚刚新建的文件夹。点击第一个图…

华为OD机试 - 最大坐标值(Java 2024 D卷 100分)

华为OD机试 2024C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷C卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试…

数据结构第三篇【链表的相关知识点一及在线OJ习题】

数据结构第三篇【链表的相关知识点一及在线OJ习题】 链表链表的实现链表OJ习题顺序表和链表的区别和联系 本文章主要讲解关于链表的相关知识,喜欢的可以三连喔 😀😃😄😄😊😊🙃&#…

Makefile的入门学习

一、Makefile的入门学习 编译工具及构建工具介绍 在之前的课程,都是直接使用gcc对代码进行编译,这对简单的工程是可以的,但当我们遇到复杂的工程时,每次用gcc等编译工具去操作就会显得很低效。因此make工具就出现了,…

LeetCode1137第N个泰波那契数

题目描述 泰波那契序列 Tn 定义如下: T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2给你整数 n,请返回第 n 个泰波那契数 Tn 的值。 解析 递归应该会超时,可以用循环,或者官方解法的矩阵的幂。 public int tr…

(4) qml动态元素

文章目录 概述注意 动画元素变化的策略Animation on 变化behavior on⽤standalone animation注意 缓冲曲线(Easing Curves)动画分组 概述 这⼀章介绍如何控制属性值的变化,通过动画的⽅式在⼀段时间内来改变属性值。这项技术是建⽴⼀个现代化…

获取(复制)网页上的文字

获取(复制)网页上的文字 今天在搜索历史课本上一段文言文的翻译时,找到的网页,屏蔽了右键,不能选择,当然不让复制啦。对于这样的网站可以采用如下方法进行数据的获取,以chrome为例。 1、网页另…

keil5常见使用技巧记录(更新)

快速到函数定义 F12或自己定义快捷键CTRLK(个人设定) 修改快捷键 下图实例是快速跳转到函数或变量定义位置,当然可以定义其他功能快捷键,如快速注释多行,快速消除注释等 标记全部查找变量的蓝色框取消 CTRLshiftF2…

【YOLOv10改进[Backbone]】图像修复网络AirNet助力YOLOv10目标检测效果 + 含全部代码和详细修改方式 + 手撕结构图 + 全网首发

本文带来的是图像复原网络AirNet,它由基于对比度的退化编码器( CBDE )和退化引导的恢复网络( DGRN )两个模块组成。可以在一个网络中恢复各种退化图像。AirNet不受损坏类型和级别的先验限制,仅使用观察到的损坏图像进行推理。本文中将使用图像修复网络Ai…

使用Python绘制瀑布图

使用Python绘制瀑布图 瀑布图效果代码 瀑布图 瀑布图(Waterfall Chart)是一种数据可视化工具,用于展示累积数值的变化,尤其适合于展示随时间或过程中的增减变化。它通常用于财务分析,如展示收入、支出和净利润的变化过…

【离散数学】数理逻辑集合论知识点汇总

期末题型: 一、 单选题(每题2分,10题共20分) 命题判定、哈斯图边计算等 二、 填空题(每空1分,共20分) 与非和或非的表示等 三、 简答题(10题,每题6分,共60分&…

安装禅道,帮助测试,测试打磨项目精度。

先检查docker版本。 sudo docker network create --subnet172.172.172.0/24 zentaonet sudo docker run --name zentao2 -p 8080:80 -p 3307:3306 --networkzentaonet --ip 172.172.172.3 -e MYSQL_INTERNALtrue -v /media/cykj/3T/ze…

【十年java搬砖路】Jumpserver docker版安装及配置Ldap登陆认证

Jumpserver docker 安装启动教程 拉取镜像 docker pull JumpServer启动进行前确保有Redis 和Mysql 创建jumperServer数据库 在MYSQL上执行 创建数据库 登陆MYSQL mysql -u root -p 创建Jumperserveri库 create database jumpserver default charset utf8mb4;可以为jumperSe…

【软件开发】Java学习路线

本路径视频教程均来自尚硅谷B站视频,Java学习课程我已经收藏在一个文件夹下,B站文件夹同时会收藏其他Java视频,感谢关注。指路:https://www.bilibili.com/medialist/detail/ml3113981545 2024Java学习路线(快速版&…

揭秘YAML:Python中的PyYAML应用

🍀 前言 博客地址: CSDN:https://blog.csdn.net/powerbiubiu 👋 简介 本章节介绍YAML文件格式的操作,通过Python的第三方库 PyYaml 来实现文件操作,在 Pyhon 代码中无论读取还是写入,都是使用…

【机器学习】逻辑回归:原理、应用与实践

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 逻辑回归:原理、应用与实践引言1. 逻辑回归基础1.1 基本概念1.2 Sig…

视频汇聚EasyCVR安防系统对接公安部GA/T 1400视图库布控、告警、订阅流程描述

随着信息技术的飞速发展,视频监控在公共安全领域的应用越来越广泛,对于视频监控系统的要求也日益严格。为了满足公安系统对视频图像信息应用的高标准需求,视频汇聚平台EasyCVR视频监控系统全面支持GA/T 1400标准协议,为公安部门提…