原文首发在 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等)?

3.png0X003 实现代码:

先来看一下目录结构:

│  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

Flask中文文档  http://dormousehole.readthedocs.io/en/latest/

项目地址:https://github.com/LookCos/pyai

标签: none

分类: 所有文章

添加新评论