其实一直对电影里面的对×××进行人脸匹配然后,刷出来×××信息很感兴趣,今天一时兴起,就搞了一把小的。
理论上:你可以建立一个你感兴趣的百万级的数据库,给你个照片 ,你就可以得到她是谁,哪里的,信息都可以知道,而且因为人与人之间的网状的关联,你甚至可以知道她喜欢的人是谁,男朋友长啥样子。
想信我:一切都不是虚构的,你能做的更多!
思路:
一、数据收集,可以采用爬虫对网上海里的明星信息进行有针对的爬取
二、格式化数据,存入mysq,把明星的自拍照的文件名存入数据库中
三、使用百度的api对程序进行编写,说实话,百度人脸识别做的很棒了,精确度很高
四、你上传一张图片(或者你能想象到的方式),后面的程序会对你海量的数据库中人的信息进行比对
五、输出匹配到的人的信息,和相似度的数值。
直接上代码:
# encoding:utf-8`
import base64
import urllib
import urllib2
import simplejson as json
from os import listdir
import MySQLdb
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def conmysql():
conn= MySQLdb.connect(
host='localhost',
port = 3306,
user='root',
passwd='123456',
db ='xxnlove',
charset='utf8'
)
#cur = conn.cursor()
return conn
'''
人脸比对接口
'''
def facecompar(image01,image02):
matchUrl = "https://aip.baidubce.com/rest/2.0/face/v2/match"
# 二进制方式打开图文件
f = open(image01, 'rb')
# 参数images:图像base64编码
img1 = base64.b64encode(f.read())
# 二进制方式打开图文件
f = open(image02, 'rb')
# 参数images:图像base64编码
img2 = base64.b64encode(f.read())
# 参数images:图像base64编码,多张图片半角逗号分隔
params = {
"images": img1 + ',' + img2}
params = urllib.urlencode(params)
access_token = '24.1a060b87a0dfcab77317999d.25922220.1505832798.282335-10029360'
matchUrl = matchUrl + "?access_token=" + access_token
request = urllib2.Request(url=matchUrl, data=params)
request.add_header('Content-Type', 'application/x-www-form-urlencoded')
response = urllib2.urlopen(request)
content = response.read()
if content:
content = json.loads(content)
similar=content['result'][0]['score']
return similar
#if similar >80:
#print "两张图片的相似度为"+str(similar)+" 很有可以能是同一个人"
# return similar
#else:
# #print "两张图片的相似度为:"+str(content['result'][0]['score'])
# return similar
def compare():
similarlist=[]
similardict={}
for img in listdir('./star/'):
similarvalue=facecompar('compar.jpg','./star/'+img)
similarlist.append(similarvalue)
similardict[similarvalue]=img
return similarlist,similardict
if __name__=="__main__":
similarlist,similardict=compare()
similarkey=sorted(similarlist)[-1]
starname=similardict[similarkey]
conn = conmysql()
cur = conn.cursor()
sql="select * from face where iamge='%s'" % starname
cur.execute(sql)
results = cur.fetchall()
print "一共对数据库进行比对了"+str(len(similarlist))+"条信息"
for info in results:
print "匹配到明星的信息:"+ info[0],info[1],info[2],"相似度:"+str(similarkey)
conn.close()
测试图片:
[图片上传失败...(image-8f3d1d-1612410067334)]
因为她是我高中的时候喜欢过的明星,所以~~~~
明星数据库:
[图片上传失败...(image-30ff85-1612410067334)]
因为只是先把路走通,所以数据很少。
明星的照片所在目录:
[图片上传失败...(image-4007f8-1612410067334)]
明星照片:
[图片上传失败...(image-786aab-1612410067334)]
[图片上传失败...(image-3ca938-1612410067334)]
[图片上传失败...(image-44a178-1612410067334)]
[图片上传失败...(image-7245dd-1612410067334)]
[图片上传失败...(image-dc26c0-1612410067334)]
程序运行效果:
[图片上传失败...(image-b0dd01-1612410067334)]
一共对数据库进行比对了5条信息
匹配到明星的信息:曾轶可 27 1990年1月3日出生于湖南省常德市汉寿县,创作型女歌手,演员。 相似度:63.689125061
优化后的:
# encoding:utf-8`
import base64
import urllib
import urllib2
import simplejson as json
from os import listdir
import MySQLdb
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import requests
from bs4 import BeautifulSoup
import re
def conmysql():
conn= MySQLdb.connect(
host='localhost',
port = 3306,
user='root',
passwd='123456',
db ='xxnlove',
charset='utf8'
)
#cur = conn.cursor()
return conn
def crawling(name):
url="http://baike.baidu.com/search/word?word='%s'" % name
response = requests.get(url)
response.encoding = 'utf-8'
text = response.text
soup = BeautifulSoup(text, 'lxml')
for infor in soup.find_all('meta')[3:4]:
global information
information=(infor.get('content'))
return information
def facecrawling(name):
url="http://baike.baidu.com/search/word?word='%s'" % name
response = requests.get(url)
response.encoding = 'utf-8'
text = response.text
soup = BeautifulSoup(text, 'lxml')
imgurl = soup.img.get('src')
try:
response = requests.get('%s' % imgurl)
open('./star/'+name+'.jpg', 'wb').write(response.content)
except:
print "继续"
'''
人脸比对接口
'''
def facecompar(image01,image02):
matchUrl = "https://aip.baidubce.com/rest/2.0/face/v2/match"
# 二进制方式打开图文件
f = open(image01, 'rb')
# 参数images:图像base64编码
img1 = base64.b64encode(f.read())
# 二进制方式打开图文件
f = open(image02, 'rb')
# 参数images:图像base64编码
img2 = base64.b64encode(f.read())
# 参数images:图像base64编码,多张图片半角逗号分隔
params = {
"images": img1 + ',' + img2}
params = urllib.urlencode(params)
access_token = '24.1fba688d5a060b87a0dfcab7731.2592000.1505832798.282335-100360'
matchUrl = matchUrl + "?access_token=" + access_token
request = urllib2.Request(url=matchUrl, data=params)
request.add_header('Content-Type', 'application/x-www-form-urlencoded')
response = urllib2.urlopen(request)
content = response.read()
if content:
content = json.loads(content)
try:
similar=content['result'][0]['score']
return similar
except:
print image02+"照片比对有问题"
#if similar >80:
#print "两张图片的相似度为"+str(similar)+" 很有可以能是同一个人"
# return similar
#else:
# #print "两张图片的相似度为:"+str(content['result'][0]['score'])
# return similar
def compare():
similarlist=[]
similardict={}
for img in listdir('./star/'):
similarvalue=facecompar('compar.jpg','./star/'+img)
similarlist.append(similarvalue)
similardict[similarvalue]=img
return similarlist,similardict
def stardb():
starstr="邢佳栋 李学庆 高昊 潘粤明 戴军 薛之谦 贾宏声 于波 李连杰 王斑 蓝雨 刘恩佑 任泉 李光洁 姜文 黑龙 张殿菲 邓超 张杰 杨坤 沙溢 李茂 黄磊 于小伟 刘冠翔 秦俊杰 张琳 陈坤 黄觉 邵峰 陈旭 马天宇 杨子 邓安奇 赵鸿飞 马可 黄海波 黄志忠 李晨 后弦 王挺 何炅 朱亚文 胡军 许亚军 张涵予 贾乃亮 陆虎 印小天 于和伟 田亮 夏雨 李亚鹏 胡兵 王睿 保剑锋 于震 苏醒 胡夏 张丰毅 刘翔 李玉刚 林依轮 袁弘 朱雨辰 丁志诚 黄征 张子健 许嵩 向鼎 陆毅 乔振宇 闫肃 李健 王啸坤 胡歌 吉杰 吴俊余 韩寒 黄海冰 魏晨 郭敬明 何晟铭 巫迪文 谢苗 郑源 欢子 文章 陈翔 井柏然 左小祖咒 含笑 李咏 徐誉滕 段奕宏 李炜 罗中旭 张远 李立 释小龙 大左 君君 毛宁 樊凡 周一围 于荣光 汤潮 张晓晨 吴京 山野 陈龙 侯勇 张国强 玉米提 周觅 张丹峰 俞思远 姚明 冯绍峰 陈玉建 吴建飞 郑钧 胡彦斌 李智楠 钱枫 高曙光 谢和弦 陈道明 柳云龙 汪峰 陈楚生 陈思成 魏晨 马雪阳 袁成杰 崔健 杜淳 林申 刘洲成 黄晓明 刘烨 张翰 杨洋 宋晓波 解小东 窦唯 姜武 陈泽宇 彭坦 张一山 李易峰 严宽 东来东往 张国立 王志文 佟大为 柏栩栩 蒲巴甲 凌潇肃 李行亮 毛方圆 张嘉译 大张伟 师洋 李幼斌 张磊 朱梓骁 武艺 杨俊毅 耿乐 钱泳辰 撒贝宁 徐峥 谭杰希 黄晟晟 海鸣威 汪涵 王学兵 贾一平 孙红雷 袁文康 蔡国庆 吴秀波 王栎鑫 安琥 刘心 俞灏明 张超 于小彤 张峻宁 乔任梁 朴树 赵帆 张译 聂远 张敬轩 付辛博 黄明 杜海涛 李宇春 张靓颖 周笔畅 何洁 刘亦菲 张含韵 陈好 尚雯婕 汤唯 张筱雨 韩雪 孙菲菲 张嘉倪 霍思燕 陈紫函 朱雅琼 江一燕 厉娜 许飞 胡灵 郝菲尔 刘力扬 reborn 章子怡 谭维维 魏佳庆 张亚飞 李旭丹 孙艺心 巩贺 艾梦萌 闰妮 王蓉 汤加丽 汤芳 牛萌萌 范冰冰 赵薇 周迅 金莎 纪敏佳 黄雅莉 叶一茜 马苏 阿桑 董卿 金铭 徐行 姚笛 朱妍 夏颖 陈西贝 冯家妹 高娅媛 林爽 郑靖文 陶虹 徐静蕾 黄奕 董洁 巩俐 高圆圆 于娜 孟广美 Gameapple 美女奉奉 小龙女彤彤 张子萱 果子 丁贝莉 吸血芭比 公交MM 香香 段思思 二月丫头 刘羽琦 dodolook 拉拉公主 沈丽君 周璟馨 丁叮 谢雅雯 陈嘉琪 宋琳 郭慧敏 卢洁云 佘曼妮 黄景 马艳丽 蒋雯丽 宁静 许晴 张静初 瞿颖 张延 孙俪 闵春晓 蔡飞雨 吴卓羲 游鸿明 胡宇崴 张震岳 汤镇业 黄立行 苗侨伟 周星驰 温升豪 萧敬腾 窦智孔 陈汉典 郑伊健 陈国坤 张信哲 范逸臣 王绍伟 辰亦儒 张卫健 周汤豪 成龙 林志颖 苏有朋 温兆伦 吴建豪 黄家驹 卢广仲 林文龙 赵又廷 刘德华 周传雄 李治廷 周华健 钟镇涛 周渝民 陈柏霖 邱心志 陈百强 郑元畅 王杰 狄龙 郭富城 光良 黄浩然 彭于晏 马浚伟 蓝正龙 林佑威 杜德伟 费翔 许志安 黄义达 黄耀明 陈键锋 王喜 黄贯中 江华 贺一航 郑少秋 蔡康永 陈伟霆 黄宗泽 刘畊宏 梁家辉 林志炫 赵文卓 樊少皇 连凯 吴镇宇 哈狗帮 吴尊 张国荣 方大同 刘松仁 郑嘉颖 周柏豪 王祖蓝 古巨基 萧正楠 邹兆龙 李铭顺 吴奇隆 金城武 李圣杰 陈建州 余文乐 罗志祥 吴启华 李克勤 秦汉 单立文 汪东城 莫少聪 陈冠希 黄秋生 罗嘉良 欧弟 马国明 范植伟 阮经天 郑中基 张智霖 麦浚龙 蔡依林 张韶涵 王心凌 徐若瑄 林志玲 王菲 S.H.E Twins 徐熙媛 桂纶镁 林依晨 陈乔恩 梁静茹 蔡诗芸 范玮琪 廖碧儿 张柏芝 李嘉欣 容祖儿 李玟 贾静雯 MaggieQ 林心如 朱茵 叶璇 唐宁 曾之乔 安以轩 杨丞琳 侯佩岑 同恩 陈松伶 文颂娴 梁凯蒂 林韦君 陈思璇 曹敏莉 乐基儿 郑雪儿 佘诗曼 郑秀文 萧蔷 温碧霞 刘嘉玲 刘玉玲 林熙蕾 李若彤 张曼玉 关之琳 陈慧琳 萧淑慎 蔡少芬 萧亚轩 田丽 杨采妮 李丽珍 琦琦 天心 任港秀 杨思敏 郭静纯 钟丽缇 孙燕姿 叶玉卿 翁红 邱淑贞 蔡淑臻 梁咏琪 季芹 舒淇 莫文蔚 戴佩妮 刘若英 杨千桦 范伟琪 徐熙娣 陈宝莲 吴辰君 张庭 林嘉欣 俞飞鸿 叶子楣 周海媚 伊能静 蜜雪薇琪 侯湘婷 Hebe 应采儿 许茹芸 吴佩慈 郑希怡 范文芳 李彩桦 蔡淳佳 本多RuRu 范晓萱 张惠妹 林忆莲 关心妍 卓依婷 杨恭如 陈文媛 吴小莉 梅艳芳 林青霞 赵雅芝 孟庭苇 吴倩莲 陈慧珊 许慧欣 黎姿 周慧敏 钟楚红 蔡琴 齐豫 邓丽君 林凤娇 陈玉莲 周冰倩 杨惠姗 金素梅 翁美玲 高胜美 甄妮 胡慧中 邝美云 俞小凡 吕秀菱 萧芳芳 刘雪华 潘迎紫 梁雁翎 汪明荃 苏芮 冯宝宝 利智 张艾嘉 叶倩文 陈淑桦 郑裕玲 潘越云 凤飞飞 喻可欣"
starslist=starstr.split()
for star in starslist:
inform=crawling(star)
facecrawling(star)
try:
conn = conmysql()
cur = conn.cursor()
image=star+'.jpg'
sql="insert into star values(%s,%s,%s)"
cur.execute(sql,(star,inform,image))
cur.close()
conn.commit()
conn.close()
finally:
print "connitue"
import time
time.sleep(1.5)
if __name__=="__main__":
similarlist,similardict=compare()
similarkey=sorted(similarlist)[-1]
starname=similardict[similarkey]
conn = conmysql()
cur = conn.cursor()
sql="select * from face where iamge='%s'" % starname
cur.execute(sql)
results = cur.fetchall()
print "一共对数据库进行比对了"+str(len(similarlist))+"条信息"
for info in results:
print "匹配到明星的信息:"+ info[0],info[1],info[2],"相似度:"+str(similarkey)
conn.close()
数据库:
[图片上传失败...(image-ecde75-1612410067334)]
目录:
[图片上传失败...(image-69828d-1612410067334)]
项目总结:人脸比对对照片的有一定要求,因为我爬取的照片大小不规则,所以比对的时候,会有问题,人脸比对用的百度的api接口,感觉关键部分不是自己实现的,正在恶补数据结构和算法。
网友评论