win10+python3.6+百度AI——实现人脸识别

 一、说明

近来半个月的时间沉迷于python不能自拔,不是初学,而是好久没有写程序了。在此记录pycharm建立Django项目基于百度AI实现的人脸检测。该项目参考了知乎的一篇文章,详情点击这里,原文是在Linux环境下搭建的,用了Anaconda作为python的解析器,个人对Anaconda不是很感兴趣,再有一点就是Anaconda下安装的一些库并不是最新的版本。本项目对原文项目有一些改动,但是大部分还是依照原文项目的架构和逻辑。

二、项目开始

2.1注册获得百度AI的接口

注册网址在这里,进入页面后点击控制台,选择人脸识别,需要百度账号登陆,有则登陆,无则注册

2.2创建应用

进入“人脸识别”后,点击“创建应用”按钮

进入创建页面后如图设置便可

扫描二维码关注公众号,回复: 4661712 查看本文章

填写好点击下面的“立即创建”,提示创建成功,点击“查看应用详情”

记下如图所示的三个参数,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)最后吐槽一下搜索机制,即使在国内最大的搜索引擎中完全搜索参考文章的题目,也是无法搜索到的,呵呵哒

猜你喜欢

转载自www.cnblogs.com/dmass36/p/10182183.html