基于人脸识别的发型推荐系统代码实现

1.摘要

        本文介绍了一个基于人脸识别技术的发型推荐系统的实现与分析。该系统利用Python编程语言和相关库,结合Face++人脸识别API,实现了用户上传照片后的性别识别、脸型分析和发型推荐功能。首先,用户通过Tkinter GUI界面选择上传照片,系统使用PIL库打开并调整图像大小,然后利用Face++ API进行性别和脸型的识别。根据识别结果,系统从预先准备好的发型图片中选取适合的发型进行推荐,并展示给用户选择。通过requests库进行与Face++ API的通信,并利用JSONDecoder解析返回的JSON数据。本文还对使用到的技术和库进行了简要介绍,包括Tkinter、PIL、requests、JSONDecoder等。该发型推荐系统不仅为用户提供了方便快捷的发型选择服务,也展示了人脸识别技术在实际应用中的应用和价值。

 2.发型推荐系统实现过程

        发型推荐系统的实现过程可以分为以下几个主要步骤:
        1.界面设计与图像选择:使用Tkinter库设计用户界面,包括选择文件按钮和展示图片的区域。用户点击选择文件按钮,从本地文件系统中选择一张照片作为输入。
        2.图像处理与上传:使用PIL库打开用户选择的照片,并对其进行必要的调整,如调整大小。将处理后的图像上传至Face++ API进行人脸识别和分析。
        3.人脸识别与脸型分析:使用requests库向Face++ API发送HTTP请求,请求进行人脸检测、性别识别和脸型分析。Face++ API返回识别结果,包括性别和脸型等信息。

def detect_gender(filepath):http_url1 = 'https://api-cn.faceplusplus.com/facepp/v3/detect'data1 = {'api_key': key, 'api_secret': secret, 'return_attributes': "gender"}files1 = {"image_file": open(filepath, "rb")}response1 = requests.post(http_url1, data=data1, files=files1)req_con1 = response1.content.decode('utf-8')req_dict1 = JSONDecoder().decode(req_con1)if response1.status_code == requests.codes.ok:sex = req_dict1["faces"][0]['attributes']['gender']['value']return sexelse:print('faile to detect_gender')return None# 用户脸型def detect_face_type(filepath):http_url2 = 'https://api-cn.faceplusplus.com/facepp/v1/facialfeatures'data2 = {'api_key': key, 'api_secret': secret}files2 = {"image_file": open(filepath, "rb")}response2 = requests.post(http_url2, data=data2, files=files2)req_con2 = response2.content.decode('utf-8')req_dict2 = JSONDecoder().decode(req_con2)if response2.status_code == requests.codes.ok:face_type = req_dict2["result"]["face"]["face_type"]return face_typeelse:print('faile to detect_face_type')return None

        在这段代码中,使用了requests库发送HTTP POST请求至Face++ API的人脸检测和脸型分析接口。请求中包含了用户上传的图像文件以及API密钥等必要参数。Face++ API会对上传的图像进行人脸检测、性别识别和脸型分析,并返回识别结果,其中包括了性别和脸型等信息。最后,根据API返回的结果,提取出性别和脸型等信息并返回给调用者。
        4.发型推荐:根据性别和脸型等识别结果,从预先准备好的发型图片库中选取适合的发型图片。将选取的发型图片展示给用户,供其选择。

def core(sex, face_type):number = 25global num# 针对不同性别和脸型,从预先准备好的发型图片库中选取适合的发型图片,并将其保存到指定目录if sex == 'Male' and face_type == 'pointed_face':# 从预先准备好的男性瓜子脸发型图片库中选取适合的发型图片并融合for i in range(number):if os.path.isfile(r"E:\app\picture\Male_pointed_face" + str(i + 1) + ".jpg"):exm = r"E:\app\picture\Male_pointed_face" + str(i + 1) + ".jpg"result = r"E:\app\picture1\\" + str(i + 1) + ".jpg"merge_face(exm, filepath, result, 90)num += 1elif sex == 'Female' and face_type == 'pointed_face':# 从预先准备好的女性瓜子脸发型图片库中选取适合的发型图片并融合for i in range(number):if os.path.isfile(r"E:\app\picture\Female_pointed_face" + str(i + 1) + ".jpg"):exm = r"E:\app\picture\Female_pointed_face" + str(i + 1) + ".jpg"result = r"E:\app\picture1\\" + str(i + 1) + ".jpg"merge_face(exm, filepath, result, 90)num += 1# 根据其他性别和脸型的情况,类似地从不同的发型图片库中选取适合的发型图片并融合# ...def merge_face(image_url_1, image_url_2, image_url, number):# 调用人脸融合的函数,将选取的发型图片与用户上传的图像进行融合# ...def show(sex, face_type):# 根据性别和脸型等识别结果,展示选取的发型图片给用户供其选择# ...def main():# 根据用户上传的图像,获取性别和脸型等识别结果sex = detect_gender(filepath)face_type = detect_face_type(filepath)# 根据性别和脸型等识别结果,从预先准备好的发型图片库中选取适合的发型图片core(sex, face_type)# 展示选取的发型图片给用户供其选择if num > 0:show(sex, face_type)else:print("No suitable hairstyles found.")

        在这段代码中,根据性别和脸型等识别结果,从预先准备好的发型图片库中选取适合的发型图片,并将其与用户上传的图像进行融合。最后,将融合后的发型图片展示给用户供其选择。
        5.结果展示与保存:将最终选定的发型图片展示给用户,包括可能的发型名称和推荐理由等信息。将生成的发型图片保存到本地文件系统,方便用户后续参考或分享。

3.发型推荐系统实现展示

打开选择的照片:

 进行人脸检测、性别识别和脸型分析:

根据性别和脸型等识别结果,从预先准备好的发型图片库中选取适合的发型图片:

 

 4. 总结

        本文介绍了一个发型推荐系统的实现过程,主要涉及了人脸识别、性别识别、脸型分析以及发型推荐等技术。首先,通过调用Face++ API进行人脸检测、性别识别和脸型分析,获取用户的性别和脸型等信息。然后,根据用户的性别和脸型等识别结果,从预先准备好的发型图片库中选取适合的发型图片,并展示给用户进行选择。整体而言,该发型推荐系统通过结合人脸识别和发型推荐技术,为用户提供了便捷、个性化的发型选择服务。但是仍旧存在不足,下一步工作:
        1.简化函数和模块:可以将一些功能相近的代码块封装成函数,提高代码的可读性和可维护性。
        2.优化用户体验:在展示发型推荐时,可以添加一些按钮或者滑动条,让用户可以方便地浏览和选择发型图片。
        3.界面美化:可以使用更加美观的界面风格,添加一些图标和背景图片,提升用户体验。
代码结构优化:将全局变量和函数封装成类,更好地组织代码结构,方便维护和拓展。
        4.另外,考虑到Face++ API的调用次数限制,可以在开发过程中注意优化算法,减少对API的调用次数,提高系统的性能和稳定性。

        上述代码运行环境为基于python3.7.0配置:setuptools==53.0.0 Cython==0.29.34 pprint==0.1 requests==2.18.4 selenium==3.141.0 future==0.17.1 Pillow==8.4.0;

        代码下载链接:

      https://download.csdn.net/download/weixin_40651515/89133489

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

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

相关文章

gpt在线网页版最全收录

ChatGPT镜像 今天在知乎看到一个问题:“平民不参与内测的话没有账号还有机会使用ChatGPT吗?” 从去年GPT大火到现在,关于GPT的消息铺天盖地,真要有心想要去用,途径很多,别的不说,国内GPT的镜像…

Linux网络基础 (二) ——(IP、MAC、端口号、TCPUDP协议、网络字节序)

文章目录 IP 地址基本概念源IP地址 & 目的IP地址 MAC 地址基本概念源MAC地址 & 目的MAC地址 端口号基本概念源端口号 & 目的端口号 TCP & UDP 协议基本概念TCP 与 UDP 的抉择 网络字节序大端、小端字节序 🎖 博主的CSDN主页:Ryan.Alask…

DAY8|344.反转字符串、541. 反转字符串II、151.翻转字符串里的单词

344.反转字符串、541. 反转字符串II、151.翻转字符串里的单词 344.反转字符串541. 反转字符串II151.翻转字符串里的单词 344.反转字符串 本题是字符串基础题目,就是考察 reverse 函数的实现,同时也明确一下 平时刷题什么时候用 库函数,什么时…

1.9 数据结构之 并查集

编程总结 在刷题之前需要反复练习的编程技巧,尤其是手写各类数据结构实现,它们好比就是全真教的上乘武功 本栏目为学习笔记参考:https://leetcode.cn/leetbook/read/disjoint-set/oviefi/ 1.0 概述 并查集(Union Find&#xff09…

vue2/vue3定时处理某个方法

一、vue2定时器 在Vue 2中,你可以使用mounted生命周期钩子来启动一个定时器,并在beforeDestroy钩子中清除它,以确保不会发生内存泄漏。以下是一个简单的例子: export default {data() {return {timerId: null};},mounted() {// …

# Nacos 服务发现-快速入门-测试多实例 Ribbon 负载均衡

Nacos 服务发现-快速入门-测试多实例 Ribbon 负载均衡 1、修改 服务生产模块 quickstart_provider 子工程中的 配置文件 application.yaml port: ${port:56010} # 启动端口 # 修改为动态传参,如果未传参数,默认端口为 56010 2、在 idea 中,…

内网渗透-Linux内网渗透

系列文章目录 文章目录 系列文章目录一、Linux内网渗透二、提权 2.1 利用内核漏洞进行提权2.2 利用文件权限配置不当进行提权2.3 利用SUID程序进行提权 三、隧道 3.1 SSH3.2 nc/ncat3.3 portmap3.4 portfw 四、反弹shell 4.1 bash4.2 netcat4.3 php4.4 perl4.5 python4.6 ruby4…

Prime (2021): 2

前言 这个靶机有亿点难,收获很多。打靶的时候,前面很顺,到创建ssh公钥之后就一点不会了。 1 01 arp扫描,发现有一个130,再查看端口 有22,80,129,445,10123 dirb扫描目录 这…

蓝牙技术在智能硬件中应用火热,你的蓝牙适配测试如何解决?

蓝牙技术在物联网中的应用非常广泛,可以为人们的生活和工作带来更多的便利和智能化体验,主要五大核心应用场景,具体如下: 1、智能家居 通过蓝牙连接智能家居设备,如智能灯泡、智能插座、智能恒温器等,可以…

chrome截屏插件用到的JavaScript 库,图像处理库,

包含的库介绍 javascripts\libs\ InboxSDK.js InboxSDK 是一个 JavaScript 库,用于在 Gmail 中添加应用菜单项目。它允许开发者向 Gmail 的应用菜单添加自己的项目,这些项目通常用于提供高级可折叠面板、导航或发送用户到已注册的不同路由 diigo-image-…

mysql 查询实战-变量方式-解答

对mysql 查询实战-变量方式-题目,进行一个解答。(先看题,先做,再看解答) 1、查询表中⾄少连续三次的数字 1,处理思路 要计算连续出现的数字,加个前置变量,记录上一个的值&#xff0c…

如何用C++判断一个系统是16位、32位还是64位?

如何用C判断一个系统是16位、32位还是64位&#xff1f; 方法一&#xff1a;使用指针的sizeof()判断 #include <iostream> using namespace std;int main() {int *p nullptr;if(sizeof(p) 8){cout << "64 bits system" << endl;}else if(sizeof(…

AI大模型日报#0413:谷歌引入“无限注意力”、Picsart AI 开源120秒超长AI视频模型

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。 标题: 速递&#xff5c;木头姐 ARK 宣布已投资 OpenAI&#xff01;还将 Anthropic 及 Figure1 等 AI 独角兽一网打尽摘要: ARK已通过其风…

helm upgrade时 报错: another operation (install/upgrade/rollback) is in progress

用helm upgrade的时候&#xff0c;报错Error: UPGRADE FAILED: another operation (install/upgrade/rollback) is in progress 原因可能是之前有一次使用helm upgrade的时候&#xff0c;强制退出了命令(ctrlc) 解决方法: 对于 Helm v3 Helm 3 使用特殊的 Secrets 或 ConfigMap…

MySQL 建表语句详解

目录 基本建表语句 数据类型 列级约束 表级约束 表选项 示例 基本建表语句 CREATE TABLE table_name (column_name1 data_type(size) [column_constraints],column_name2 data_type(size) [column_constraints],...[table_constraints] ) [table_options]; table_name:…

IO流基本流

目录 什么是IO流 IO流的体系 字节流 FileOutputStream FileInputStream 字符集 字符流 FileReader FileWriter 字节流和字符流的使用场景 什么是IO流 内存不能永久化存储,程序停止,数据丢失,所以要添加一个存档功能,存储到硬盘的文件,我们要知道文件在哪里和如何传…

async-validator --- 中文文档

目录 async-validator Install Usage API Validate Rules Type 内置类型 Required Pattern Range Length Enumerable Whitespace Deep Rules 深层规则 defaultField 默认字段 Transform 变换 Messages 提示信息 asyncValidator 异步校验函数 validator 校验函…

【web3技术】什么是 WEB3?

Web3 简介 中心化网络已经帮助数十亿人融入了互联网,并在其上创建了稳定、可靠的基础设施。 与此同时,少数中心化巨头几乎垄断了互联网,甚至可以为所欲为。 Web3 是摆脱这一困境的方案。 不同于科技巨头垄断的传统互联网,Web3 采用去中心化,由所有用户构建、运营和拥有。…

day57 判断子序列 不同的子序列 两个字符串的删除操作 编辑距离

题目1 392 判读子序列 题目链接 392 判断子序列 题意 判断字符串s是否为字符串t的子序列 &#xff08;子序列的相对位置在原字符串中不改变&#xff09; 就是求最长公共子序列的长度与字符串s的长度是否相等 动态规划 1&#xff09;确定dp数组及下标i的含义 dp[i][j]…