一、說明
近來半個月的時間沉迷於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)為了讓django框架知道這個模板文件的路徑,需要修改settings.py 文件,將 TEMPLATES 中的 DIRS 為 [BASE_DIR+"/templates",],如下所示:
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)最后吐槽一下搜索機制,即使在國內最大的搜索引擎中完全搜索參考文章的題目,也是無法搜索到的,呵呵噠