原文首发在 LookCos的博客 https://lookcos.cn/?p=211
原创内容 未经允许不得以任何形式转载本文,否则必追究其责任。
0X000 前言:
近些年,人工智能真是火爆的不行。什么可以叫人工智能,今天咱们就来蹭一下热度,用Python简单的实现在线人脸识别系统。我从去年年底接触Python,一直用于写一些简单爬虫,最近几天对这个感兴趣,就临时查了一下Flask和百度SDK的文档花了几天写了一个,分享出来,可能写的比较仓促,有一些漏洞,希望大家多多包涵,共同进步!
0X001 思路:
用户打开网站后只需要上传文件点击提交即可完成人脸识别,出现结果!
语言:Python ,WEB框架使用轻量级的Flask,使用百度人脸识别SDK(听说百度训练了200W人2亿张照片,用它何乐而不为呢,既然都选择了Python,难不成再造一个大轮子?勿喷勿喷.),模板随便从网上找了一个自适应的!
0X002 实现后效果:
一点说明: 此模板自适应,手机用户打开可以点击“1.选择文件” 进行上传,电脑用户可以拖拽上传,也可以选择上传。
自动过滤非图片文件,PHP压缩包等乱七八糟的格式,再说谁会在服务器上装PHP呢?是不是?
看一下识别结果图片: 更多的请到项目地址查看效果图,或者自己尝试
这张图片有个错别字,我现在已经在代码中改过来了,由于篇幅限制,更多的就自己测试吧!
但是如果提交一些非法的文件呢(脚本小子可能会试试php,asp等)?
0X003 实现代码:
先来看一下目录结构:
│ baidu_aip.py #调用百度人脸识别
│ cb.py # Flask 主页,引导页!
├─static #静态文件存放
│ ------ favicon.ico
│ ------ filedrag.js
│ ------ jquery.min.js
│ ------ style.css
└─templates #模板文件
| ------ ------ index.html #主页模板
|------ ------ res.html #结果页模板
|------ ------ tz.html #跳转页面模板
咱们来着重说一下 两个Py文件(第一个是baidu_aip,第二个是cb),其他统一到github下载(欢迎来个Star)!
项目地址:https://github.com/LookCos/pyai
# -*- coding: utf-8 -*- import base64 from aip import AipFace def aip_client(image_path): """ 你的 APPID AK SK """ #请到http://ai.baidu.com 通过创建人脸识别应用来获取 APP_ID = '你的ID' API_KEY = '你的KEY' SECRET_KEY = '你的KEY' client = AipFace(APP_ID, API_KEY, SECRET_KEY) imageType = "BASE64" options = {} options["face_field"] = "age,beauty,face_shape,gender,glasses,race,expression" #需要检测的参数 options["max_face_num"] = 1 #默认检测图中最大的那张脸盘 options["face_type"] = "LIVE" """ 带参数调用人脸检测 """ with open(image_path, "rb") as f: #二进制读入 img = base64.b64encode(f.read()) #b64编码 image = str(img,'utf-8') res_all = client.detect(image, imageType, options) #返回一个json结果,包含你需要它检测的信息 msg_list = [] error_code = res_all['error_code'] #从返回的结果中解析出错误代码 msg_list.append(str(error_code)) if int(error_code) == 0: #如果返回的错误代码为0即识别成功,则进一步解析信息 error_msg = res_all['error_msg'] #获取错误信息 res_all_temp = res_all['result']['face_list'][0] age = res_all_temp['age'] #获取检测年龄 msg_list.append(str(age)) race = res_all_temp['race']['type'] #获取肤色 msg_list.append(race) beauty = res_all_temp['beauty'] #获取颜值 msg_list.append(str(beauty)) glasses = res_all_temp['glasses']['type'] #获取是否佩戴眼镜 msg_list.append(glasses) face_shape = res_all_temp['face_shape']['type'] #获取脸型 msg_list.append(face_shape) gender = res_all_temp['gender']['type'] #获取性别 msg_list.append(gender) expression = res_all_temp['expression']['type'] #获取表情 msg_list.append(expression) return msg_list #返回一个列表 包含 性别年龄等信息 return "1" #如果未能识别人脸则返回错误代码1
其中用到的 接口密钥等信息请到 http://ai.baidu.com 通过创建人脸识别应用来获取
下面是 cb.py文件的代码
# -*- coding: utf-8 -*- import os from baidu_aip import * #刚刚我们创建的 from werkzeug.utils import secure_filename from flask import Flask, flash, request, redirect, url_for,render_template UPLOAD_FOLDER = 'static' ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg']) #允许的文件集合 app = Flask(__name__) app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER @app.route('/upload', methods=['GET', 'POST']) def upload(): if request.method == 'POST': #如果是post方式,则执行 # 检查POST请求是否有文件部分 if 'fileselect[]' not in request.files: flash('No file part') return redirect(request.url) file = request.files['fileselect[]'] # 如果用户不选择文件, # 如果点击了提交但是没有文件 if file.filename == '': flash('没有选择到文件') #Flask消息闪现 return redirect(request.url) if file and allowed_file(file.filename): #如果有文件且符合标准 filename = secure_filename(file.filename) #获取文件名字 file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) #获取当前路径并组装路径,且对前者合成地址进行保存 msg_all = aip_client(str(os.path.join(app.config['UPLOAD_FOLDER'], filename))) #调用写好的人脸识别 #通过返回信息判断 表情 眼镜,肤色,年龄等信息 if int(msg_all[0]) == 0: msg_all[0] = "成功" if msg_all[7] =='none': msg_all[7] = "面无表情" elif msg_all[7] == 'smile': msg_all[7] = '微微一笑很倾城' else: msg_all[7] = '看起来挺开心' if msg_all[4] == 'sun': msg_all[4] = '墨镜' elif msg_all[4] == 'common': msg_all[4] = '普通眼睛' else: msg_all[4] = '无' if msg_all[2] =='yellow': msg_all[2] = '黄色' elif msg_all[2] == 'black': msg_all[2] ='黑色' elif msg_all[2] == 'white': msg_all[2] = '白色' else: msg_all[2] = '阿拉伯' if msg_all[5] == 'oval': msg_all[5] = "椭圆" elif msg_all[5] == 'square': msg_all[5] = "正方形" elif msg_all[5] == 'triangle': msg_all[5] = "三角形" elif msg_all[5] == 'heart': msg_all[5] = "心形" else: msg_all[5] = '圆形' if msg_all[6] =='male': msg_all[6] = "男" else: msg_all[6] = "女" #这一步是渲染模板 return render_template('res.html', result = msg_all[0],filename = filename,result_xb = msg_all[6],result_nl=msg_all[1],result_lx=msg_all[5],result_yz=msg_all[3],result_fs = msg_all[2],result_yj=msg_all[4],result_bq = msg_all[7]) else: #如果上传的照片不含有人脸或者识别失败等! return render_template('tz.html',res_tz_a="识别失败,请尽量保证图片清晰,使用正脸!") return render_template('tz.html',res_tz_a="What do you want to do?") #如果上传了其他类型的文件,问他 你想弄啥? def allowed_file(filename): #检测文件是否合法函数 return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS @app.route('/', methods=['GET', 'POST']) def index(): #主路由 return render_template('index.html') #渲染主页文件 if __name__ == '__main__': app.run(host='0.0.0.0',port=80) #默认端口80 允许任何IP访
百度人脸识别SDK下载 http://ai.baidu.com/sdk#bfr 下载后执行python setup.py install
即可。 保证cb.py与SDK在同一目录下。
相关参考文献即代码托管等:
Python SDK文档 http://ai.baidu.com/docs#/Face-Python-SDK/top
版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
作者: Austin 发表日期:2018-08-19 08:14