Python在七牛云平台的应用(三)简单的人脸识别
前言
这是最后一篇介绍python在七牛云平台的应用了,因为-前两篇文章第一篇分享了怎么安装七牛的官方库以及怎么对自己的空间进行下载上传,删除等行动.而第二篇则分享了怎么利用七牛的API接口,由于七牛的接口方式几乎差不多,所以不再对七牛的各个SDK进行测试了,像是物体识别,格式转换等等很实用的功能.有兴趣的朋友可以分享下自己的经验.而这最后一篇介绍七牛主要是来讲述怎么用urlbase64编码链接.以及怎么得到一些API回传的JSON格式的数据.这样几乎七牛的所有API都可以使用了.
背景介绍
当前,人脸识别应用于许多领域.如支付宝的用户认证.许多的能识别人心情的AI,也就是人的面部表情.还有能分析人的年龄等等.而这里面有着许多的难度.在这里我想要分享的是一个利用七牛SDK简单的实现人脸识别的方法.当然七牛的SDK中提供了很多的拓展,在返回的JSON中包含着如年龄等信息,这里就不进行分享了.这里我们要使用的是七牛云平台中由阅面科技提供的API.
以下为官方给出的功能:
- 人脸1v1比对
- 人脸关键点(106点)
- 人脸属性(年龄,性别)
我们要用的服务就是第一个:人脸1v1比对
需求分析
1.要做安全方面的内容,依靠人脸识别通过和库中的脸比对后判定相似率来验证用户身份.
2.快速从图片中识别出人的信息,用于寻人功能等.
其实从安全的角度出发有很多可以囊括的.比如智能家居中的刷脸开门,支付软件的刷脸支付等都是例子.
人脸特征提取的步骤
真正的人脸识别需要很多的知识,大体上粗略的可以分为以下步骤:
1.人脸检测(从图片中找到人脸):返回人脸位置和大小的参数
2.人脸特征定位:一般69点或者106个点对人脸的特征定位,技术上有Adaboost&haar,以及MSRA的alignment.
3.人脸特征归一化(几何归一/灰度归一):前者对图像进行仿射变化使得不同的脸可以进行比对.后者则能使图像展现更多的细节以及减弱光线光照的应用.
4.特征提取-特征后期融合(基于特征近似度的多特征融合)
5.特征距之间的距离来比对相似度. 三氏距离(马氏 欧氏 巴氏)
(以上根据以前查到整理的资料得出,可能会存在认识错误)
可以看出如果直接对人脸进行分析是很复杂的,而现在也有很多成熟的人脸识别库,像是有名的OpenCV ,OpenBR,还有国产的Seeta Face engine等等很多,这里就先不介绍了,而利用开源云平台的API可以使我们的工作量更加的小.
优点*缺点
优点: 应用七牛云平台的API对于使用者的能力要求较低,开发速度很快,只要输入/返回即可.但更加适用于移动端
缺点:由于七牛云要求每张图片要先上传到bucket中才可以利用API对人脸匹配再返回,这很大程度依赖于用户的网络带宽,可能当用户网络不好的情况下需要很久的时间才能得到返回结果,所以要经过压缩处理。经过我的测试,一般识别的较为准确最多可将图片压缩至25kb左右,这个大小在当今的网络来看上传还是可以接受的.
使用七牛API的接口准备
这里需要第一篇博文中的操作七牛云空间的方法->Python在七牛云平台的应用(一) (传送门)
以及上一篇博文(第二篇)中分享的requests库的使用->Python在七牛云平台的应用(二)图片瘦身 (传送门)
我们需要用到的有qiniu库的上传/鉴权命令.以及requests库得到处理后的图像,以及json库得到返回给我们的保存在JSON中的信息.
另外七牛的这个接口和图片瘦身接口一样也是要付钱的,具体的价格根据官方给的是(人脸识别对比服务->¥1.5/1000次)可以先向账户充入¥2避免无法使用服务.
解决问题的步骤
为了简化这个问题,所以本实例仅凸显上传->识别->返回结果的过程,对于如何通过电脑摄像头取像,窗体制作仅提供方法和思路不进行详细分享.
首先,我们先分析七牛云中这个API的接口
http://xxx.xxx.glb.clouddn.com/xxx.jpg?face-analyze/verification/url/<urlSafeBase64URI>
<!-- 人脸一对一比对API-->
我们来分析下这个接口:前面的
http://xxx.xxx.glb.clouddn.com/xxx.jpg 是我们刚刚上传的人像图片的链接地址
?face-analyze/verification/url/<urlSafeBase64URI> 是API的接口,其中我们将最后的这句
<urlSafeBase64URI>单独拿出来说,因为这个的意思是要将我们用于人像比对的标准人像图片的地址经过urlbase64加密后的地址信息
所以我们要进行如下的步骤:
1)得到我们刚刚通过摄像头取得的人像
2)对我们的人像图片进行压缩
3)上传我们的人像图片到我们的bucket中(这里要申明一点,七牛所有支持的API都要求文件在华东的Bucket下)
4)得到我们上传的图片的链接地址
5)对链接进行urlbase64加密(这里只要import python的base64库即可)
6)请求API
7)得到网页的JSON格式数据
8)通过JSON库对数据进行分析
9)判断人脸的相似度是否符合,输出结果
10)删除Bucket中上传的临时图片
返回的JSON格式分析
{"status":"ok","confidence":0.73065597}
我们可以看到返回的JSON信息很简单,status的意思是成功和不成功,而confidence则是相似度,所以我们对返回的信息进行分析会很简单.
status如若成功则为ok,不成功则为invalid
人脸相似度的判断
| 编号 | 对比样本 | 相似度 |
|
1 |
杨幂的生活照 |
0.73065597 |
|
2 |
整容成杨幂的女性图片 | 0.4544274 |
|
3 |
其他女星图片 | 0.6007395 |
|
4 |
男星图片 | 0.17771657 |
上表中所用的图片都来自己互联网,从表数据我们可以大致将本人的相似度以0.7位分界线.不过有趣的是,不知道为什么按杨幂进行整容的为什么相似度竟然低于杨幂和范冰冰的相似度(其他女星照的图片为范冰冰的人像),不同性别的相似度差异明显,所以就粗略的根据表格定为>0.7即可认为是本人
安装所需的库
在python中,我分享的这个例子总共需要引入6个库
#import SDK
from qiniu import Auth,put_file,etag
import qiniu.config
import requests
import base64
import json
from PIL import Image
import os
其中qiniu的库安装方法请看第一篇博客->Python在七牛云平台的应用(一) (传送门)
requests库,json库,PIL库请自行安装
base64库和OS库为自带所以无需安装
(由于电脑已经安装了较多库,所以对于这些库是否为自带也记得不太清楚,如果出现了错误,请大家对应自己安装)
程序的实现
请见下方的代码,采集到的人脸为face.jpg(这里用了杨幂的两张图片作为示例)
#七牛云"人脸识别"功能的python实现方法:by xlxw
#请得到自己的Secret和Access key用于上传图片到空间中进行处理
#人像识别是七牛云的一项收费项目,价格为 ¥1.5/1000次 测试时请先存2元避免意外 #import SDK
from qiniu import Auth,put_file,etag
import qiniu.config
import requests
import base64
import json
from PIL import Image
import os #上传
def upload(bucket,path,filename,key,url):
token = key.upload_token(bucket, filename, 3600)
print('正在上传..')
reform,inform = put_file(token, filename, path)
if reform != None:
print('已经成功地将{}->>{}'.format(filename,bucket))
print("正在处理您的图片...")
url=url + '/' + filename
path=path.split('/')[-1]
else:
print('这里出现了一个小错误.无法上传..') #调用API
def apiget(urlbucket,url):
try:
url=urlbucket + '/001.jpg' + '?face-analyze/verification/url/' + url
#标准对比的图片地址,名称为001.jpg
r=requests.get(url)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
print("网络发生故障,请重试..") #base64 Encode
def base64encode(url):
try:
print("正在加密链接..")
enurl=base64.urlsafe_b64encode(bytes(url, "utf-8"))
print("加密完成")
enurl=str(enurl)
enurl=enurl.split("'")[1]
return enurl
except:
print("这里出现了一个问题,请重试..") #PIL 图片压缩
def pilresize(per,path):
im=Image.open(path)
imsize=im.size
sizex=int(imsize[0]*per)
sizey=int(imsize[1]*per)
im=im.resize((sizex,sizey))
im.save('trans.jpg','JPEG')
print('图片压缩完成,输出成功')
print('{}->>({},{})'.format(imsize,sizex,sizey)) def pilwork(path):
try:
size=os.path.getsize(path)
size = float(size)
kb=size/1024
per=10/kb
pilresize(per,path)
except:
print("请检查您的地址是否输入错误") #JSON分析
def jsonanal(jtext):
print("正在分析,请稍后..")
rj=json.loads(jtext)
stat=rj['status']
confi=rj['confidence']
return stat + ',' +str(confi) #主体
def main():
#填写你的 AK 和 SK
accesskey = input('请输入您在七牛云的AccessKey:')
secretkey = input('请输入您在七牛云的SecretKey:') #鉴定身份
keyq=Auth(accesskey,secretkey) #所要操作的空间
bucketname =input("请输入要操作的空间(公开)名字:") #所要操作空间的外链地址
urlbucket = input("请输入空间所绑定的域名或者默认外链地址:") #判定操作类型
while 1:
order=input('请输入你需要进行的操作:')
mode=order.split(' ')[0]
if mode == '识别':
path=order.split(' ')[1]
fname=path.split('/')[-1:][0]
unrl=urlbucket+'/trans.jpg'
print('正在压缩图片.请稍后..')
#调用函数
pilwork(path) #压缩图片
print("正在上传token,请稍后..")
upload(bucketname,'./trans.jpg','trans.jpg',keyq,urlbucket) #上传文件
enurl=base64encode(unrl) #base64加密
jtext=apiget(urlbucket,enurl) #调用七牛api并得到返回的json数据
result=jsonanal(jtext) #分析返回的json,得到最终相似度
if result.split(',')[0] == 'invalid':
print('识别发生了错误')
else:
if eval(result.split(',')[1]) >= 0.7:
print("识别成功,鉴定为本人,相似度为{:.1f}".format(eval(result.split(',')[1])*100))
else:
print("识别成功,鉴定不是本人,相似度过低")
if mode == '退出':
print("欢迎您的使用..")
break #终端提示显示
print("+----------------------------------------+")
print("| 欢迎使用七牛的人脸识别功能 |")
print("+----------------------------------------+")
print("|本程序须知: |")
print("|1.本程序测试图片为杨幂的人像,见face.jpg |")
print("|2.您需要提供服务的Accesskey,Secretkey |")
print("|3.您需要提供 bucket名字和bucket外链地址 |")
print("+----------------------------------------+")
print("|使用方法: |")
print("|1.识别输入格式: 识别 图片位置(包括后缀)|")
print("|2.退出输入格式: 退出 |")
print("+----------------------------------------+")
main()
程序运行的截图:

用到的杨幂的两张照片为:(均来自百度图片)
(用于比对的标准人像图片)(已用PIL压缩 x*0.3,y*0.3)

用于比对的图片:(未压缩)

总结和拓展:
总结:
和大家分享七牛的API差不多结束了(说不定以后有更好玩的API也会拿来分享经验).所有的七牛的API都可以用这三篇文章的内容进行调用,七牛还有许多优秀方便的API可以方便我们的使用.在这期间也学习到了很多的知识,比如许多库的熟悉掌握,像是requests库,bs4库,json库当然还有主角Qiniu库.
拓展:
可以用python的QT库开发图形界面,而VideoCapture库可用来调用电脑的摄像头进行拍照,然后经过本文的方法就能实现简单的人像识别了(你需要上传标准图片到qiniu的bucket里)
可另外再加入一些标准图片,如低光,不戴眼镜等等的图片,然后设计一个评判算法来适应各种各样的情况.本文就不再进行拓展,有兴趣的朋友可以试试.
Python在七牛云平台的应用(三)简单的人脸识别的更多相关文章
- Python在七牛云平台的应用(二)图片瘦身
(一)七牛云平台的图片瘦身功能简介:(引用自官网) 针对jpeg.png格式图片 瘦身后分辨率不变,格式不变. 肉眼画质不变. 图片体积大幅减少,节省 CDN 流量 官网给的图片压缩率很高,官网给的「 ...
- Python在七牛云平台的应用(一)
七牛云:(引用百度的介绍)七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化PaaS服务.围绕富媒体场景,七牛先后推出了对象存储,融合CDN加速,数据通用处理,内容反垃圾服务,以及直 ...
- Python实现七牛云视频播放
这篇文章是使用Python的Web框架Django Rest Framework来提供视频相关的api接口,主要功能包括视频上传.视频转码.视频访问授权.删除视频文件.视频截图功能. 七牛云上的基本概 ...
- python三步实现人脸识别
原文地址https://www.toutiao.com/a6475797999176417550 Face Recognition软件包 这是世界上最简单的人脸识别库了.你可以通过Python引用或者 ...
- 10分钟手把手教你运用Python实现简单的人脸识别
欲直接下载代码文件,关注我们的公众号哦!查看历史消息即可! 前言:让我的电脑认识我 我的电脑只有认识我,才配称之为我的电脑! 今天,我们用Python实现高大上的人脸识别技术! Python里,简单的 ...
- python+ueditor+七牛云存储整合
开发环境:python pyramid. 參考网址:http://developer.qiniu.com/docs/v6/sdk/python-sdk.html,http://my.oschina.n ...
- 简单机器学习人脸识别工具face-recognition python小试,一行代码实现人脸识别
摘要: 1行代码实现人脸识别,1. 首先你需要提供一个文件夹,里面是所有你希望系统认识的人的图片.其中每个人一张图片,图片以人的名字命名.2. 接下来,你需要准备另一个文件夹,里面是你要识别的图片.3 ...
- 人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型
人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型 经过前面稍显罗嗦的准备工作,现在,我们终于可以尝试训练我们自己的卷积神经网络模型了.CNN擅长图像处理,keras库的te ...
- Python 3.6.3 利用Dlib 19.7库进行人脸识别
0.引言 自己在下载dlib官网给的example代码时,一开始不知道怎么使用,在一番摸索之后弄明白怎么使用了: 现分享下 face_detector.py 和 face_landmark_detec ...
随机推荐
- 20145316许心远《网络对抗》EXP8 Web基础
实验后回答问题 什么是表单 来自百度百科的官方定义:表单在网页中主要负责数据采集功能.一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法. ...
- INNODB引擎概述
INNODB存储引擎的历史概述: INNODB存储引擎是OLTP应用中核心表的首选存储引擎. INNODB存储引擎包含在所有mysql数据库的二进制发行版本中.早期其版本随着mysql数据库的更新而更 ...
- VM三种网络连接方式
bridge:这种方式最简单,直接将虚拟网卡桥接到一个物理网卡上面,和Linux下一个网卡 绑定两个不同地址类似,实际上是将网卡设置为混杂模式,从而达到侦听多个IP的能力. 在此种模式下,虚拟机内部的 ...
- mongodb 最佳可视化工具mongobooster
最好用的mongodb GUI工具 mongobooster,没有之一,可从https://mongobooster.com/下载 常见管理命令可参考,http://www.cnblogs.com/l ...
- C++设计模式 之 “对象创建”模式:Factory Method、Abstract Factory、Prototype、Builder
part 0 “对象创建”模式 通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式 Fact ...
- PHP中private和public还有protected的区别
原文链接:http://www.thinkphp.cn/code/1898.html <? //父类 class father{ public function a(){ echo " ...
- 20145309李昊《网络对抗技术》实验9 web安全基础实践
本实验在同学帮助下完成 一.实验准备 1.0 实验目标和内容 Web前端HTML.能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. Web前 ...
- 20145322 《网络对抗》 MSF基础应用1
20145322何志威 Exp5 MS08_067漏洞测试 实验问答 什么是exploit.payload.encode exploit:通过一个漏洞对程序进行攻击的过程 payload:有具体功能作 ...
- 20135234mqy-——信息安全系统设计基础第二周学习总结
Linux基础 1.Linux命令 command [options] [arguments] //中括号代表是可选的,即有些命令不需要选项也不需要参数 选项(options)或参数(argument ...
- 质量管理三个概念:QC、QA和QM,你能分得清吗?
今天这里谈的QC.QA和QM,不是岗位或职位,而是一种概念或质量管理的不同时期所关注的重点. 1.产品 早期的质量管理(工业化雏形期)侧重于对终产品的检测.测试,即QC(品质控制)时代. 这个时期的质 ...