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

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.hqwc.cn/news/618364.html

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

相关文章

Niobe开发板OpenHarmony内核编程开发——定时器

本示例将演示如何在Niobe Wifi IoT开发板上使用cmsis 2.0 接口进行定时器开发 Timer API分析 osTimerNew() /// Create and Initialize a timer./// \param[in] func function pointer to callback function./// \param[in] type \ref osTimerOnce …

C++11 设计模式2. 简单工厂模式

简单工厂(Simple Factory)模式 我们从实际例子出发,来看在什么情况下,应用简单工厂模式。 还是以一个游戏举例 //策划:亡灵类怪物,元素类怪物,机械类怪物:都有生命值&#xff0…

自动化测试Junit

1.什么是Junit JUint是Java编程语言的单元测试框架,用于编写和运行可重复的自动化测试。 JUnit 促进了“先测试后编码”TDD的理念,强调建立测试数据的一段代码,可以先测试,然后再应用。这个方法就好比“测试一点,编码一…

MAT工具详解

简介 Java自带的JVisualVm可以用来分析Java堆内存,可以用来排查内存泄漏和内存浪费的问题,但是功能不是特别强大, MAT(Memory Aanlysis Tool)是一款更优的工具。 MAT功能 功能组 全局信息 直方图 按照类的数量倒序…

互联网轻量级框架整合之MyBatis配置详解

MyBatis核心配置文件mybatis-config.xml里有诸多配置项&#xff0c;但常用的就无非就如下这么多 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTDConfig3.0//EN" "https://mybati…

【力扣】125.验证回文串

刷题&#xff0c;过了真的好有成就感&#xff01;&#xff01;&#xff01; 题解&#xff1a; 根据题目要求&#xff0c;我们需要处理一下几个问题&#xff1a; 将大写字母转变成小写对原来的字符串进行处理&#xff0c;只要字母和数字考虑只有一个和字符串为空的情况 1、将…

整数在内存中的存储和内存操作函数

目录 整数在内存中的存储1. 整数在内存中的存储2. 大小端字节序和字节序判断2.1 什么是大小端?2.2 为什么有大小端 3. 练习3.1 请简述大端字节序和小端字节序的概念&#xff0c;设计⼀个小程序来判断当前机器的字节序。&#xff08;10分&#xff09;-百度笔试题3.2 练习23.3 练…

Harbor私有镜像仓库

Docker私有仓库Harbor ​ 前面学习了Docker及Dockerfile构建镜像&#xff0c;那么构建的镜像放在哪里才能被Docker容器快速获取到呢&#xff1f;我们知道&#xff0c;可以把镜像放入Docker Hub镜像仓库&#xff0c;但是Docker Hub是国外网站&#xff0c;一方面镜像放在Docker …

Python 读写T5557低频RFID,将T5557卡制做成ID、HID卡

本示例使用的发卡器&#xff1a; T5557 T5567 T5577低频RFID读写器 EM4100 HID卡复制器 酒店门卡-淘宝网 (taobao.com) from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget,QMessageBox,QCheckBox,QLineEdit from…

【LeetCode】回溯算法类题目详解

所有题目均来自于LeetCode&#xff0c;刷题代码使用的Python3版本 回溯算法 回溯算法是一种搜索的方法&#xff0c;在二叉树总结当中&#xff0c;经常使用到递归去解决相关的问题&#xff0c;在二叉树的所有路径问题中&#xff0c;我们就使用到了回溯算法来找到所有的路径。 …

策略为王股票软件源代码\StkUI\View\BaseView.cpp-------显示股票基本资料的视图-------程序代码都在里面了

CString strHeader info.GetStockCode(); strHeader " "; /修改 strHeader info.GetStockName(); strHeader "\r\n\r\n "; GetEditCtrl().SetWindowText( strHeader ); GetEditCtrl().SetSel…

5.9 mybatis之callSettersOnNulls作用

文章目录 1. 当callSettersOnNullstrue时2. 当callSettersOnNullsfalse时 在mybatis的settings配置参数中有个callSettersOnNulls参数&#xff0c;官方解释为&#xff1a;指定当结果集中值为 null 的时候是否调用映射对象的 setter&#xff08;map 对象时为 put&#xff09;方法…