在我們身邊柑贞,到處都有人臉識(shí)別的技術(shù),像我們平時(shí)使用的iPhone手機(jī)钦睡,照片里面有一個(gè)“人物”的功能,它能夠?qū)⒄掌锩娴娜宋镒R(shí)別出來躁倒,然后進(jìn)行分類荞怒,iPhoneX還可以掃臉解鎖手機(jī)。再比如秧秉,家里面的智能電視褐桌,當(dāng)你看到某個(gè)片段某個(gè)人時(shí),電視就可以告訴你這個(gè)人是誰象迎,演過些什么電影荧嵌。這些背后都離不開人臉識(shí)別的技術(shù)。
這篇文章將詳細(xì)介紹砾淌,怎樣安裝和使用Python語言完丽,利用百度大腦提供的AI接口,從0開始拇舀,一步一步來做一個(gè)人臉識(shí)別的功能逻族,通過人臉識(shí)別分析人物的年齡、性別和顏值骄崩,以及在人臉上描出72個(gè)特征點(diǎn)聘鳞,最后我們將在瀏覽器查看效果。
先來看一下最終實(shí)現(xiàn)的效果:
準(zhǔn)備
電腦與windows系統(tǒng)
第一步 安裝開發(fā)環(huán)境
我們選擇用Python語言要拂,Python目前是機(jī)器學(xué)習(xí)中比較流行的語言抠璃,入門簡(jiǎn)單,功能強(qiáng)大脱惰。安裝Python的方式有很多種搏嗡,我們選擇用anaconda的方式,anaconda相當(dāng)于一個(gè)工具包,將Python和一些常用的包打包一起采盒,下載好就可以直接使用旧乞,非常方便,而且是免費(fèi)的磅氨。
1.1 下載anaconda
直接登錄anaconda官網(wǎng)下載 <u>https://www.anaconda.com/download/</u>
<figure></figure>
下載完尺栖,雙擊安裝文件,開始安裝anaconda
<figure></figure>
點(diǎn)擊“Next”
<figure></figure>
點(diǎn)擊“I Agree”
<figure></figure>
點(diǎn)擊“Next”
<figure></figure>
選擇安裝位置(可以默認(rèn)不變)烦租,點(diǎn)擊“Next”
<figure></figure>
點(diǎn)擊“Install”開始安裝
<figure></figure>
點(diǎn)擊“Finsh”延赌,安裝完成。
1.2 安裝 spyder
打開anaconda
<figure></figure>
進(jìn)入anaconda首頁
<figure></figure>
在anaconda首頁叉橱,上圖紅框spyder這里點(diǎn)擊“install”挫以,spyder是Python的一個(gè)簡(jiǎn)單的集成開發(fā)環(huán)境。如果是已安裝的話窃祝,“install”的按鈕會(huì)顯示“Launch”屡贺,點(diǎn)擊就可以啟動(dòng)spyder,我們可以在spyder里面編寫代碼锌杀。
1.3 檢查Python環(huán)境是否正常
打開anaconda甩栈,點(diǎn)擊左側(cè)“Environments”,然后點(diǎn)擊“base(root)”右邊的小三角糕再,在彈出的內(nèi)容里面量没,選擇“Open with Python”
<figure></figure>
彈出系統(tǒng)命令窗口,如顯示下面內(nèi)容突想,則表示Python安裝成功殴蹄。
<figure></figure>
第二步 注冊(cè)獲取百度AI接口
要實(shí)現(xiàn)人臉識(shí)別有很多方式,可以自己寫算法猾担,也可以利用一些AI平臺(tái)提供的開放接口袭灯,我們選擇用百度大腦提供的人臉識(shí)別接口來實(shí)現(xiàn)。
2.1 登錄百度AI開放平臺(tái)
打開 <u>http://ai.baidu.com/</u>
<figure></figure>
點(diǎn)擊頁面右上角“控制臺(tái)”绑嘹,選擇“人臉識(shí)別”
PS:需要先登錄百度賬號(hào)稽荧,如果沒有百度賬號(hào)需要注冊(cè)一個(gè)。
2.2 創(chuàng)建應(yīng)用
進(jìn)入“人臉識(shí)別”后工腋,點(diǎn)擊“創(chuàng)建應(yīng)用”按鈕
<figure></figure>
進(jìn)入創(chuàng)建應(yīng)用頁面
<figure></figure>
填寫好點(diǎn)擊下面的“立即創(chuàng)建”姨丈,提示創(chuàng)建成功。
<figure></figure>
點(diǎn)擊“查看應(yīng)用詳情”
<figure></figure>
如上截圖擅腰,紅框里面的 AppID蟋恬、API Key 和 Secret Key 這三個(gè)內(nèi)容很重要,等下調(diào)用接口時(shí)候趁冈,需要它們做簽名驗(yàn)證歼争。
第三步 安裝web應(yīng)用框架
在開始編寫代碼之前拜马,為了讓我們編寫的代碼,可以通過網(wǎng)頁的形式展示出來沐绒,方便我們?yōu)g覽效果俩莽,我們還需要做多一步。我們需要搭建一個(gè)簡(jiǎn)單的Web應(yīng)用洒沦,對(duì)于Python來說,有很多Web框架可以讓我們快速搭建Web應(yīng)用价淌,這里我們選擇Django框架申眼。
3.1 安裝Django框架
打開anaconda,點(diǎn)擊左側(cè)“Environments”蝉衣,然后點(diǎn)擊“base(root)”右邊的小三角括尸,在彈出的內(nèi)容里面,選擇“Open Terminal”
<figure></figure>
彈出命令窗口
<figure></figure>
在彈出的這個(gè)命令窗口病毡,我們使用pip來安裝django框架
PS:pip是一個(gè)安裝和管理 Python 包的工具濒翻,在我們使用python開發(fā)項(xiàng)目的過程,很多時(shí)候需要下載一些包啦膜,都可以通過pip來安裝有送,非常簡(jiǎn)單,也很方便僧家。我們安裝anaconda后雀摘,默認(rèn)都會(huì)安裝pip的工具,所以我們直接使用就可以八拱。
在上面的命令窗口輸入以下命令:
pip install django
然后按回車開始安裝
<figure></figure>
<figure></figure>
按回車后阵赠,大概需要幾分鐘時(shí)間,就會(huì)自動(dòng)安裝好肌稻,中間不需要任何操作清蚀,直到出現(xiàn)上面這個(gè)提示,就代表已經(jīng)安裝成功爹谭!
第四步 編寫代碼
好了枷邪,該準(zhǔn)備的工作我們都準(zhǔn)備好了,接下來就可以創(chuàng)建項(xiàng)目诺凡,然后正式編寫代碼齿风。這一步其實(shí)沒大家想的復(fù)雜,只需要幾十行代碼就可以實(shí)現(xiàn)我們要的效果绑洛,當(dāng)然救斑,如果要完全熟悉代碼,甚至了解背后更深的邏輯真屯,需要付出更多時(shí)間去學(xué)習(xí)脸候。
4.1 創(chuàng)建項(xiàng)目
我們先創(chuàng)建一個(gè)web項(xiàng)目,通過anaconda打開命令窗口(參考上一步)
<figure></figure>
然后切換路徑,切換到我們想創(chuàng)建項(xiàng)目的位置运沦,注意泵额,我這里是放在電腦的F盤里面的test文件夾,所以先在上面的命令窗口中携添,輸入f: 按回車切換到F盤
<figure></figure>
再輸入 cd test 按回車進(jìn)入test文件夾
<figure></figure>
如上截圖嫁盲,我們現(xiàn)在已經(jīng)進(jìn)入F盤的test文件夾目錄下了,在這里我們創(chuàng)建一個(gè)名稱為 Face_Recognition 的項(xiàng)目烈掠,直接輸入以下命令創(chuàng)建項(xiàng)目羞秤,然后按回車:
django-admin.py startproject Face_Recognition
<figure></figure>
創(chuàng)建后我們打開電腦對(duì)應(yīng)的目錄,如果看到 Face_Recognition 的文件夾左敌,就說明創(chuàng)建成功了
PS:如果沒看到 Face_Recognition 的文件夾瘾蛋,說明創(chuàng)建失敗,可以將創(chuàng)建命令改成:
django-admin startproject Face_Recognition
<figure></figure>
雙擊打開Face_Recognition這個(gè)文件夾矫限,里面有一個(gè)文件夾和一個(gè)py的文件
<figure></figure>
然后我們啟動(dòng)服務(wù)器哺哼,啟動(dòng)后,我們就可以通過瀏覽器來訪問這個(gè)項(xiàng)目叼风。
回到剛才的命令窗口取董,先進(jìn)入到Face_Recognition的目錄里面,然后輸入以下命令无宿,按回車:
python manage.py runserver 0.0.0.0:8000
</figure>
這樣我們就啟動(dòng)服務(wù)器了甲葬,接下來我們打開瀏覽器,在瀏覽器地址欄輸入:
127.0.0.1:8000
如果正常啟動(dòng)懈贺,瀏覽器會(huì)顯示下面的頁面
<figure></figure>
PS:服務(wù)器啟動(dòng)后经窖,這個(gè)命令窗口不要關(guān)掉哦,讓它運(yùn)行著就可以梭灿,如果關(guān)掉的話画侣,瀏覽器將無法訪問頁面。后面需要使用命令窗口堡妒,可以重新打開一個(gè)配乱。
4.2 創(chuàng)建頁面
項(xiàng)目創(chuàng)建成功后,接下來皮迟,我們就可以打開spyder搬泥,新建頁面,然后開始編寫代碼了伏尼。
我們需要新建兩個(gè)頁面忿檩,分別是:
recognition.py 用來處理人臉識(shí)別
view.html 模板文件,用來處理頁面展示
我們先了解下這兩個(gè)頁面的邏輯:
1)首先爆阶,我們?cè)?view.html 里面選擇圖片燥透,提交給 recognition.py 處理沙咏;
2)recognition.py 接收到圖片后,進(jìn)行人臉識(shí)別班套,然后將分析結(jié)果返回給 view.html肢藐;
3)view.html 將 recognition.py 返回的分析結(jié)果展示出來。
PS:新建這兩個(gè)頁面的時(shí)候吱韭,需要注意文件所放的目錄吆豹。
recognition.py 是放在 F:\test\Face_Recognition\Face_Recognition,即跟urls.py 在同個(gè)目錄理盆。
view.html 是放在 templates 文件夾里面痘煤,我們需要在 F:\test\Face_Recognition 創(chuàng)建 templates 文件夾,即跟 manage.py 在同個(gè)目錄熏挎。
好了速勇,我們開始動(dòng)手做吧
首先打開 spyder
<figure></figure>
點(diǎn)擊上圖左上角的按鈕晌砾,新建頁面
<figure></figure>
新建后坎拐,我們先點(diǎn)擊左上角紅框位置的保存按鈕,把它保存為 recognition.py养匈,然后再新建和保存 view.html
<figure></figure>
4.3 編寫代碼
按照兩個(gè)頁面邏輯順序哼勇,我們先編寫view.html頁面,讓它可以選擇圖片傳給recognition.py呕乎,打開剛才新建的view.html积担,并輸入下面代碼:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>人臉識(shí)別demo</title>
</head>
<body>
<form action="/recognition" method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="pic">
<input type="submit" value="提交">
</form>
{{ pic }}
</body>
</html>
上面這段代碼通過表單提交圖片,然后傳給 /recognition路徑去處理
為了讓django框架知道這個(gè)模板文件的路徑猬仁,我們需要修改 F:\test\Face_Recognition\Face_Recognition\settings.py 文件帝璧,修改 TEMPLATES 中的 DIRS 為 [BASE_DIR+"/templates",],如下所示:
<figure></figure>
接下來湿刽,我們打開 recognition.py 文件的烁,輸入以下代碼:
from django.shortcuts import render
def recognition_post(request):
context ={}
if request.POST:
context['pic'] = request.FILES['pic']
return render(request, "view.html", context)
這段代碼創(chuàng)建 recognition_post 函數(shù),用來接收表單提交的照片诈闺,提交數(shù)據(jù)給 view.html
為了讓 view.html 這個(gè)頁面和 recognition_post 函數(shù)能夠完成這樣的操作渴庆,我們需要配置URL,打開 F:\test\Face_Recognition\Face_Recognition\urls.py雅镊,刪除原來代碼襟雷,將以下代碼復(fù)制粘貼到 urls.py 文件中:
from django.conf.urls import url
from . import recognition
urlpatterns = [
url(r'^recognition$', recognition.recognition_post),
]
OK,我們可以在瀏覽器輸入 http://127.0.0.1:8000/recognition仁烹,瀏覽下效果
<figure></figure>
PS:為了解決在django里面圖片路徑顯示的問題耸弄,我們需要?jiǎng)?chuàng)建一個(gè)和templates同級(jí)的文件夾static,在static下創(chuàng)建images文件夾卓缰,然后將用來測(cè)試的圖片存在images里面叙赚。
然后老客,打開 settings.py 文件文件,在末尾添加如下代碼:
STATIC_URL = '/static/'
STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static').replace('\\', '/'), )
接下來震叮,我們?cè)?recogniton.py 使用百度人臉識(shí)別的接口胧砰,來識(shí)別提交的圖片,在調(diào)用接口前苇瓣,我們需要先安裝一下Python SDK尉间,在anaconda中打開命令窗口(參考前面第三步),在命令窗口輸入:
pip install baidu-aip
<figure></figure>
出現(xiàn)紅框的 Successfully installed baidu-aip-2.2.5.2 提示安裝成功击罪。
我們重新編輯 recognition.py哲嘲,完整代碼如下:
# -*- coding: utf-8 -*-
from django.shortcuts import render
from aip import AipFace
import base64
import json
# 需要安裝PIL,它是一個(gè)圖像處理庫(kù)媳禁。安裝語句:pip install pillow 安裝方法參考上面安裝django
import PIL
from PIL import Image
from PIL import ImageDraw
## 百度接口信息
APP_ID = '1******7'
API_KEY = 'y7VFQ**********0wRiplh'
SECRET_KEY = '2zLjGOD***********roqFg6ViHrpa'
client = AipFace(APP_ID, API_KEY, SECRET_KEY)
imageType = "BASE64"
# 定義參數(shù)變量
options = {}
options["max_face_num"] = 1
options["face_field"] = "age,beauty,gender,landmark"
## 百度接口信息
def recognition_post(request):
content ={}
if request.POST:
with open("./static/images/"+str(request.FILES['Photo']),"rb") as f:
base64_data = base64.b64encode(f.read())
image = str(base64_data, encoding='utf-8');
result = client.detect(image, imageType, options)
content['Photo'] = "/static/images/"+str(request.FILES['Photo'])
# 將百度接口返回的數(shù)據(jù)轉(zhuǎn)成json對(duì)象
json_str = json.dumps(result)
# 對(duì)數(shù)據(jù)進(jìn)行解碼
json_data = json.loads(json_str)
content['age'] = json_data['result']['face_list'][0]['age']
content['beauty'] = json_data['result']['face_list'][0]['beauty']
gender = json_data['result']['face_list'][0]['gender']['type']
if gender == 'female':
content['gender'] = "女性"
else:
content['gender'] = "男性"
landmark72 = json_data['result']['face_list'][0]['landmark72']
im1=Image.open("./static/images/"+str(request.FILES['Photo']))
draw = ImageDraw.Draw(im1)
for index in range(72):
xy = landmark72[index]
draw.text((xy['x'], xy['y']),"o",(255,255,0))
draw = ImageDraw.Draw(im1)
im1.save("static/images/target_img.jpg")
content['target_img'] = "/static/images/target_img.jpg"
return render(request, "view.html", content)
以上代碼眠副,主要是通過接口來識(shí)別照片里面的人物,分析人物的年齡和性別竣稽,給人物的顏值打分囱怕,以及標(biāo)記人臉的72個(gè)特征點(diǎn),然后通過最后一句代碼將這些內(nèi)容傳給 view.html
PS:代碼中APP_ID毫别、API_KEY和SECRET_KEY就是我們?cè)诘诙絼?chuàng)建百度AI應(yīng)用時(shí)獲取的娃弓,請(qǐng)?zhí)顚懽约韩@取的對(duì)應(yīng)內(nèi)容。
然后我們?cè)俅蜷_ view.html岛宦,將 recognition.py 識(shí)別后傳過來的分析結(jié)果呈現(xiàn)出來台丛,完整代碼如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>人臉識(shí)別</title>
</head>
<body>
<form action="/recognition" method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="Photo">
<input type="submit" value="提交">
</form>
{% if Photo %}
<p><img src={{ Photo }} width="300">
{% if target_img %}<img src={{ target_img }} width="300">{% endif %}
</p>
<p>年齡:{{ age }}歲<p>
<p>顏值:{{ beauty }}分<p>
<p>性別:{{ gender }}{{ face_type }}<p>
{% endif %}
</body>
</html>
好了,以上就是所有的代碼了砾肺,接下來挽霉,我們打開瀏覽器,看一下整個(gè)效果吧
<figure></figure>
恭喜变汪,走到這一步侠坎,我們就完成了人臉識(shí)別的效果,是不是有點(diǎn)激動(dòng)疫衩,呵呵硅蹦!
從開始安裝環(huán)境到通過瀏覽器訪問效果,對(duì)于熟悉代碼的人來說闷煤,其實(shí)很簡(jiǎn)單童芹,但對(duì)于剛接觸的小白來說,卻是挺不容易鲤拿,整個(gè)過程必然會(huì)遇到很多坑假褪,希望通過這篇文章,大家盡量少走些坑近顷。