人工智能开发实战照片智能搜索功能实现

news2024/9/29 1:58:34

内容提要

  1. 项目分析
  2. 预备知识
  3. 项目实战

一、项目分析

1、提出问题

随着人民生活水平的提高和手机照相功能的日趋完美,我们不经意中拍摄了很多值得回忆的时刻,一场说走就走的旅行途中也记录下许多令人心动的瞬间,不知不觉之中,我们身边保存了大量的生活相片。

然而,每当你想重温你或者他的系列照片时,或者想分享一张你特别满意的靓照,从众多的照片中一遍遍翻找这些照片的确是一件费时费力的事情。

既然AI无时不在我们身边,能否借助AI的人脸识别技术来帮助我自动整理出我想要的照片,实现照片的智能搜索呢?答案无疑是肯定的。

下面,我们就利用人脸识别技术和OpenCV工具,对相册中的照片进行自动挑选以解决上述问题。

2、解决方法

帮助人们从相册中找出指定人物的系列照片,对于人工操作而言,并不是一件困难的事情,但整理的效率可能不尽人意,毕竟手动翻阅每张照片是个耗时费力的事。

让计算机替代人来完成这个事,难点在于如何从被检照片中识别与目标人脸高度相似的人脸,如果被检照片中有此人,说明该照片就是你想要的那一张,否则,该照片被忽视。

因此,一种可行的方案是:首先训练计算机认识不同式样的同一系列人脸,让它知道其实这些照片上的人物是同为一个人,从而得到目标人脸训练模型。

其次,遍历相册中的每张照片,检测出该照片上所有的人脸,提取人脸特征值,然后用目标人脸训练模型依次对人脸特征值进行预测比对,如果两者之间只要有一次高度匹配,就保留该照片,立即进入下一张照片的搜索,如果均不匹配,则忽视该照片,进行下一张搜索,直至搜索完所有的照片。

最后,得到的所有保留照片就是智能搜索的结果,至此,整个智能搜索照片过程结束。

问题的解决方案如下图所示。

二、预备知识

利用OpenCV来智能搜索相片,有两个重要的环节:

一是人脸区域的检测,这要用到前面提到的人脸检测器;

二是基于人脸区域数据的人脸识别,这要用到人脸识别模型。

下面分别来了解OpenCV中人类检测器和人脸识别模型的使用。

1、人脸检测器

我们可以从网络资源上下载别人训练好的人脸分类器,也可以自己训练。在此我们使用表中默认的级联分类器来检测照片中的人脸。

案例1:检测照片中的所有人脸,并用矩形框出人脸区域。

文件case1.ipynb代码如下:

1	import cv2
2	import numpy as np
3	faceCascade=cv2.CascadeClassifier('data/haarcascade_frontalface_default.xml')
4	img=cv2.imread('data/pic1.JPG')
5	gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
6	faces=faceCascade.detectMultiScale(gray,1.3,5)
7	for (x,y,w,h)in faces:
8	    cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,0),1)
9	cv2.imshow('pic',img)
10	cv2.waitKey(0)
11	cv2.destroyAllWindows()

为方便调用默认的级联人脸分类模型,将文件haarcascade_frontalface_default.xml拷贝到源程序所在位置的data文件夹下,通过代码行3来构建人脸分类器faceCascade。

代码行4读取照片文件pic1.jpg,在代码行5将其转换成灰度图像。

代码行6对灰度图像gray按搜索窗口比例系数为1.3、相邻矩形最小个数为5的扫描方式检测人脸,并返回检测到的人脸矩形框向量数组。

代码行7-8遍历该向量数组,在图像img中人脸的相应位置绘制出一个个的矩形框。

代码行9显示绘制有人脸矩形框的照片。

代码行10一直等待用户的按键响应,按任意键继续,并通过代码行11关闭所有的窗口。

程序的运行效果如下:

由上可以看出,照片中的两个人脸被成功检测出来,人脸的位置及大小数据如下所示:

2、人脸识别算法

目前OpenCV支持:特征脸EigenFace、线性判别分析脸FisherFace与直方图脸LBPHFace三种人脸识别方法。

OpenCV的扩展包opencv-contrib-python提供了相应的函数以方便构建上述三种人脸识别方法的模型,因此在使用人脸识别模型前,要执行以下命令安装OpenCV扩展包。

pip3 install opencv-contrib-python

扩展包提供的模型函数如下表所示:

由于LBPHFace算法不会受到光照、缩放、旋转和平移的影响,且执行性能高,通用性较好,是OpenCV中首选的人脸识别方案。

案例2:识别指定照片中的人是谁。

编写如下代码(case2.ipynb),以识别上图中的照片who.jpg人物是huangshuai还是limu

1	import cv2
2	import os
3	import numpy as np
4	images=[]
5	labels=[]
6	whoPath=''
7	name2num={'huangshuai':1,'limu':2}
8	num2name={1:'huangshuai',2:'limu'}
9	faceCascade=cv2.CascadeClassifier('data/haarcascade_frontalface_default.xml')
10	for root,dirs,filenames in os.walk('data\\case8-2\\'):
11	    for filename in filenames:
12	        if filename!='who.jpg':
13	            filePath=os.path.join(root,filename)
14	            img=cv2.imread(filePath,0)
15	            faces=faceCascade.detectMultiScale(img,1.3,3)
16	            name=filePath.split('\\')[-2]
17	            for (x,y,w,h) in faces:
18	                images.append(img[y:y+h,x:x+w])
19	                labels.append(name2num[name])
20	        else:
21	            whoPath=os.path.join(root,filename)
22	faceRecognizer=cv2.face.LBPHFaceRecognizer_create()
23	faceRecognizer.train(images,np.array(labels))
24	whoimg=cv2.imread(whoPath,0)
25	whoFace=faceCascade.detectMultiScale(whoimg,1.3,3)
26	for(x,y,w,h) in whoFace:
27	    pred_index,conf_score=faceRecognizer.predict(whoimg[y:y+h,x:x+w])
28	    print('待识别照片中的人是:',num2name[pred_index])
29	    print('置信度评分=',conf_score)

代码行4-5分别用列表images、labels保存用于训练人脸识别模型的人脸数据和标签数据。

在代码行7-8定义人物“huangshuai、limu”对应的标签号为“1、2”。

代码行9构建一个人脸分类器faceCascade。

代码行10-21对指定目录data\case8-2\下的文件夹及文件进行遍历,如果文件不是待识别照片who.jpg,则将它们作为训练集。

在代码行15检测出人脸,并在代码行18-19将人脸数据和标签值分别保存到列表images和labels中;若是待识别照片,则在代码行21保存其路径。

代码行22构建一个LBPHFace类型的人脸识别模型,并在代码行23利用人脸数据集images和标签集labels对该模型进行训练。

代码行26-29对照片who.jpg中的人脸进行识别。

在代码行27用训练好的模型对该照片的面部进行预测,返回人物标签值pred_index和置信度评分conf_score,并在代码行28-29分别打印出识别的人物姓名和置信度评分。

程序的运行效果如下所示:

需要指出的是,对人脸识别模型的训练,训练集越多,预测效果越好。

模型一旦训练好后,可以以XML文件的形式将其保存起来,以便下次直接读取调用,以避免每次预测前都要训练一次的麻烦。

三、项目实战

3.1 训练目标人脸识别模型

文件夹persons中有目标人物的几张照片,用照片中的人脸集去训练人脸识别模型,让模型“认识”该人脸,并保存该模型,以便后续利用该模型去“辨认”照片集中的面相。

新建文件task1.ipynb,根据任务目标,按照以下步骤和操作,完成任务一。

任务目标:

提取照片中的人脸数据构成训练集,使用训练集对LBPHFace人脸模型进行训练,将训练好的模型保存起来。

完成步骤:

(1)构建一个人脸检测器

(2)生成目标人脸数据的训练集

(3)训练人脸识别模型

1、构建一个人脸检测器

为方便代码重用,在文件task1.ipynb中定义函数get_face_cascade,以构建一个人脸检测器,代码如下。

1	import cv2
2	import os
3	import numpy as np
4	def get_face_cascade(model_file):
5	    faceCascade=cv2.CascadeClassifier(model_file)
	#利用cv2中已训练好的人脸检测文件model_file来构建一个人脸检测器faceCascade。
6		return faceCascade

2、生成目标人脸数据训练集

根据前面的解决方案,需要获取目标对象的人脸数据和标签值,作为人脸识别模型的训练集。

编写代码如下,得到训练集。

1	def get_faces_trains(file_path,model_file):
2	    images=[]
3	    labels=[]
4	    faceCascade=get_face_cascade(model_file)
5	    for file in os.listdir(file_path):
6	        filePath=os.path.join(file_path,file)
7	        img=cv2.imread(filePath,0)
8	        faces=faceCascade.detectMultiScale(img,1.3,3)
9	        x,y,w,h=faces[0]
10	        images.append(img[y:y+h,x:x+w])
11	        labels.append(1)
12		return images,labels
13	images,labels=get_faces_trains('data/persons/','data/haarcascade_frontalface_default.xml')

代码行2-3定义的变量分别保存人脸数据和人脸标签。

代码行5-11遍历文件目录file_path下所有的目标人物照片文件,在代码行7读入灰度图。

在代码行8利用人脸分类器对灰度图检测人脸,然后在代码行10-11分别保存人脸数据和标签值,因为已知训练照片属于同一个人,所以标签值相同。

代码行13利用定义好的函数get_faces_trains来获取data/persons目录下目标人脸的训练数据。

3、训练人脸识别模型

有了步骤2的训练数据,就可以对LBPHFace模型进行训练,代码如下:

1	faceRecognizer=cv2.face.LBPHFaceRecognizer_create()
2	faceRecognizer.train(images,np.array(labels))
3	faceRecognizer.save('data/models/my_LBPHfaceRec.xml')

因为标签集labels是列表类型,需要转换成向量类型,然后在代码行2对人脸识别模型进行训练,并在代码行3将训练好的模型保存起来,以备后续随时调用。

至此,我们就得到了一个可用于搜索照片的人脸识别模型。

3.2 找到与某个用户最相似的n个用户

任务一已经按照指定的人物照片训练好了人脸识别模型,那么下一步我们就可以利用该模型,去照片集中帮我们找到想要的照片。

根据任务目标,按照以下步骤和操作,完成任务二。

任务目标:

搜索照片集中与目标人脸高度相似的照片,并显示搜索结果。

完成步骤:

(1)加载训练好的模型

(2)搜索照片集中要找的照片

1、加载训练好的模型

初始化人脸识别方法,读取训练好的模型文件,将其作为预测照片的人脸识别器。代码如下:

1	faceRecognizer1=cv2.face.LBPHFaceRecognizer_create()
2	faceRecognizer1.read('data/models/my_LBPHfaceRec.xml')

2、搜索照片集中要找的照片

有了人脸识别器faceRecognizer1,就定义如下方法search_photos,用它去寻找与目标人脸相似的照片,代码如下:

1	def search_photos(file_path,model_file):
2	    faceCascade=get_face_cascade(model_file)
3	    i=0
4	    for file in os.listdir(file_path):
5	        filePath=os.path.join(file_path,file)
6	        pred_img=cv2.imread(filePath)
7	        gray=cv2.cvtColor(pred_img,cv2.COLOR_BGR2GRAY)
8	        faces=faceCascade.detectMultiScale(gray,1.3,3)
9	        x,y,w,h=faces[0]
10	        pred_index,conf_score=faceRecognizer1.predict(gray[y:y+h,x:x+w])
11	        if conf_score<50:
12	            i+=1
13	            cv2.putText(pred_img,str(i),(x+int(w/2),y+int(h/2)),
		    cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),3) 
14	            cv2.imshow('foundImage',pred_img)
15	            cv2.waitKey(0)
16	        	cv2.destroyAllWindows()
17	search_photos('data/photos/','data/haarcascade_frontalface_default.xml')

代码行4-16是遍历目录file_path下的照片集,代码行7将读取的彩色图转换成灰度图。

代码行10用人脸识别器faceRecognizer1去预测当前人脸数据应归属于那一类、置信度如何。

其中代码行11-16是判断如果置信度分数<50,则说明当前照片与目标人脸高度相似,通过代码行13在人脸中间部位写上序号i,然后通过代码行14显示该图像。

代码行17是调用定义的函数search_photos,完成照片的搜索任务。

上述代码的运行效果如下图所示:

可以看出,找出的6张照片上的人物与原目标人脸是一个人,说明本次智能搜索是有效的。

当然,在实际应用过程中,不排除漏搜和多搜的情况,这时候就要考虑通过调参、甚至更改人脸检测器和识别模型来改善搜索效果。

更多精彩内容请持续关注本站!

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

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

相关文章

Time-MoE : 时间序列领域的亿级规模混合专家基础模型

Time-MoE : 时间序列领域的亿级规模混合专家基础模型 时间序列预测一直是量化研究和工业应用中的重要课题。随着深度学习技术的发展&#xff0c;大规模预训练模型在自然语言处理和计算机视觉领域取得了显著进展&#xff0c;但在时间序列预测领域&#xff0c;这些模型的规模和运…

【归回预测】归回预测│PSO-ELM与标准ELM多输入预测对比源代码

摘要 本文比较了基于粒子群优化&#xff08;PSO&#xff09;和标准极限学习机&#xff08;ELM&#xff09;算法的电力负荷多输入预测模型。利用真实电力负荷数据集&#xff0c;对两种方法的预测性能进行了全面的评估&#xff0c;使用了均方误差&#xff08;MSE&#xff09;、平…

【文心智能体 | AI大师工坊】如何使用智能体插件,完成一款旅游类智能体的开发,来体验一下我的智能体『​​​​​​​厦门CityWalk』

目录 1.1、智能体运行效果 1.2、创作灵感来源 1.3、如何制作智能体 1.4、可能会遇到的几个问题 1.5、快速调优指南 『厦门CityWalk&#x1f680;』我的优质智能体&#xff1a;https://0nxj3k.smartapps.baidu.com/?_swebfr1&_swebScene3621000000000000 在当今这个全…

青动CRM V3.2.1

全面解决企业销售团队的全流程客户服务难题旨在助力企业销售全流程精细化、数字化管理&#xff0c;全面解决企业销售团队的全流程客户服务难题&#xff0c;帮助企业有效盘活客户资源、量化销售行为&#xff0c;合理配置资源、建立科学销售体系&#xff0c;提升销售业绩。标准授…

【宝藏妙招,轻松拿捏!】如何防止U盘资料被复制?U盘文件防拷贝的五种措施!

小李&#xff1a;“小张&#xff0c;你上次借我的U盘还回来的时候&#xff0c;我总觉得里面的资料好像被人动过了&#xff0c;有没有什么办法可以防止U盘里的资料被复制啊&#xff1f;” 小张&#xff1a;“当然有啦&#xff01;现在数据安全这么重要&#xff0c;防止U盘资料被…

贪心的思想

803.区间合并 给定 n 个区间 [li,ri]&#xff0c;要求合并所有有交集的区间。 注意如果在端点处相交&#xff0c;也算有交集。 输出合并完成后的区间个数。 例如&#xff1a;[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。 输入格式 第一行包含整数 n。 接下来 n 行&#x…

如何通过GSR排名系统迅速提升谷歌排名?

如果你希望在谷歌上迅速提升某个关键词排名&#xff0c;或者某个关键词无论怎么优化都无法上首页&#xff0c;那么GSR关键词排名系统你就可以关注一下&#xff0c;GSR系统可以在短时间内帮助你进一步提升至首页。与传统的SEO方法不同&#xff0c;GSR侧重于外部优化&#xff0c;…

C语言进阶版第13课—字符函数和字符串函数2

文章目录 1. strstr函数的使用和模拟实现1.1 strstr函数的使用1.2 模拟实现strstr函数1.3 strstr函数和strncpy函数、puts函数的混合使用 2. strtok函数的使用**3. strerror函数的使用** 1. strstr函数的使用和模拟实现 1.1 strstr函数的使用 strstr函数是用来通过一个字符串来…

《迁移学习》—— 将 ResNet18 模型迁移到食物分类项目中

文章目录 一、迁移学习的简单介绍1.迁移学习是什么&#xff1f;2.迁移学习的步骤 二、数据集介绍三、代码实现1. 步骤2.所用到方法介绍的文章链接3. 完整代码 一、迁移学习的简单介绍 1.迁移学习是什么&#xff1f; 迁移学习是指利用已经训练好的模型&#xff0c;在新的任务上…

牛顿迭代法求解x 的平方根

牛顿迭代法是一种可以用来快速求解函数零点的方法。 为了叙述方便&#xff0c;我们用 C C C表示待求出平方根的那个整数。显然&#xff0c; C C C的平方根就是函数 f ( x ) x c − C f(x)x^c-C f(x)xc−C 的零点。 牛顿迭代法的本质是借助泰勒级数&#xff0c;从初始值开始快…

【软件测试】最新Linux大全(超详细!超级全!)

目录 前言1. 操作系统是干什么的2. Linux 是什么3. 为什么要学习 Linux4. Linux 发行版本5. Linux 系统特点6. Linux 安装7. Linux 系统启动8. Linux 操作方式9. Shell 与命令10. 命令格式 一、 Linux终端命令格式1. 终端命令格式2. 查阅命令帮助信息 二、 常用Linux命令的基本…

项目计划软件如何助力企业策略规划和执行监控

项目管理软件助力任务、时间和协作管理&#xff0c;如ZohoProjects集成了任务管理、时间跟踪、协作工具等功能&#xff0c;提高性价比&#xff0c;适合不同规模团队。其简化流程、专业度高&#xff0c;成为企业提升效率的重要工具。 一、项目计划软件的由来 项目计划软件的历史…

暴雨受邀出席2024 AI大模型生态算力峰会

9月25日&#xff0c;2024 AI大模型生态暨算力峰会在北京国家会议中心正式开幕&#xff0c;AI行业头部厂家、业界专家及人工智能行业精英齐聚一堂&#xff0c;暴雨华北大区产品总监丁海受邀出席并发表演《用AI奔赴新质生产力》的主题演讲&#xff0c;深度诠释了人工智能如何驱动…

解开BL锁之后如何安装模块及安装注意事项

本文是在解开BL锁的前提下进行的。 解开BL锁请参考:出厂非澎湃OS手机解BL锁 本文 参考&#xff1a; Magisk中文网 Magisk资源分享 ROM基地 我安装了这几个模块&#xff0c;切记先按照救砖模块。 解开BL锁之后&#xff0c;需要将下载系统ROM包提取boot.img。 目前我知道的又…

基于云开发进行快速搭建企业智能名片小程序

如何基于云开发进行快速搭建企业智能名片小程序&#xff1f; 首先&#xff0c;需要注册一个小程序账号&#xff0c;获取AppID。如果还不知道怎么注册的朋友&#xff0c;可以去看我前面写的那篇教程&#xff0c;有比较详细的注册步骤图文教程。 复制AppID&#xff0c;打开开发者…

基于SpringBoot+Vue+MySQL的旅游管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着旅游业的蓬勃发展&#xff0c;传统的旅游信息查询与订票方式已难以满足现代游客的多元化需求。为了提升用户体验&#xff0c;提高旅游管理的效率&#xff0c;我们开发了基于SpringBootVueMySQL的旅游管理系统。该系统旨在通…

大模型微调4:Alpaca模型微调、Adalora、Qlora

Alpaca模型微调&#xff1a; 整个pipeline 1. 主流底座&#xff1a;Candidate 中文&#xff1a;YI-34B 英文&#xff1a;LLama&#xff0c;mistral 2. 验证&#xff1a; 我们自己的Instructoin data 通用的Instruction data&#xff08;适合我们场景的&#xff09; 3. 收集…

kubernetes存储入门(kubernetes)

实验环境依旧是三个节点拉取镜像&#xff0c;然后在master节点拉取资源清单&#xff1a; 然后同步会话&#xff0c;导入镜像&#xff1b; 存储入门 ConfigMap volume卷--》volumemount&#xff08;挂载卷&#xff09; Glusterfs NFS ISCSI HostPath ConfigMap Secret E…

acw(树的重心)

给定一颗树&#xff0c;树中包含 n&#x1d45b; 个结点&#xff08;编号 1∼n1∼&#x1d45b;&#xff09;和 n−1&#x1d45b;−1 条无向边。 请你找到树的重心&#xff0c;并输出将重心删除后&#xff0c;剩余各个连通块中点数的最大值。 重心定义&#xff1a;重心是指树…

基于SSM的“在线汽车交易系统”的设计与实现(源码+数据库+文档+开题报告)

基于SSM的“在线汽车交易系统”的设计与实现&#xff08;源码数据库文档开题报告) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体设计图 首页 新闻信息 用户注册 后台登录界面…