• 好好学习,天天向上~
  • 欢迎欢迎~

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

python lcc 982℃ 0评论

前言


前面两节我们介绍了利用深度学习实现 语音合成菜品识别。这一节,我们介绍更加热门的人工智能应用:人脸识别。人脸识别可以比对两张人脸是否属于同一人,进一步的,给一张 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 人脸识别 代码。

点赞 (2)分享 (0)
(28)个小伙伴在吐槽
  1. 11111
    orancy2018-06-04 11:29 回复
  2. 11111
    orancy2018-06-04 11:29 回复
  3. from token import GetToken ImportError: cannot import name 'GetToken' 这个怎么解决
    漪懿2018-07-21 08:52 回复
  4. from token import GetToken ImportError: cannot import name 'GetToken' 这个怎么解决
    漪懿2018-07-21 08:52 回复
    • from token import GetToken 中的 token 是自己定义的,新建 token.py 文件,将token部分的代码填入,和识别代码文件放在一起,就可以了。
      向日葵智能2018-07-21 21:17 回复
      • 已经按照您上面的代码 分成两个文档保存了呀
        漪懿2018-08-01 10:41 回复
    • TypeError: can't concat str to bytes 这个错误怎么解
      漪懿2018-07-31 16:15 回复
      • 我用的python2,python3似乎不太兼容。
        向日葵智能2018-07-31 19:22 回复
        • 那能否给出python3 的代码 急需 非常感谢
          漪懿2018-08-01 10:43 回复
          • 晚上我看看
            向日葵智能2018-08-02 16:00
          • 不知是否有了答案 烦请告知
            漪懿2018-08-08 10:42
        • 不知您是否调出python3代码 ❓ 谢谢您的帮忙
          漪懿2018-08-04 08:23 回复
  5. 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代码 还请帮忙给出 十分感谢
    漪懿2018-08-03 15:22 回复
  6. 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代码 还请帮忙给出 十分感谢
    漪懿2018-08-03 15:22 回复
发表我的评论
取消评论
表情     7 + 9 = ? (必填)