利用DBSCAN实现人脸聚类demo(附源码)

这篇博客是对技术研究任务的记录,当时真的是一头雾水,那是刚开始接触机器学习,博客内容是我将研究报告的内容做简单复制粘贴后仍上来的,这个实现是参考一个外国机器学习网站的demo做的功能添加和修改
原始链接在此 https://www.pyimagesearch.com/2018/07/09/face-clustering-with-python/)感谢其提供了实现聚类的方向
你也可以参考此链接 http://www.atyun.com/23521.html)

正文

机器学习处理的问题我们可以概括为分类问题和回归问题,这两个都属于监督学习(在大量的已知实例中得到泛化的能力),人脸聚类属于无监督的学习,也就是我们一开始并不知道我们的人脸集中的任何信息(比如有多少个人的人脸,我需要按照什么标准对这些人脸进行区分等等)。实现人脸聚类的大概思路就是,想方法将人脸图片进行编码,将像素点组成的一张图片转变成一个多维的张量(比如矩阵就是个2D张量,或者叫做二维的张量),由于我们得到的张量是根据人脸图片的像素得来的,所以张量中就隐藏着这张人脸的特征信息,接下来,我们采用某个算法(我们使用DBSCAN算法)去将多维中分布的这些点临近的当做一类,以此得到人脸的聚类。简单概括来说,就是两个过程,编码和分类。
在对人脸进行编码时,我们要考虑到一点——一张图片中人脸只是其中一个部分,照我们的聚类实现方式来看,我们应该更关心一张图片中人脸部分的特征,多余的部分(比如衣服,背景等等)将会影响我们的特征提取,因此,我们应该在对图片编码时先识别人脸在图片中的位置,再进行编码时只对人脸部分进行编码(如下图),这样将提高我们的聚类性能。

实现细节

主要说下两部分,一个是人脸识别,一个是聚类算法,先看人脸识别。在人脸识别这块,采用的是python开源的人脸识别库face_recognition,在这里我将进行说明的是,人脸识别是在整个聚类过程中最耗时的部分,尤其是采用CNN进行人脸识别时。当然我们可以跳过人脸识别,而直接对图片进行编码,但是此时,图片中的无关因素将对结果产生巨大影响。

聚类

采用的是scikit-learn库搭建机器学习应用,在该库中,有三种常用的聚类算法,他们分别是K均值聚类、凝聚聚类、DBSCAN。(更多参见https://scikit-learn.org/stable/modules/clustering.html#clustering)
三者都是无监督的聚类算法,但是K均值聚类、凝聚聚类需要我们提供分类的最终类别个数,DBSCAN则不需要提供,但是可以通过调节参数来大概的控制最终的类别个数

特征数据保存

利用python的pickle库,将得到的序列信息保存到文件,我们将采用字典的形式,将每张人脸图片的特征张量和人脸图片路径对应,同时实现不同特征文件之间的结合,从而避免多次的人脸识别和编码过程

对原始图片的操作

程序运行的大量时间都在进行人脸识别(对于一张1024768的图片,若是彩色,则有1024769*3=2,359,296个数需要处理,同时卷积神经网络同时有多个卷积层池化层等等)。所以适当的降低图片分辨率将可以加快程序执行速度(最好是有GPU加持,速度将大大大提高)。所以我们可以考虑在适当范围内降低图片分辨率,来提高速度(当然代价就是降低人脸识别准确率)

这样的结果是否是你需要的?

在这里插入图片描述
在这里插入图片描述

代码解释
Face-clustering V1.0

目录
1	库介绍	2
1.1	face_recognition	3
1.2	pickle	3
1.3	sklearn	3
1.4	cv2	3
2	项目结构及其功能介绍	3
2.1	dataset/	3
2.2	dataset_face/	3
2.3	encode_file/	3
2.4	add_encode_file.py	3
2.5	check_img_size.py	3
2.6	class_cluster.py	3
2.7	class_encode.py	3
3	详细介绍	3
3.1	class_cluster.py	3
3.1.1	def do_cluster(self,inputfile_path):	3
3.1.2	def do_data_visualization(self,model):	3
3.1.3	def do_data_visualization_3D(self):	3
3.1.4	def do_model_performance(self):	3
3.1.5	def do_show(self):	3
3.2	class_encode.py	3
3.2.1	def do_search_save_face(self,datasetpath,save_face_path,model,save_encode_file_path,num_jitters=1):	4


1	库介绍
1.1	face_recognition
人脸识别库,在项目中用于人脸识别和人脸编码。
1.2	pickle
序列存储库,在项目中用于保存人脸特征文件。
1.3	sklearn
机器学习库,在项目中用于人脸特征聚类
1.4	cv2
opencv的pthon版本,在项目中用于针对图片的操作
2	项目结构及其功能介绍
2.1	dataset/
此处保存着分类的图片原始数据,请将需要分类的图片放在此文件夹下。你也可以自己建立文件夹进行存放。
2.2	dataset_face/
此处保存着在对人脸进行识别后,把原始图片中的人脸部分单独保存下来的图片。你也可以自己建立文件夹进行存放。
2.3	encode_file/
此处保存着对人脸图片进行编码后的特征文件,以.pickle结尾。你也可以自己建立文件夹进行存放。
2.4	add_encode_file.py
这里进行人脸特征文件的合并。
2.5	check_img_size.py
这里进行原始图片的分辨率压缩。
2.6	class_cluster.py
这里对已经保存的人脸特征文件进行聚类。
2.7	class_encode.py
这里执行人脸识别和人脸编码工作。
3	详细介绍
3.1	class_cluster.py
3.1.1	def do_cluster(self,inputfile_path):
inputfile_path:特征文件的路径。
该函数提取特征文件内容,并进行聚类操作。
3.1.2	def do_data_visualization(self,model):
model:使用的人脸识别模型(CNN或HOG),该参数只用于可视化时的模型显示。
该函数做聚类可视化操作,将特征向量降为2D张量
3.1.3	def do_data_visualization_3D(self):
同做聚类可视化,输出3D图像(3D显示没有平面显示明显)。
3.1.4	def do_model_performance(self):
该函数输出聚类的各项指标。
3.1.5	def do_show(self):
该函数将聚类结果和人脸图片结合,显示结果。
3.2	class_encode.py
3.2.1	def do_search_save_face(self,datasetpath,save_face_path,model,save_encode_file_path,num_jitters=1):
datasetpath:原始图像路径。
save_face_path:人脸识别后的人脸部分图片保存路径。
model:使用的人脸识别算法(CNN或HOG)。
save_encode_file_path:特征文件的保存路径。
num_jitters:人脸编码时的采样次数(该值越高,识别越准确,运行越慢,默认为1)。
该函数用来对人脸进行识别和编码,并保存最终的特征文件。

此处下载源码

发布了46 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42718004/article/details/104903573