python实战项目,人脸识别,调用百度人工智能 API 实现

前言


前面两节我们介绍了利用深度学习实现 语音合成菜品识别。这一节,我们介绍更加热门的人工智能应用:人脸识别。人脸识别可以比对两张人脸是否属于同一人,进一步的,给一张 x 的照片,我们能够从一堆照片里识别出最像 x 的照片。
依然是调用百度的 API,我们先看看官方文档:

人脸识别官方 API 介绍


接口能力:

  • 两张人脸图片相似度对比:比对两张图片中人脸的相似度,并返回相似度分值;

  • 多种图片类型:支持生活照、证件照、身份证芯片照、带网纹照四种类型的人脸对比;

  • 活体检测:基于图片中的破绽分析,判断其中的人脸是否为二次翻拍(举例:如用户A用手机拍摄了一张包含人脸的图片一,用户B翻拍了图片一得到了图片二,并用图片二伪造成用户A去进行识别操作,这种情况普遍发生在金融开户、实名认证等环节。);

  • 质量检测:返回模糊、光照等质量检测信息,用于辅助判断图片是否符合识别要求;

请求说明:

  • 请求体格式化:Content-Type为application/x-www-form-urlencoded,通过urlencode格式化请求体。

  • Base64编码:请求的图片需经过Base64编码,图片的base64编码指将图片数据编码成一串字符串,使用该字符串代替图像地址。您可以首先得到图片的二进制,然后用Base64格式编码即可。需要注意的是,图片的base64编码是不包含图片头的,如data:image/jpg;base64,

  • 图片格式:现支持PNG、JPG、JPEG、BMP,不支持GIF图片

请求示例

  • HTTP方法:POST
    请求URL: https://aip.baidubce.com/rest/2.0/face/v2/match

  • URL参数:
    access_token 通过API Key和Secret Key获取的access_token。

  • Header:
    Content-Type application/x-www-form-urlencoded
    Body中放置请求参数,参数详情如下:

说明:两张请求的图片请分别进行base64编码。

python 实战代码


同前面两节一样,分两步走:

1. 获取 token

获取 token 的请求 url 与前面两节略有不同,AK 和 SK 也不同,这点要注意,不然获取到的 token 也是无法校验通过的。

下面直接上代码,文件名 token.py

# encoding:utf-8
import urllib, urllib2, sys
import ssl, json

AK = "fGTcxxxxxxxxxxxxxk68c"
SK = "vKUxxxxxxxxxxxxxxxxxxxxxxxxxGq2u"

# token 请求 url 与图片不一样
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials'\
       '&client_id=%s'\
       '&client_secret=%s' % (AK, SK)

def GetToken():
    request = urllib2.Request(host)
    request.add_header('Content-Type', 'application/json; charset=UTF-8')
    response = urllib2.urlopen(request)
    content = response.read()
    if (content):
        js = json.loads(content)
        # return js['refresh_token']
        return js['access_token']
    return None

2. 人脸识别

这里实现的是人脸比对,即输入两张人脸图片,输出两个人脸属于同一人的得分。文件名 recg.py:

# encoding:utf-8
import base64
import urllib
import urllib2, json
from token import GetToken

'''
人脸对比
'''

url = "https://aip.baidubce.com/rest/2.0/face/v2/match"

def FaceRecg(face1, face2, token):
    f = open(face1, 'rb')
    # 参数images:图像base64编码
    img1 = base64.b64encode(f.read())
    # 二进制方式打开图文件
    f = open(face2, 'rb')
    # 参数images:图像base64编码
    img2 = base64.b64encode(f.read())

    params = {"images":img1 + ',' + img2}
    params = urllib.urlencode(params)

    request_url = url + "?access_token=" + token
    request = urllib2.Request(url=request_url, data=params)
    request.add_header('Content-Type', 'application/x-www-form-urlencoded')
    response = urllib2.urlopen(request)
    content = response.read()
    if content:
        js = json.loads(content)
        for item in js['result']:
            print(u"%2.2f%% 可能是同一人" % (float(item['score'])))

if __name__ == "__main__":
    FaceRecg('【图片1】', '【图片2】', GetToken())      #前面两个参数是图片路径

3. 测试


我们在代码所在路径新建一个文件夹 pic,里面放入要对比的图片:

这样,recg.pymain 部分的图片就可以如下给出:

if __name__ == "__main__":
    FaceRecg('pic/1.jpg', 'pic/2.jpg', GetToken())      #前面两个参数是图片路径

最终测试结果如下:

两个人脸属于同一人的得分达到 86.98 分,可以看出识别结果还是不错的。

再看一组测试,这次使用两个人,看看效果:

识别结果不错,一点也不像。

再写一点

其实有了上面这些基础,我们完全可以从一堆图片里挑出给出的某一张。举个例子,我们往 pic 里再加入以下几张图片:



加上上面 4 张,一共 7 张图片,我们输入第 3 张图片:

然后从余下 6 张里挑出一张最像的,python 代码可以如下修改:

# encoding:utf-8
import base64
import urllib
import urllib2, json
from token import GetToken


'''
人脸对比
'''

url = "https://aip.baidubce.com/rest/2.0/face/v2/match"

def FaceRecg(face1, face2, token):
    f = open(face1, 'rb')
    # 参数images:图像base64编码
    img1 = base64.b64encode(f.read())
    # 二进制方式打开图文件
    f = open(face2, 'rb')
    # 参数images:图像base64编码
    img2 = base64.b64encode(f.read())

    params = {"images":img1 + ',' + img2}
    params = urllib.urlencode(params)

    request_url = url + "?access_token=" + token
    request = urllib2.Request(url=request_url, data=params)
    request.add_header('Content-Type', 'application/x-www-form-urlencoded')
    response = urllib2.urlopen(request)
    content = response.read()
    if content:
        js = json.loads(content)
        # for item in js['result']:
            # print(u"%2.2f%% 可能是同一人" % (float(item['score'])))
        return float(js['result'][0]['score'])

if __name__ == "__main__":
    p = [0,0,0,0,0,0,0]
    for i in range(1, 8):
        if i!=3:                    # 不识别自己
            picI = 'pic/%d.jpg' % i
            p[i-1] = FaceRecg('pic/3.jpg', picI, GetToken())
            print '图片 %d 的相似性得分:%2.2f' % (i, p[i-1])
print '\n很大可能图片 %d 和图片 3 是同一人' % (p.index(max(p))+1)

最终输出结果如下:

可以看出,效果很好,至此,我们就完成了 python 人脸识别 代码。

阅读更多:   Python
已有 28 条评论
  1. orancy orancy

    11111

  2. […] python实战小项目,人脸识别,调用百度人工智能 API 实现 […]

  3. orancy orancy

    11111

  4. […] python实战小项目,人脸识别,调用百度人工智能 API 实现 […]

  5. […] python实战项目,人脸识别,调用百度人工智能 API 实现 […]

  6. […] python实战小项目,人脸识别,调用百度人工智能 API 实现 […]

  7. 漪懿 漪懿

    from token import GetToken

    ImportError: cannot import name 'GetToken'
    这个怎么解决

  8. 向日葵智能 向日葵智能

    from token import GetToken 中的 token 是自己定义的,新建 token.py 文件,将token部分的代码填入,和识别代码文件放在一起,就可以了。

    1. 漪懿 漪懿

      已经按照您上面的代码 分成两个文档保存了呀

  9. […] python实战小项目,人脸识别,调用百度人工智能 API 实现 […]

  10. 漪懿 漪懿

    TypeError: can't concat str to bytes
    这个错误怎么解

  11. 向日葵智能 向日葵智能

    我用的python2,python3似乎不太兼容。

    1. 漪懿 漪懿

      那能否给出python3 的代码 急需 非常感谢

      1. 漪懿 漪懿

        不知是否有了答案 烦请告知

  12. […] python实战项目,人脸识别,调用百度人工智能 API 实现 […]

  13. 向日葵智能 向日葵智能

    晚上我看看

  14. 漪懿 漪懿

    from token import GetToken

    ImportError: cannot import name 'GetToken'
    这个怎么解决

    1. 向日葵智能 向日葵智能

      from token import GetToken 中的 token 是自己定义的,新建 token.py 文件,将token部分的代码填入,和识别代码文件放在一起,就可以了。

      1. 漪懿 漪懿

        已经按照您上面的代码 分成两个文档保存了呀

    2. 漪懿 漪懿

      TypeError: can't concat str to bytes
      这个错误怎么解

      1. 向日葵智能 向日葵智能

        我用的python2,python3似乎不太兼容。

        1. 漪懿 漪懿

          那能否给出python3 的代码 急需 非常感谢

          1. 向日葵智能 向日葵智能

            晚上我看看

          2. 漪懿 漪懿

            不知是否有了答案 烦请告知

        2. 漪懿 漪懿

          不知您是否调出python3代码 2016ll.gif 谢谢您的帮忙

  15. 漪懿 漪懿

    File "C:\Users\Administrator.SKY-20170118BAZ\Anaconda3\lib\urllib\request.py", line 1248, in do_request_
    raise TypeError(msg)

    TypeError: POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.

    运行时调用request时遇到的错误 还请大佬告知如何改正 另若有python3代码 还请帮忙给出 十分感谢

  16. 漪懿 漪懿

    不知您是否调出python3代码 2016ll.gif 谢谢您的帮忙

  17. 漪懿 漪懿

    File "C:\Users\Administrator.SKY-20170118BAZ\Anaconda3\lib\urllib\request.py", line 1248, in do_request_
    raise TypeError(msg)

    TypeError: POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.

    运行时调用request时遇到的错误 还请大佬告知如何改正 另若有python3代码 还请帮忙给出 十分感谢

添加新评论

icon_redface.gificon_idea.gificon_cool.gif2016kuk.gificon_mrgreen.gif2016shuai.gif2016tp.gif2016db.gif2016ch.gificon_razz.gif2016zj.gificon_sad.gificon_cry.gif2016zhh.gificon_question.gif2016jk.gif2016bs.gificon_lol.gif2016qiao.gificon_surprised.gif2016fendou.gif2016ll.gif