百度人脸识别–人脸对比
主要是调用百度的接口,调用方法如下:
- HTTP方法:POST
- 请求URL :https://aip.baidubce.com/rest/2.0/face/v3/match
URL参数:access_token,通过API Key和Secret Key获取的access_token,参考“Access Token获取”
Header:Content-Type:application/json
- 请求参数:
说明:两张图片的上传使用json格式,如下:
1 | [ |
在调用接口之前,需要编写一个压缩图片的方法,因为以上接口对图片大小有限制。
压缩图片代码:
1 | from PIL import Image |
人脸对比接口调用完整代码:
1 | import requests |
score表示上传的两张图人脸相似度评分,face_token是两张图片的唯一标识,不同的人脸图片返回的标识不同,同一张图片多测检测返回的标识相同。如果程序无法返回正确结果,可以参照百度文档中的错误码,来修改程序中存在的问题。
如果需要安装百度aip模块,安装命令为pip install aip,如果遇到超时,使用以下命令pip install baidu-aip -i https://pypi.douban.com/simple
。
本质上,本次人脸识别接口学习调用已经完成了,但是我想创建一个简单的web应用,在网页中打开相应的页面选择上传两张图片,然后进行检测,所以就有了下半部分内容。
Flask 上传文件
文件上传的基本原理实际上很简单,基本上是:
- 一个带有
enctype=multipart/form-data
的<form>
标记,标记中含有 一个<input type=file>
。 - 应用通过请求对象的
files
字典来访问文件。 - 使用文件的
save()
方法把文件 永久地保存在文件系统中。
web应用简单地分为前端和后端。
- 前端页面:
1 |
|
因为不是做前端的,这方面实在不擅长,页面很丑,不想花过多时间去编写css,只想要达到基本的功能就Ok 了。这段代码里面还对上传的文件格式做了一定的限制(其实并没有真的限制到),也对文件的大小做了一定的限制,但是因为我们后端写了一个压缩图片的功能,所以支持上传任意大小的图片,所以注释了这部分;此外,还利用FileReader对文件的信息进行了获取。
效果图如下:
后端逻辑:
点击提交后,图片信息会被后台获取,我们要在后台做一些操作,主要是获取文件信息,保存到本地目录,然后调用上面封装的人脸识别类,进行对比,最后将识别结果显示在页面中。完整代码(index.py)如下:
1 | from flask import Flask |
render_template(),Flask默认到templates目录下查找模板文件,在index.py同级目录下,新疆templates文件夹,在里面创建需要的html文件。
upload_files(),先判断是否为post请求,然后利用请求对象的files字典来访问文件,文件的key值对应前端
<input>的name属性
,获取文件filename之后利用save()方法保存。os.path,为了让程序更易于迁移,这里使用了python的os模块来设置文件保存路径;
os.path.sep
路径分隔符os.path.curdir
指代当前目录(‘.’)os.oath.pardir
指代上一级目录(‘..’)上面代码中
os.path.curdir+os.path.sep+'uploads'+os.path.sep
在windows中表示的目录是.\\uploads\\
,所以在我们程序的同级目录下需要有一个uploads文件夹,这个不会自动生成!url_for(),操作对象是函数,而不是route里的路径,比如这里跳转到compress_face()函数,并且可以传递参数,传递的参数要在函数的route()里面用”<参数>”括起来,路径要保证合法性。
- uploaded_file(),用来将本地文件在浏览器中显示。
- compress_face(),获取上传的文件保存后的地址,读取图片信息,调用上面封装的人脸识别的类的方法,返回相似度(score),然后显示在浏览器中。