手把手教你搭建明星脸相似度分析系统
之前和女朋友在微信上玩明星脸小程序,发现大多小程序的分析都不太准,偶尔有几个准的还收费,正好之前学过人脸识别,想着原理应该大同小异,就决定自己搭建一个明星脸程序。
github项目地址:https://github.com/JiageWang/starface
1. 数据收集
要寻找最相似明星脸,首先得有数据,因为现成的数据集大多过时了,缺少很多当红的明星,因此决定自己去网上爬取,找了很多网站最终决定对明星网下手,写了个简单的脚本如下,主要使用的requests
与xpath
技术
import os
import time
import random
import requests
from lxml import etreefirst_num = random.randint(55, 62)
third_num = random.randint(0, 3200)
fourth_num = random.randint(0, 140)os_type = ['(Windows NT 6.1; WOW64)', '(Windows NT 10.0; WOW64)', '(X11; Linux x86_64)','(Macintosh; Intel Mac OS X 10_12_6)'
]chrome_version = 'Chrome/{}.0.{}.{}'.format(first_num, third_num, fourth_num)def get_ua():global os_type, chrome_versionreturn ' '.join(['Mozilla/5.0', random.choice(os_type), 'AppleWebKit/537.36','(KHTML, like Gecko)', chrome_version, 'Safari/537.36'])headers_index = {"Host": "www.mingxing.com",
}
headers_img = {"Referer": "http://www.mingxing.com/ziliao/index.html",
}root = 'starImages'
if not os.path.exists(root):os.makedirs(root)
s = requests.session()
for i in range(1, 194):url = r'http://www.mingxing.com/ziliao/index?&p={}'.format(i)headers_index['User-Agent'] = get_ua()response = s.get(url, headers=headers_index)html = etree.HTML(response.text)lis = html.xpath("//div[@class='page_starlist']//li")time.sleep(1)for li in lis:src = li.xpath(".//img/@src")[0]name = li.xpath(".//a/h3")[0].text.strip()print('Downloading {}'.format(name))headers_img['Referer'] = urlheaders_img['User-Agent'] = get_ua()img = s.get(src, headers=headers_img)folder = os.path.join(root, name)if not os.path.exists(folder):os.mkdir(folder)file = os.path.join(root, name, '{}.jpg'.format(name))with open(file, 'ab') as f:f.write(img.content)# time.sleep(0.2)img.close()
爬取结果,每个明星都建立一个文件夹,每个文件夹里有同名图片文件
2. 建立明星脸数据库
使用mtcnn
与arcface
对每一位明星的脸部进行提取并计算嵌入向量,通过分析向量之间的欧式距离即可判断相似度,主要代码如下,该函数将明星名字与人脸向量保存为本地文件facebank.pkl
方便后续使用,具体涉及很多深度学习代码见原项目。
def get_facebank(path):names = []embeddings = []folders = os.listdir(path)with open("starlist.txt", 'w', encoding='utf-8') as f:for name in tqdm(folders): # 迭代文件夹file = os.path.join(path, name, name + '.jpg') # 获取图片文件名starimg = cv2.imdecode(np.fromfile(file, dtype=np.uint8), cv2.IMREAD_COLOR)if starimg is None: continue_, _, starface, embedding = face_model(starimg) # 获取嵌入向量if len(embedding) != 1: continuef.write(name + '\n')names.append(name)embeddings.append(embedding[0])with open('facebank.pkl', 'wb') as f:pickle.dump((names, embeddings), f) # 保存为本地文件方便使用return names, embeddings
3. 获取人脸对比数据库分析相似度
读取自己的照片,获取人脸与嵌入向量,与数据库的每一条向量进行比较,获取距离最近的向量即为最相似的人脸,获取两张图片的人脸进行对齐并展示。
def compare_embedding(embedding, facebank):"""单个人脸向量与数据库对比"""if len(facebank) == 0:return Noneembedding = np.array(embedding)facebank = np.array(facebank).squeeze(axis=1)diff = embedding - facebankdist = np.sum(np.square(diff), axis=1)min_idx = np.argmin(dist) # 最小欧氏距离return min_idxdef find_similar_star(path, datapath='starImages'):myimg = cv2.imdecode(np.fromfile(path, dtype=np.uint8), cv2.IMREAD_COLOR) # -1表示cv2.IMREAD_UNCHANGED_, _, myface, embedding = face_model(myimg)if len(myface) != 1:return None, None# 寻找最相似明星idx = compare_embedding(embedding[0], face_bank)starnname = names[idx]# 获取明星脸file = datapath + '\{}\{}.jpg'.format(starnname, starnname)starimg = cv2.imdecode(np.fromfile(file, dtype=np.uint8), cv2.IMREAD_COLOR) # -1表示cv2.IMREAD_UNCHANGED_, _, starface, _ = face_model(starimg)# 人脸对比myface = myface[0]starface = starface[0]h, w = starface.shape[:2]myface = cv2.resize(myface, (w, h))# myface = cv2.GaussianBlur(myface, ksize=(15,15), sigmaX=0)result = np.hstack((myface, starface))return starnname, result
用我自己的图片测试结果如下
使用明星本人的图片测试结果如下
总结
可以看到arcface的人脸识别还是挺准的,相比那些小程序效果好的多而且最重要的是免费!!!
参考
mtcnn
insightface
手把手教你搭建明星脸相似度分析系统相关推荐
- 手把手教你搭建视频去重系统
#01 背景 如今,短视频平台对各类搬运视频的检测力度和精确度越来越高了.无论是影视号的剪辑,还是从油管搬运,即使做了各类复杂的视频变换,都很容易被检测出来.作者都会收到提醒,严重的甚至被封号. 乔布 ...
- 手把手教你搭建 ELK 实时日志分析平台
来自:武培轩 本篇文章主要是手把手教你搭建 ELK 实时日志分析平台,那么,ELK 到底是什么呢? ELK 是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch.Logstash ...
- 报名 | NVIDIA线下交流会:手把手教你搭建TensorFlow Caffe深度学习服务器
7月21日(周六)下午14:30,量子位与NVIDIA英伟达开发者社区联合举办线下交流会,拥有丰富一线开发经验的NVIDIA开发者社区经理Ken He,将手把手教你搭建TensorFlow & ...
- 手把手教你搭建入门级免费私有云盘NAS——基于syncthing——基础篇(树莓派、PC机)
目录 一.电脑端的 NAS 部署与测试(syncthing) 二.树莓派部署 24H 不间断运行 NAS--作为主同步服务端器(syncthing) 三.扩展的同步拓扑 四.代码同步的选择(GIT/S ...
- OceanBase技术直播间开播啦!蚂蚁金服技术专家手把手教你搭建OB数据库~
OceanBase技术直播间是OceanBase为用户和技术爱好者带来的系列技术直播课程,由蚂蚁金服一线技术专家分享最全面的理论知识和最实用的技术实践,内容包含数据库内核系列.手把手实操系列和最佳实践 ...
- 手把手教你搭建Linux开发环境(VMware+Ubuntu)(二)——安装VMwareTools并设置共享文件夹
刚刚装好了Ubuntu,安装VMware Tools会让我们有更好的体验,那么为什么要安装VMware Tools?该如何安装呢?本篇博客将手把手教你安装VMware Tools,并设置共享文件夹. ...
- 手把手教你搭建Hadoop生态系统伪分布式集群
Hello,我是 Alex 007,一个热爱计算机编程和硬件设计的小白,为啥是007呢?因为叫 Alex 的人太多了,再加上每天007的生活,Alex 007就诞生了. 手把手教你搭建Hadoop生态 ...
- python numpy安装教程_手把手教你搭建机器学习开发环境—Python与NumPy的超简安装教程...
手把手教你搭建机器学习开发环境Python语言是机器学习的基础,所以,想要入门机器学习,配置好Python的开发环境是第一步.本文就手把手的教你配置好基于Python的机器学习开发环境.超简单!第一步 ...
- 手把手教你搭建Nginx-rtmp流媒体服务器+使用ffmpeg推流
手把手教你搭建Nginx-rtmp流媒体服务器+使用ffmpeg推流 转载自:https://www.jianshu.com/p/06c2025edcd3 by – paperfish 最近尝试着搭建 ...
最新文章
- TabLayout的指示器长度 的问题
- 使用Yum历史查找已安装或已删除的软件包信息
- webpack相关配置
- April Fools Contest 2017 题解源码(A,数学 B,数学 C,数学 D,字符串 E,数字逻辑 F,排序,卡时间,G,数学)...
- OpenExpressApp对建模支持的初步计划
- 实现对gridview删除行时弹出确认对话框的四种方法
- NetworkManager
- jquery 序列化表格内容为字符串(serialize)
- golang中container/list包中的坑
- 你真的会使用Eclipse的debug吗?
- 手把手教你玩转网络编程模型之完成例程(Completion Routine)篇(下)-转
- oracle找不到表分区,ORACLE分区表检索不到数据
- Quartus II使用Testbench
- 墨刀安装以及基础使用教程
- Sqlmap中代理及其他常用参数
- Feasibility of Learning
- 哪个骨传导蓝牙耳机的好,推荐几款口碑高的骨传导耳机
- 爪哇国新游记之十三----XML文件读写
- 互联网产业中“外行领到内行”和软件工程
- 毕业设计选题推荐 - python毕设选题推荐 - 2023最新毕设选题 - 如何选题 避免被坑