python實現明星專家系統



 其實一直對電影裏面的對×××進行人臉匹配而後,刷出來×××信息很感興趣,今天晚上一時興起,就搞了一把小的。python

理論上:你能夠創建一個你感興趣的百萬級的數據庫,給你個照片 ,你就能夠獲得她是誰,哪裏的,信息均可以知道,並且由於人與人之間的網狀的關聯,你甚至能夠知道她喜歡的人是誰,男友長啥樣子。mysql

想信我:一切都不是虛構的,你能作的更多!算法

思路:sql

1、數據收集,能夠採用爬蟲對網上海里的明星信息進行有針對的爬取數據庫

2、格式化數據,存入mysq,把明星的自拍照的文件名存入數據庫中json

3、使用百度的api對程序進行編寫,說實話,百度人臉識別作的很棒了,精確度很高api

4、你上傳一張圖片(或者你能想象到的方式),後面的程序會對你海量的數據庫中人的信息進行比對數據結構

5、輸出匹配到的人的信息,和類似度的數值。app


直接上代碼:數據結構和算法

# 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()

測試圖片:

wKioL1mZz5yALdLMAAAibjYpu9k110.jpg-wh_50


由於她是我高中的時候喜歡過的明星,因此~~~~


明星數據庫:

wKioL1mZ0CqRR28sAACaiecdnXc612.png-wh_50

由於只是先把路走通,因此數據不多。


明星的照片所在目錄:

wKiom1mZ0JfgW-gxAABWMwUCWoc260.png-wh_50

明星照片:

wKioL1mZ0TaDYUgkAAEoM037WUY697.jpg-wh_50

wKiom1mZ0TyxtWekAAAYjPASZXI435.jpg-wh_50

wKiom1mZ0T3Ct4rkAABWbIy1wLY860.jpg-wh_50

wKioL1mZ0TfCrKxTAAD3DdinQxs862.jpg-wh_50

wKioL1mZ0TeyVpLGAAB_CoyoEHQ209.jpg-wh_50


程序運行效果:

wKiom1mZ0ZGiLnJrAABMWg3gOwY615.png-wh_50

一共對數據庫進行比對了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()


數據庫:

wKiom1ma3BPAxiQoAAMPtHNehzg309.png-wh_50


目錄:

wKiom1ma3Gyi4HfeAAVVwINw1ng320.png-wh_50


項目總結:人臉比對對照片的有必定要求,由於我爬取的照片大小不規則,因此比對的時候,會有問題,人臉比對用的百度的api接口,感受關鍵部分不是本身實現的,正在惡補數據結構和算法。

相關文章
相關標籤/搜索