如何使用百度云人脸识别服务(V3版接口python语言)(五)使用BASE64完成人脸检测

上一章我们说到如何使用URL的方式传递图像信息,相信你与我一样都认为这种方式太简单了

的确有点太简单了,然而,要清楚,我们大多所需要的是能检测保存于你电脑硬盘中的照片,我们不可能将它们一个个上传至服务器,再用它们的URL去做人脸检测,毕竟这样过于吃力不讨好。所以今天的目的就是教会你们如何上传本地的图片。

知道了目标,我们来看看如何实行

自然image_type参数中需要填入“BASE64”,那么image参数中又该传递什么值呢?

图片类型 BASE64:图片的base64值,base64编码后的图片数据,需urlencode,编码后的图片大小不超过2M

那么什么是BASE64?在技术文档的常见问题板块中百度做出了解释



摘录如下

Q:什么是base64编码,如何提供?
A:图片的base64编码指将一副图片数据编码成一串字符串,使用该字符串代替图像地址。您可以首先得到图片的二进制,然后用Base64格式编码即可。注:图片的base64编码是不包含图片头的,如(data:image/jpg;base64,)

百度的技术人员已经很热心的将你该怎么做“详细地”写出来了,也就是我们先要得到图片的二进制

首先在你保存源码的文件夹里放置一张图片,我们依旧使用上一章所使用的图片



当然,这个图像文件你可以放在任何位置,为了方便我直接就与源码放在一起,这样就无需指定路径了。

这样我们就可以开始将图像BASE64化了

import base64

filePath ="eee.jpg"
with open(filePath,"rb") as f:  
# b64encode是编码
    base64_data = base64.b64encode(f.read())

现将你的图像路径赋给filePath变量,这样修改起来十分方便。在这里,我先前将图像文件与源码放在一起的优势就展现出来了,因为我可以直接用“文件名+后缀名”来代替那一长撂的路径,毕竟在一个文件夹,就是一家人啊,肥水不流外人田。

在python中,我们可以使用open()这个函数来打开文件并返回文件变量。

open()的语法是这样的

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True)

我们可以看到open函数有很多的参数,我们要用的也只会是file,mode和encoding这三个参数,其他参数看看就好了

file代表的自然就是文件路径,如”C:\\I Love AI.jpg”等等,

mode是指明打开文件的模式。默认值是’r’,表示使用文本的方式打开文件来读取。 python中文件有以下几种打开模式

mode 执行操作
‘r’ 以只读方式打开文件(默认)
‘w’ 以写入的方式打开文件,会覆盖已存在的文件
‘a’ 以写入模式打开,如果文件存在,则在末未追加写入
‘x’ 如果文件已存在,使用此模式会引起异常
‘b’ 以二进制模式打开文件
‘t’ 以文本模式打开文件(默认)
‘+’ 可读写模式(可添加到其他模式中使用)
‘U’ 通用换行符支持

以上表格来源于由小甲鱼 编著 由 清华大学出版社 出版的《零基础入门学习 Python》 小甲鱼工作室网站https://ilovefishc.com/ 里面有很多教程,着力推荐一下

可以看到若我们想用二进制打开图像文件,只需将’b’传递给mode参数,就好了

当然,如果你这么写

open(filePath,"b")

那你只会收到一个大大的错误提示,



从提示中我们可以看出我们必须有个“写入”、“只读”这样的模式加上去

所以我们在”b”模式上叠加个只读模式”r”,也就这么写了

open(filePath,"rb")

这样我们使用open()成功打开了一个文件之后,它就会返回个文件对象,有了这个文件对象,我们就可以读取或修改这个文件。

文件对象操作的方法就不在这里说了,大家可以去看看有关python文件操作的资料

回到正题,需要注意的是open了文件,在最后需要close文件,当然python会自动关闭文件,但是良好的代码习惯是一劳永逸的,所以一定记住close()来关闭文件

这是也许你会产生疑问了,我看你上面的代码也没close()啊,啧啧,你叫别人养成良好代码习惯,自己呢?

听到你这句话,我就只能一笑而过了。在你发现我代码中没写close()的时候,你也一定会发现代码中有些别样的东西,对那就是 With 语句

with open(filePath,"rb") as f: 

很多开发者都会觉得又要打开文件,又要关闭文件的很麻烦,这样重复的事能不能简化下啊

python关注到了广大开发者的心声,于是在python v2.5+版本中加入了 with 语句

使用了with语句,可以大大减少代码量,你也无需担心忘记关闭文件了,因为with语句会帮你自动关闭。

回到代码,很明显我们将eee.jpg这个文件赋予给了f,于是我们可以对f这个文件对象进行一系列的操作

为了将二进制文件转化成BASE64格式,我们不得不引入一个模块,那就是“base64”模块,这通俗易懂

在此模块中我们可以将二进制格式转化为BASE64格式

import base64

base64_data = base64.b64encode(f.read())

f.read()函数就是读取出了f这个文件对象中所蕴含的数据,然后使用base64.b64encode()函数进行编码,则完成了BASE64化

完成了BASE64化,如果直接post的话,因为图像数据的格式是URL不能接受的,所以我们又要转化下字符串的文字编码

image = str(base64_data,'utf-8')

这样的话,我们就能成功的把图像数据上传至百度服务器了

看看效果



和使用URL获取的一样的数据,同样的,需要什么数据取出就好了

贴出源码

from aip import AipFace
import base64
""" 你的 APPID AK SK """
APP_ID = 'XXXXXX'
API_KEY = 'XXXXXXXXXXXXXXXX'
SECRET_KEY = 'XXXXXXXXXXXXXXXXXXX'

client = AipFace(APP_ID, API_KEY, SECRET_KEY)

filePath ="eee.jpg"
with open(filePath,"rb") as f:  
# b64encode是编码
    base64_data = base64.b64encode(f.read())
image = str(base64_data,'utf-8')
imageType = "BASE64"

#参数设置
options = {}
options["face_field"] = "age,beauty"
options["max_face_num"] = 1
options["face_type"] = "LIVE"

""" 调用人脸检测 """
result = client.detect(image, imageType,options);
print(result)

你可能感兴趣的:(人脸识别)