动手实操:如何用 Python 实现人脸识别,证明这个杨幂是那个杨幂?
当前,人脸识别应用于许多领域,如支付宝的用户认证,许多的能识别人心情的 AI,也就是人的面部表情,还有能分析人的年龄等等,而这里面有着许多的难度,在这里我想要分享的是一个利用七牛 SDK 简单的实现人脸识别的方法,当然七牛的 SDK 中提供了很多的拓展,在返回的 JSON 中包含着如年龄等信息,这里就不进行分享了。这里我们要使用的是七牛云平台中由阅面科技提供的 API。
以下为官方给出的功能:
- 人脸 1v1 比对
- 人脸关键点(106 点)
- 人脸属性(年龄,性别)
我们要用的服务就是第一个:人脸 1v1 比对
需求分析
要做安全方面的内容,依靠人脸识别通过和库中的脸比对后判定相似率来验证用户身份。
快速从图片中识别出人的信息,用于寻人功能等。
其实从安全的角度出发有很多可以囊括的。比如智能家居中的刷脸开门,支付软件的刷脸支付等都是例子。
人脸特征提取的步骤
真正的人脸识别需要很多的知识,大体上粗略的可以分为以下步骤:
1.人脸检测(从图片中找到人脸):返回人脸位置和大小的参数。
2.人脸特征定位:一般 69 点或者 106 个点对人脸的特征定位,技术上有 Adaboost&haar,以及 MSRA 的 alignment。
3.人脸特征归一化(几何归一/灰度归一):前者对图像进行仿射变化使得不同的脸可以进行比对,后者则能使图像展现更多的细节以及减弱光线光照的应用。
4.特征提取-特征后期融合。(基于特征近似度的多特征融合)
5.特征距之间的距离来比对相似度、三氏距离。(马氏、欧氏 、巴氏)
(以上根据以前查到整理的资料得出,可能会存在认识错误)
可以看出如果直接对人脸进行分析是很复杂的,而现在也有很多成熟的人脸识别库,像是有名的 OpenCV ,OpenBR,还有国产的 Seeta Face engine 等等很多,这里就先不介绍了,而利用开源云平台的 API 可以使我们的工作量更加的小。
七牛云 API 的优点
应用七牛云平台的 API 对于使用者的能力要求较低,开发速度很快,只要输入/返回即可,但更加适用于移动端。
操作过程中的注意事项
- 每张图片要先上传到 bucket 中才可以利用。
- API 对人脸匹配再返回很大程度依赖于用户的网络带宽。
- 当用户网络不好的情况下需要很久的时间才能得到返回结果。
- 要经过压缩处理,一般识别的较为准确最多可将图片压缩至 25 kb 左右。
使用七牛 API 的接口准备
我们需要用到的有 Qiniu 库的上传/鉴权命令,以及 requests 库得到处理后的图像,以及 json 库得到返回给我们的保存在 JSON 中的信息。
另外七牛的这个接口和图片瘦身接口一样也是要付钱的,具体的价格根据官方给的是(人脸识别对比服务 ->¥1.5/1000次 )可以先向账户充入 ¥2 避免无法使用服务。
解决问题的步骤
为了简化这个问题,所以本实例仅凸显 上传->识别 ->返回结果 的过程,对于如何通过电脑摄像头取像,窗体制作仅提供方法和思路不进行详细分享。
首先,我们先分析七牛云中这个 API 的接口 :
http://xxx.xxx.glb.clouddn.com/xxx.jpg?faceanalyze/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。
人脸相似度的判断
上表中所用的图片都来自己互联网,从表数据我们可以大致将本人的相似度以 0.7 为分界线。不过有趣的是,不知道为什么按杨幂进行整容的为什么相似度竟然低于杨幂和范冰冰的相似度(其他女星照的图片为范冰冰的人像),不同性别的相似度差异明显,所以就粗略的根据表格定为 >0.7 即可认为是本人。
安装所需的库
在 python 中,我分享的这个例子总共需要引入 6 个库
#import SDK
from qiniu import Auth,put_file,etag
import qiniu.config
import requestsimport base64
import json
from PIL import Image
import os
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, )
print('正在上传..')
reform,inform = put_file(token, filename, path)
if reform != None:
print('已经成功地将{}->>{}'.format(filename,bucket))
print("正在处理您的图片...")
url=url + '/' + filename
path=path.split('/')[-]
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("'")[]
return enurl
except:
print("这里出现了一个问题,请重试..") #PIL 图片压缩
def pilresize(per,path):
im=Image.open(path)
imsize=im.size
sizex=int(imsize[]*per)
sizey=int(imsize[]*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/
per=/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 :
order=input('请输入你需要进行的操作:')
mode=order.split(' ')[]
if mode == '识别':
path=order.split(' ')[]
fname=path.split('/')[-:][]
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(',')[] == 'invalid':
print('识别发生了错误')
else:
if eval(result.split(',')[]) >= 0.7:
print("识别成功,鉴定为本人,相似度为{:.1f}".format(eval(result.split(',')[])*))
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 压缩 x0.3,y0.3)
(用于比对的图片)
总结和拓展
总结
和大家分享七牛的 API 差不多结束了(说不定以后有更好玩的 API 也会拿来分享经验)。七牛还有许多优秀方便的 API 可以方便我们的使用.在这期间也学习到了很多的知识,比如许多库的熟悉掌握,像是 requests 库、bs4 库、 json 库当然还有主角 Qiniu 库。
拓展
可以用 python 的 QT 库开发图形界面,而 VideoCapture 库可用来调用电脑的摄像头进行拍照,然后经过本文的方法就能实现简单的人像识别了(你需要上传标准图片到 Qiniu 的 bucket 里)。
可另外再加入一些标准图片,如低光,不戴眼镜等等的图片,然后设计一个评判算法来适应各种各样的情况.本文就不再进行拓展,有兴趣的朋友可以试试。
推荐阅读
报名方式:有更多有趣的作品分享给大家?扫描上方二维码和美女队长接头,即可成为【动手实操】系列玩家。
动手实操:如何用 Python 实现人脸识别,证明这个杨幂是那个杨幂?的更多相关文章
- 使用OpenCV和Python进行人脸识别
介绍 人脸识别是什么?或识别是什么?当你看到一个苹果时,你的大脑会立刻告诉你这是一个苹果.在这个过程中,你的大脑告诉你这是一个苹果水果,用简单的语言来说就是识别.那么什么是人脸识别呢?我肯定你猜对了. ...
- 动手实操(一):如何用七牛云 API 实现相片地图?
实操玩家: 在苹果手机上,我们只要打开定位服务,拍照后便能在相簿中找到地图,地图上显示着在各地拍摄的相片.网站上这种显示方式也并不少见,例如 Flickr.即将关闭的 Panoramio 等. 作为地 ...
- 手把手教你如何用 OpenCV + Python 实现人脸识别
下午的时候,配好了OpenCV的Python环境,OpenCV的Python环境搭建.于是迫不及待的想体验一下opencv的人脸识别,如下文. 必备知识 Haar-like 通俗的来讲,就是作为人脸特 ...
- 「Python」人脸识别应用
人脸识别主要步骤: face_recognition 库的安装 安装此库,首先需要安装编译dlib,此处我们偷个懒,安装软件Anaconda(大牛绕过),此软件预装了dlib. 安装好后,我们直接通过 ...
- 用Python进行人脸识别
本文的模型使用了C++工具箱 dlib 基于深度学习的最新人脸识别方法,基于户外脸部数据测试库Labeled Faces in the Wild 的基准水平来说,达到了99.38%的准确率. dlib ...
- python通过人脸识别全面分析好友,一起看透你的“朋友圈”
微信:一个提供即时通讯服务的应用程序,更是一种生活方式,超过数十亿的使用者,越来越多的人选择使用它来沟通交流. 不知从何时起,我们的生活离不开微信,每天睁开眼的第一件事就是打开微信,关注着朋友圈里好友 ...
- 一种基于python的人脸识别开源系统
今天在搜索人脸识别的文章时,无意中搜到一个比较开源代码,介绍说是这个系统人脸的识别率 是比较高的,可以达到:99.38%.这么高的识别率,着实把我吓了一跳.抱着实事求是的态度.个人 就做了一些验证和研 ...
- python opencv3 人脸识别的例子
一个人脸识别的例子 程序中用到了公共数据集, 欢迎去我的git上下载源码,源码里带有数据集 git:https://github.com/linyi0604/Computer-Vision 脚本中一个 ...
- opencv python训练人脸识别
总计分为三个步骤 一.捕获人脸照片 二.对捕获的照片进行训练 三.加载训练的数据,识别 使用python3.6.8,opencv,numpy,pil 第一步:通过笔记本前置摄像头捕获脸部图片 将捕获的 ...
随机推荐
- 521 Longest Uncommon Subsequence I 最长特殊序列 Ⅰ
给定两个字符串,你需要从这两个字符串中找出最长的特殊序列.最长特殊序列定义如下:该序列为某字符串独有的最长子序列(即不能是其他字符串的子序列).子序列可以通过删去字符串中的某些字符实现,但不能改变剩余 ...
- 用IARIdePm新建STM8工程步骤
IARdePm 如何新建工程及其调用库函数1.新建文件夹,例如,新建文件夹名字(不能为中文)为:Lib_test_GPIO_OUT2.新建工程,Create New Project...,选择Empt ...
- mybatis generator 整合lombok
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration ...
- lock和synchronized的同步区别与选择
1. lock是一个接口,而synchronized是java的一个关键字,synchronized是内置的语言实现:(具体实现上的区别在<Java虚拟机>中有讲解底层的CAS不同,以前有 ...
- [BZOJ1968][AHOI2005]COMMON约数研究 数学
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1968 直接计算每个因子的贡献就可以了. $Ans=\sum_{i=1}^n[\frac{n ...
- NSString 与NSMutableString的区别
NSString 与NSMutableString的区别 Suppose You have a code like this NSString *s = [[NSString alloc] ...
- java实现排序的几种方法
package com.ywx.count; import java.util.Scanner; /** * 题目:排序的几种方式(汇总及重构) * @author Vashon(yangwenxue ...
- vue-cli下面的config/index.js注解 webpack.base.conf.js注解
config/indexjs详解上代码: 'use strict' // Template version: 1.3.1 // see http://vuejs-templates.github.io ...
- 记一次mysql优化操作
这次操作,起因是需要获取用户来源及用户性别,而用户的性别信息在第三方授权的中有,存为JSON格式, 不想用php去解析获取,所以试试mysql操作 如果你有更好的解决方案,请留言告诉我! 情景简化 表 ...
- hasOneOf # if (data.otherDescArr.some(_ => '7'.indexOf(_) > -1)) {
if (data.otherDescArr.some(_ => '7'.indexOf(_) > -1)) { export const hasOneOf = (targetarr, ar ...