facenet代码实现之人脸聚类

人脸聚类_facenet代码实现

网上我能查到的大多是实现图片预处理——运行人脸对齐程序align_dataset_mtcnn.py,还有测试模型精度的validate_on_lfw.py,但是这次领导让我和同事玩玩人脸聚类,因为新到了一批人脸数据(就是上个shell脚本每天传回来的),领导当时让我们试试无监督分类。任务要求是首先清洗数据,将识别不到人脸的图片删除(模糊、黑夜、遮挡这类),然后对剩下图片进行无监督分类。不过我这里用的不是公司数据啦。

然后我上周因为一直在测shell脚本,所以数据清洗是由我同事完成的。她写了一个判断图片黑像素占比的脚本,将黑色图片先挑出作为初步数据清洗。这个效果其实还可以,只是会将穿黑色衣服的人也挑出来。然后第二部数据清洗她找到了mtcnn算法,检测人脸区域检测与人脸关键点,检测不到人像的图片删除。

后来我们找聚类算法的时候找到了facenet里面的contributed里的cluster,实现了人脸聚类的功能,并且它第一步也是创立mtcnn网络,检测人脸和关键点,所以我们就把数据清洗只留下了删除黑色图片的预处理,剩下的都是用cluster完成。

代码下载地址:https://github.com/davidsandberg/facenet
当然还需要下载模型,网上其实也有,如果有人需要也可以跟我要,不过也没人看我的文章,算了算了。

这个代码我新建了虚拟环境,安装了tensorflow-gpu=1.7 和python=3.6,我的电脑本身有cuda9.0,所以可以运行gpu版本的tensorflow,如果不是的话,也可以用cpu跑啦,就是慢一点。

我看了网上有很多对facenet源码进行解读的文章,有几篇我觉得很好
https://www.cnblogs.com/zyly/p/9703614.html,这篇对mtcnn和facenet都进行了解读和实现。
https://blog.****.net/hh_2018/article/details/80424304 ,这篇是写了cluster完成聚类后续人脸识别的代码,不过facenet里export_enbeddings也是从图片文件夹中导出embeddings和标签,就类似吧,你们可以看看。我感觉在有数据集情况下,他的第二个代码会很好用。
https://www.jianshu.com/p/9cc8377456de, 这一篇是介绍了facenet里每一个代码都实现了什么功能,
我虽然只用了cluster和export_embeddings,但是我觉得其他功能也会有用的。

下载下来之后首先是在解析命令行参数那边,加上自己的路径(不知道有没有和我一样的小白,一开始我并不知道咋运行,哈哈哈尴尬的笑),就像这样:
facenet代码实现之人脸聚类记得一定要在参数前加–,不然运行不起来哦

然后当然是报错啦

  1. ValueError: Object arrays cannot be loaded when allow_pickle=False

解决:conda install numpy=1.16.2

  1. AttributeError: module ‘scipy.misc’ has no attribute ‘imread’

解决:pip install scipy==1.2.1

然后就可以成功运行啦!!!
我的数据集长这样(有胡歌、迪丽热巴、白敬亭、肖战和唐嫣,毕竟颜控):
facenet代码实现之人脸聚类
然后,我把阈值调成0.8的时候结果是这样:
哦哦哦,是在这里调:
facenet代码实现之人脸聚类
结果:
facenet代码实现之人脸聚类
facenet代码实现之人脸聚类facenet代码实现之人脸聚类facenet代码实现之人脸聚类
把所有男同胞检测呈一个人了…热巴这两张好像确实不太行 换!
facenet代码实现之人脸聚类
然后数据集换成了这样,将阈值调成了0.78
facenet代码实现之人脸聚类
恩?我是不是发现了什么?胡歌和小白…
反正运行出来啦,一共花了50s,因为我显卡不太行…效果其实也还行。我用在了自己的数据集上还蛮好用的,其实也可以调min_cluster_size,可以多玩玩啦。
然后export_embeddings也差不多,添加路径,然后把上面聚类好的作为数据输入,会输出三个.npy格式的文件,可以用于第三个代码进行新数据的人脸识别(就是上面第三篇文章提到的第二个代码)。我和写这个代码的人有共同的问题就是为什么输出特征向量是512维,但是在cluster里面是128维的呢???不懂 茫然
我就不贴代码了,毕竟我就是复现了一下,然后代码来源我也都写上了。
2019-12-27的学习笔记,开心!