一、说明
近来半个月的时间沉迷于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)最后吐槽一下搜索机制,即使在国内最大的搜索引擎中完全搜索参考文章的题目,也是无法搜索到的,呵呵哒