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

 

转载于:https://www.cnblogs.com/dmass36/p/10182183.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
识别结果大概是这样 {'result': {'face_num': 1, 'face_list': [{'quality': {'occlusion': {'right_eye': 0, 'left_cheek': 0.1459853947, 'right_cheek': 0.05144193396, 'left_eye': 0.465408802, 'mouth': 0.02919708006, 'chin_contour': 0.01420217194, 'nose': 0}, 'illumination': 116, 'blur': 7.266304692e-06, 'completeness': 1}, 'age': 22, 'face_token': 'dc6f8f9df5d977ea476e2d04acdf5063', 'race': {'type': 'white', 'probability': 0.6173604727}, 'glasses': {'type': 'common', 'probability': 0.9834988713}, 'gender': {'type': 'male', 'probability': 0.655915916}, 'face_probability': 0.9185044169, 'beauty': 51.21487427, 'angle': {'roll': -2.750922441, 'yaw': 28.97134399, 'pitch': 5.202290535}, 'location': {'height': 65, 'top': 112.0704803, 'width': 76, 'left': 76.20765686, 'rotation': -4}, 'face_type': {'type': 'human', 'probability': 0.9992217422}, 'face_shape': {'type': 'oval', 'probability': 0.4419156313}, 'expression': {'type': 'none', 'probability': 0.9999142885}}]}, 'error_msg': 'SUCCESS', 'timestamp': 1537413754, 'cached': 0, 'error_code': 0, 'log_id': 9465840013520} 年龄:22 颜值:51.21487427 表情-type(none:不笑;smile:微笑;laugh:大笑):none 表情-probability(表情置信度,范围【0~1】,0最小、1最大):0.9999142885 脸型-type(square: 正方形 triangle:三角形 oval: 椭圆 heart: 心形 round: 圆形):oval 脸型-probability(置信度,范围【0~1】,代表这是人脸形状判断正确的概率,0最小、1最大):0.4419156313 性别-type(male:男性 female:女性):male 性别-probability(性别置信度,范围【0~1】,0代表概率最小、1代表最大。):0.655915916 是否带眼镜-type(none:无眼镜,common:普通眼镜,sun:墨镜):common 是否带眼镜-probability(眼镜置信度,范围【0~1】,0代表概率最小、1代表最大。):0.9834988713 人种-type(yellow: 黄种人 white: 白种人 black:黑种人 arabs: 阿拉伯人):white 人种-probability(人种置信度,范围【0~1】,0代表概率最小、1代表最大。):0.6173604727 真实人脸/卡通人脸 -type(human: 真实人脸 cartoon: 卡通人脸):human 真实人脸/卡通人脸 -probability(人脸类型判断正确的置信度,范围【0~1】,0代表概率最小、1代表最大。):0.9992217422

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值