【AI产品】零基础实现图像识别小功能

在我们身边,到处都有人脸识别的技术,像我们平时使用的iPhone手机,照片里面有一个“人物”的功能,它能够将照片里面的人物识别出来,然后进行分类,iPhoneX还可以扫脸解锁手机。再比如,家里面的智能电视,当你看到某个片段某个人时,电视就可以告诉你这个人是谁,演过些什么电影。这些背后都离不开人脸识别的技术。

这篇文章将详细介绍,怎样安装和使用Python语言,利用百度大脑提供的AI接口,从0开始,一步一步来做一个人脸识别的功能,通过人脸识别分析人物的年龄、性别和颜值,以及在人脸上描出72个特征点,最后我们将在浏览器查看效果。

先来看一下最终实现的效果:

spyder7.jpg

准备

电脑与windows系统

第一步 安装开发环境

我们选择用Python语言,Python目前是机器学习中比较流行的语言,入门简单,功能强大。安装Python的方式有很多种,我们选择用anaconda的方式,anaconda相当于一个工具包,将Python和一些常用的包打包一起,下载好就可以直接使用,非常方便,而且是免费的。

1.1 下载anaconda

直接登录anaconda官网下载 <u>https://www.anaconda.com/download/</u>

<figure>
image

</figure>

下载完,双击安装文件,开始安装anaconda

<figure>
image

</figure>

点击“Next”

<figure>
image

</figure>

点击“I Agree”

<figure>
image

</figure>

点击“Next”

<figure>
image

</figure>

选择安装位置(可以默认不变),点击“Next”

<figure>
image

</figure>

点击“Install”开始安装

<figure>
image

</figure>

点击“Finsh”,安装完成。

1.2 安装 spyder

打开anaconda

<figure>
image

</figure>

进入anaconda首页

<figure>
image

</figure>

在anaconda首页,上图红框spyder这里点击“install”,spyder是Python的一个简单的集成开发环境。如果是已安装的话,“install”的按钮会显示“Launch”,点击就可以启动spyder,我们可以在spyder里面编写代码。

1.3 检查Python环境是否正常

打开anaconda,点击左侧“Environments”,然后点击“base(root)”右边的小三角,在弹出的内容里面,选择“Open with Python”

<figure>
image

</figure>

弹出系统命令窗口,如显示下面内容,则表示Python安装成功。

<figure>
image

</figure>

第二步 注册获取百度AI接口

要实现人脸识别有很多方式,可以自己写算法,也可以利用一些AI平台提供的开放接口,我们选择用百度大脑提供的人脸识别接口来实现。

2.1 登录百度AI开放平台

打开 <u>http://ai.baidu.com/</u>

<figure>
image

</figure>

点击页面右上角“控制台”,选择“人脸识别”

PS:需要先登录百度账号,如果没有百度账号需要注册一个。

2.2 创建应用

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

<figure>
image

</figure>

进入创建应用页面

<figure>
image

</figure>

填写好点击下面的“立即创建”,提示创建成功。

<figure>
image

</figure>

点击“查看应用详情”

<figure>
image

</figure>

如上截图,红框里面的 AppID、API Key 和 Secret Key 这三个内容很重要,等下调用接口时候,需要它们做签名验证。

第三步 安装web应用框架

在开始编写代码之前,为了让我们编写的代码,可以通过网页的形式展示出来,方便我们浏览效果,我们还需要做多一步。我们需要搭建一个简单的Web应用,对于Python来说,有很多Web框架可以让我们快速搭建Web应用,这里我们选择Django框架。

3.1 安装Django框架

打开anaconda,点击左侧“Environments”,然后点击“base(root)”右边的小三角,在弹出的内容里面,选择“Open Terminal”

<figure>
image

</figure>

弹出命令窗口

<figure>
image

</figure>

在弹出的这个命令窗口,我们使用pip来安装django框架

PS:pip是一个安装和管理 Python 包的工具,在我们使用python开发项目的过程,很多时候需要下载一些包,都可以通过pip来安装,非常简单,也很方便。我们安装anaconda后,默认都会安装pip的工具,所以我们直接使用就可以。

在上面的命令窗口输入以下命令:

pip install django

然后按回车开始安装

<figure>
image

</figure>

<figure>
image

</figure>

按回车后,大概需要几分钟时间,就会自动安装好,中间不需要任何操作,直到出现上面这个提示,就代表已经安装成功!

第四步 编写代码

好了,该准备的工作我们都准备好了,接下来就可以创建项目,然后正式编写代码。这一步其实没大家想的复杂,只需要几十行代码就可以实现我们要的效果,当然,如果要完全熟悉代码,甚至了解背后更深的逻辑,需要付出更多时间去学习。

4.1 创建项目

我们先创建一个web项目,通过anaconda打开命令窗口(参考上一步)

<figure>
image

</figure>

然后切换路径,切换到我们想创建项目的位置,注意,我这里是放在电脑的F盘里面的test文件夹,所以先在上面的命令窗口中,输入f: 按回车切换到F盘

<figure>
image

</figure>

再输入 cd test 按回车进入test文件夹

<figure>
image

</figure>

如上截图,我们现在已经进入F盘的test文件夹目录下了,在这里我们创建一个名称为 Face_Recognition 的项目,直接输入以下命令创建项目,然后按回车:

django-admin.py startproject Face_Recognition

<figure>
image

</figure>

创建后我们打开电脑对应的目录,如果看到 Face_Recognition 的文件夹,就说明创建成功了

PS:如果没看到 Face_Recognition 的文件夹,说明创建失败,可以将创建命令改成:

django-admin startproject Face_Recognition

<figure>
image

</figure>

双击打开Face_Recognition这个文件夹,里面有一个文件夹和一个py的文件

<figure>
image

</figure>

然后我们启动服务器,启动后,我们就可以通过浏览器来访问这个项目。

回到刚才的命令窗口,先进入到Face_Recognition的目录里面,然后输入以下命令,按回车:
python manage.py runserver 0.0.0.0:8000

<figure>
image

</figure>

这样我们就启动服务器了,接下来我们打开浏览器,在浏览器地址栏输入:

127.0.0.1:8000

如果正常启动,浏览器会显示下面的页面

<figure>
image

</figure>

PS:服务器启动后,这个命令窗口不要关掉哦,让它运行着就可以,如果关掉的话,浏览器将无法访问页面。后面需要使用命令窗口,可以重新打开一个。

4.2 创建页面

项目创建成功后,接下来,我们就可以打开spyder,新建页面,然后开始编写代码了。

我们需要新建两个页面,分别是:

recognition.py 用来处理人脸识别

view.html 模板文件,用来处理页面展示

我们先了解下这两个页面的逻辑:

1)首先,我们在 view.html 里面选择图片,提交给 recognition.py 处理;

2)recognition.py 接收到图片后,进行人脸识别,然后将分析结果返回给 view.html;

3)view.html 将 recognition.py 返回的分析结果展示出来。

PS:新建这两个页面的时候,需要注意文件所放的目录。

recognition.py 是放在 F:\test\Face_Recognition\Face_Recognition,即跟urls.py 在同个目录。

view.html 是放在 templates 文件夹里面,我们需要在 F:\test\Face_Recognition 创建 templates 文件夹,即跟 manage.py 在同个目录。

好了,我们开始动手做吧

首先打开 spyder

<figure>
image

</figure>

点击上图左上角的按钮,新建页面

<figure>
image

</figure>

新建后,我们先点击左上角红框位置的保存按钮,把它保存为 recognition.py,然后再新建和保存 view.html

<figure>
image

</figure>

4.3 编写代码
按照两个页面逻辑顺序,我们先编写view.html页面,让它可以选择图片传给recognition.py,打开刚才新建的view.html,并输入下面代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>人脸识别demo</title>
</head>
<body>
<form action="/recognition" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" name="pic">
    <input type="submit" value="提交">
</form>
{{ pic }}
</body>
</html>

上面这段代码通过表单提交图片,然后传给 /recognition路径去处理

为了让django框架知道这个模板文件的路径,我们需要修改 F:\test\Face_Recognition\Face_Recognition\settings.py 文件,修改 TEMPLATES 中的 DIRS 为 [BASE_DIR+"/templates",],如下所示:

<figure>
image

</figure>

接下来,我们打开 recognition.py 文件,输入以下代码:

from django.shortcuts import render

def recognition_post(request):
    context ={}
    if request.POST:
        context['pic'] = request.FILES['pic']
 return render(request, "view.html", context)

这段代码创建 recognition_post 函数,用来接收表单提交的照片,提交数据给 view.html

为了让 view.html 这个页面和 recognition_post 函数能够完成这样的操作,我们需要配置URL,打开 F:\test\Face_Recognition\Face_Recognition\urls.py,删除原来代码,将以下代码复制粘贴到 urls.py 文件中:

from django.conf.urls import url
from . import recognition

urlpatterns = [
    url(r'^recognition$', recognition.recognition_post),
]

OK,我们可以在浏览器输入 http://127.0.0.1:8000/recognition,浏览下效果

<figure>
image

</figure>

PS:为了解决在django里面图片路径显示的问题,我们需要创建一个和templates同级的文件夹static,在static下创建images文件夹,然后将用来测试的图片存在images里面。

然后,打开 settings.py 文件文件,在末尾添加如下代码:

STATIC_URL = '/static/' 
STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static').replace('\\', '/'), )

接下来,我们在 recogniton.py 使用百度人脸识别的接口,来识别提交的图片,在调用接口前,我们需要先安装一下Python SDK,在anaconda中打开命令窗口(参考前面第三步),在命令窗口输入:

pip install baidu-aip

<figure>
image

</figure>

出现红框的 Successfully installed baidu-aip-2.2.5.2 提示安装成功。

我们重新编辑 recognition.py,完整代码如下:

# -*- coding: utf-8 -*-
from django.shortcuts import render
from aip import AipFace
import base64
import json

# 需要安装PIL,它是一个图像处理库。安装语句:pip install pillow  安装方法参考上面安装django
import PIL
from PIL import Image
from PIL import ImageDraw

## 百度接口信息
APP_ID = '1******7'
API_KEY = 'y7VFQ**********0wRiplh'
SECRET_KEY = '2zLjGOD***********roqFg6ViHrpa'

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):
    content ={}

    if request.POST:

         with open("./static/images/"+str(request.FILES['Photo']),"rb") as f:  
            base64_data = base64.b64encode(f.read())
            image = str(base64_data, encoding='utf-8');
            result = client.detect(image, imageType, options)

        content['Photo'] = "/static/images/"+str(request.FILES['Photo'])

        # 将百度接口返回的数据转成json对象
        json_str = json.dumps(result)
        # 对数据进行解码
        json_data = json.loads(json_str)

        content['age'] = json_data['result']['face_list'][0]['age']
        content['beauty'] = json_data['result']['face_list'][0]['beauty']
        gender = json_data['result']['face_list'][0]['gender']['type']
        if gender == 'female':
            content['gender'] = "女性"
        else:
            content['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")
        content['target_img'] = "/static/images/target_img.jpg"

    return render(request, "view.html", content)

以上代码,主要是通过接口来识别照片里面的人物,分析人物的年龄和性别,给人物的颜值打分,以及标记人脸的72个特征点,然后通过最后一句代码将这些内容传给 view.html

PS:代码中APP_ID、API_KEY和SECRET_KEY就是我们在第二步创建百度AI应用时获取的,请填写自己获取的对应内容。

然后我们再打开 view.html,将 recognition.py 识别后传过来的分析结果呈现出来,完整代码如下:

<!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>

好了,以上就是所有的代码了,接下来,我们打开浏览器,看一下整个效果吧

<figure>
image

</figure>

恭喜,走到这一步,我们就完成了人脸识别的效果,是不是有点激动,呵呵!

从开始安装环境到通过浏览器访问效果,对于熟悉代码的人来说,其实很简单,但对于刚接触的小白来说,却是挺不容易,整个过程必然会遇到很多坑,希望通过这篇文章,大家尽量少走些坑。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容