1. 程式人生 > >win10+python3.6+百度AI——實現人臉識別

win10+python3.6+百度AI——實現人臉識別

 一、說明

近來半個月的時間沉迷於python不能自拔,不是初學,而是好久沒有寫程式了。在此記錄pycharm建立Django專案基於百度AI實現的人臉檢測。該專案參考了知乎的一篇文章,詳情點選這裡,原文是在Linux環境下搭建的,用了Anaconda作為python的解析器,個人對Anaconda不是很感興趣,再有一點就是Anaconda下安裝的一些庫並不是最新的版本。本專案對原文專案有一些改動,但是大部分還是依照原文專案的架構和邏輯。

 

二、專案開始

2.1註冊獲得百度AI的介面

註冊網址在這裡,進入頁面後點擊控制檯,選擇人臉識別,需要百度賬號登陸,有則登陸,無則註冊

2.2建立應用

進入“人臉識別”後,點選“建立應用”按鈕

進入建立頁面後如圖設定便可

填寫好點選下面的“立即建立”,提示建立成功,點選“檢視應用詳情”

 

記下如圖所示的三個引數,Secret Key可以點選顯示檢視

2.3安裝所需的庫

在CMD中使用pip安裝即可,所需的庫包含以下幾個:

Django

requests(非必需)

simplejson

pillow

baidu-aip

三、程式編寫

在處理好所需的基礎條件後,進入程式的編寫,因為是一個線上的人臉檢測,所以需要一個WEB框架,在此使用的是Django

3.1pycharm新建Django專案

首先在pycharm中建立Django專案,關於建立pycharm如何建立Django專案,在此不再贅述,必要時可以搜尋教程

建立好Django專案後,在專案的根目錄有一個manage.py的檔案,在CMD中使用命令python manage.py runserver 0.0.0.0:8000開啟服務(此時不要關閉CMD,讓其始終執行),開啟瀏覽器,輸入127.0.0.1:8000便可看到如圖所示,說明成功

 

 3.2建立(修改)重要的程式檔案

此步驟為該專案的重要部分,在此過程中容易出錯,需留意

recognition.py

view.html

settings.py

建立static資料夾以及其子資料夾images

1)手動在Django專案中建立recognition.py ,使其與pycharm自動生成的結構中的urls.py位於同一個資料夾下

2)手動在Django專案中建立view.html ,使其位於在templates 資料夾下,在pycharm建立Django時會自動生成 templates 資料夾,在此需要確定templates資料夾與 manage.py 在同一個目錄中

3)在settings.py檔案的最後一行新增

STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static').replace('\\', '/'), )

4)建立資料夾static,並在其中建立子資料夾images,用以儲存需要識別的人臉圖片,確保static資料夾與templates資料夾是同級

 3.3編輯view.html檔案

在view.html檔案中寫入如下程式碼

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>人臉識別</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>

3.4編輯recognition.py檔案

在recognition.py檔案中寫入如下程式碼。重要說明:在該程式中,所有的路徑均為絕對路徑,注意路徑的斜槓方向,這也是windows與linux的重要區別。

from django.shortcuts import render
from aip import AipFace
import base64
import json

from PIL import Image
from PIL import ImageDraw

#百度介面資訊
APP_ID = '******'       #在此填寫之前百度頁面上顯示的AppID引數
API_KEY = '*****'       #在此填寫之前百度頁面上顯示的ApiKEY引數
SECRET_KEY = '******'   #在此填寫之前百度頁面上現實的SecretyKEY引數
client = AipFace(APP_ID,API_KEY,SECRET_KEY)
imageType = "BASE64"

#定義引數變數
options = {}
options["max_face_num"] = 1
options["face_field"] = "age,beauty,gender,landmark"

def recognition_post(request):
    context ={}    #此處將原文的content改為context,下同
    if request.POST:
        with open(".\\static\\images\\" +str(request.FILES['Photo']),"rb") as f:     #所有路徑均為絕對路徑,下同
            base64_date = base64.b64encode(f.read())
            image = str(base64_date,encoding='utf-8');
            result = client.detect(image, imageType, options)


        context['Photo'] = "\\static\\iamges\\"+str(request.FILES['Photo'])  

#將百度介面返回的資料轉成json物件
        json_str = json.dumps(result)

#對資料進行解碼
        json_data = json.loads(json_str)

        context['age'] = json_data['result']['face_list'][0]['age']
        context['beauty'] = json_data['result']['face_list'][0]['beauty']
        gender = json_data['result']['face_list'][0]['gender']['type']
        if gender == 'female':
            context['gender'] = "女性"
        else:
            context['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")
        context['target_img'] = "static\\images\\target_img.jpg"


    return render(request, "view.html", context)

四、測試程式

將上述程式編寫完成之後,在pycharm中執行recognition.py,同時在瀏覽器中開啟127.0.0.1:8000/recognition,便可進入如下介面:

點選選擇檔案,從之前建立的資料夾static\images中選擇需要識別的人臉圖片,點選提交,便可得到如下結果:

 

五、最後說明

1)鄙人不是python的大神,在很多方面還處於練習階段,本篇文章寫作倉促,如有依照本教程操作的過程中有什麼問題,請先檢視所需庫的安裝是否完整,如有問題可留言,看到回覆

2)如最終結果所示,在識別圖片的左邊有一個圖片無法顯示,看過原文應該知道左邊應該會顯示原圖,但是鄙人這邊無法顯示,換了瀏覽器(甚至用了IE)也不行,如果有大神知道原因,希望可以留言賜教

3)在此感謝參考文章及作者,如有侵權必刪

4)此為鄙人專案中各個檔案的位置(對應3.2步驟的說明):

 

5)最後吐槽一下搜尋機制,即使在國內最大的搜尋引擎中完全搜尋參考文章的題目,也是無法搜尋到的,呵呵噠