之前和女朋友在微信上玩明星脸小程序,发现大多小程序的分析都不太准,偶尔有几个准的还收费,正好之前学过人脸识别,想着原理应该大同小异,就决定自己搭建一个明星脸程序。
github项目地址:https://github.com/JiageWang/starface

1. 数据收集

要寻找最相似明星脸,首先得有数据,因为现成的数据集大多过时了,缺少很多当红的明星,因此决定自己去网上爬取,找了很多网站最终决定对明星网下手,写了个简单的脚本如下,主要使用的requestsxpath技术

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. 建立明星脸数据库

使用mtcnnarcface对每一位明星的脸部进行提取并计算嵌入向量,通过分析向量之间的欧式距离即可判断相似度,主要代码如下,该函数将明星名字与人脸向量保存为本地文件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

手把手教你搭建明星脸相似度分析系统相关推荐

  1. 手把手教你搭建视频去重系统

    #01 背景 如今,短视频平台对各类搬运视频的检测力度和精确度越来越高了.无论是影视号的剪辑,还是从油管搬运,即使做了各类复杂的视频变换,都很容易被检测出来.作者都会收到提醒,严重的甚至被封号. 乔布 ...

  2. 手把手教你搭建 ELK 实时日志分析平台

    来自:武培轩 本篇文章主要是手把手教你搭建 ELK 实时日志分析平台,那么,ELK 到底是什么呢? ELK 是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch.Logstash ...

  3. 报名 | NVIDIA线下交流会:手把手教你搭建TensorFlow Caffe深度学习服务器

    7月21日(周六)下午14:30,量子位与NVIDIA英伟达开发者社区联合举办线下交流会,拥有丰富一线开发经验的NVIDIA开发者社区经理Ken He,将手把手教你搭建TensorFlow & ...

  4. 手把手教你搭建入门级免费私有云盘NAS——基于syncthing——基础篇(树莓派、PC机)

    目录 一.电脑端的 NAS 部署与测试(syncthing) 二.树莓派部署 24H 不间断运行 NAS--作为主同步服务端器(syncthing) 三.扩展的同步拓扑 四.代码同步的选择(GIT/S ...

  5. OceanBase技术直播间开播啦!蚂蚁金服技术专家手把手教你搭建OB数据库~

    OceanBase技术直播间是OceanBase为用户和技术爱好者带来的系列技术直播课程,由蚂蚁金服一线技术专家分享最全面的理论知识和最实用的技术实践,内容包含数据库内核系列.手把手实操系列和最佳实践 ...

  6. 手把手教你搭建Linux开发环境(VMware+Ubuntu)(二)——安装VMwareTools并设置共享文件夹

    刚刚装好了Ubuntu,安装VMware Tools会让我们有更好的体验,那么为什么要安装VMware Tools?该如何安装呢?本篇博客将手把手教你安装VMware Tools,并设置共享文件夹. ...

  7. 手把手教你搭建Hadoop生态系统伪分布式集群

    Hello,我是 Alex 007,一个热爱计算机编程和硬件设计的小白,为啥是007呢?因为叫 Alex 的人太多了,再加上每天007的生活,Alex 007就诞生了. 手把手教你搭建Hadoop生态 ...

  8. python numpy安装教程_手把手教你搭建机器学习开发环境—Python与NumPy的超简安装教程...

    手把手教你搭建机器学习开发环境Python语言是机器学习的基础,所以,想要入门机器学习,配置好Python的开发环境是第一步.本文就手把手的教你配置好基于Python的机器学习开发环境.超简单!第一步 ...

  9. 手把手教你搭建Nginx-rtmp流媒体服务器+使用ffmpeg推流

    手把手教你搭建Nginx-rtmp流媒体服务器+使用ffmpeg推流 转载自:https://www.jianshu.com/p/06c2025edcd3 by – paperfish 最近尝试着搭建 ...

最新文章

  1. TabLayout的指示器长度 的问题
  2. 使用Yum历史查找已安装或已删除的软件包信息
  3. webpack相关配置
  4. April Fools Contest 2017 题解源码(A,数学 B,数学 C,数学 D,字符串 E,数字逻辑 F,排序,卡时间,G,数学)...
  5. OpenExpressApp对建模支持的初步计划
  6. 实现对gridview删除行时弹出确认对话框的四种方法
  7. NetworkManager
  8. jquery 序列化表格内容为字符串(serialize)
  9. golang中container/list包中的坑
  10. 你真的会使用Eclipse的debug吗?
  11. 手把手教你玩转网络编程模型之完成例程(Completion Routine)篇(下)-转
  12. oracle找不到表分区,ORACLE分区表检索不到数据
  13. Quartus II使用Testbench
  14. 墨刀安装以及基础使用教程
  15. Sqlmap中代理及其他常用参数
  16. Feasibility of Learning
  17. 哪个骨传导蓝牙耳机的好,推荐几款口碑高的骨传导耳机
  18. 爪哇国新游记之十三----XML文件读写
  19. 互联网产业中“外行领到内行”和软件工程
  20. 毕业设计选题推荐 - python毕设选题推荐 - 2023最新毕设选题 - 如何选题 避免被坑

热门文章

  1. 为什么dao层和service层要用接口?
  2. 三网合一我们该做些什么?
  3. arcgis使用arcpy计算土地利用LUCC变化转移矩阵、马尔科夫模型变化表,最好用的方法TabulateArea实现两期数据变化统计
  4. Leetcode 1229. 安排会议日程
  5. 小技能:监控器查看视频录像回放
  6. Web开发中的常见应用
  7. 使用宝塔面板快速搭建谷歌出品图片在线压缩工具 - Squoosh
  8. tomcat 启动有报错,但是很快就自动关闭了,太快了看不到信息,解决方法
  9. JAVA实现车牌随机产生器
  10. 2023美赛数学建模竞赛 C题思路分析