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