Flask是一个基于Python的Web应用开发框架,它非常小,但具备丰富的功能。因为它从开发开始就被设计为可扩展的框架,本身只具备一个包含基本服务的强健核心,其他功能则可通过扩展实现。
Flask的两个主要依赖分别是:由Werkzeug提供路由、调试和Web服务器网关接口;由Jinjia2提供模板系统。
我在实验中使用的是pycharm,通过文件->设置->项目:xx->python解释器->"+"可安装Flask
在使用flask时,需要先创建一个程序实例,把接受自客户端的所有请求进行处理。
from flask import Flask app=Flask(__name__)
接下来是定义路由,它是用来处理url和函数之间的关系 ,这个函数被称为视图函数,它返回对url的响应,可以是简单的HTML字符串,也可以是表单等。因为作业的要求,我在视图函数中用到了
flask中的render_template(),对已经写好的HTML文件进行渲染,高效灵活生成HTML。
#路由
@app.route("/",methods=['GET', 'POST'])
#视图函数
def index():
return render_template("index.html")
html等文件放置也有要求,在项目创建的时候,要在 项目下新建static、templates文件夹,static里面放置的是图片、css等静态文件,templates放置的是html文件。
最后需要启动服务器
if __name__=='__main__':
#启动方法
app.run(debug=True)
点击运行的网址就可以看到实验结果。
以上是我对flask最最基本的了解。接下来是我的实验:
在本次实验中,我链接了MySQL数据库进行四级英语词汇的读取,并将他以表单形式进行输出;以及使用了pytorch进行人脸检测与比对。
点击下面两个链接可以分别跳转到对应实验结果。
人脸特征向量太多,就草草截图了。
(具体html就不放上来了,写得很简单)以下是FLASK程序代码,包含数据库的链接使用。
from flask import Flask, render_template
from face import Face
import pymysql
import torch
from facenet_pytorch import MTCNN, InceptionResnetV1
from torch import device
db=pymysql.connect(host='localhost',user='root',password='123456',database='data2022',charset='utf8')
#创建实例
app=Flask(__name__)
#路由
@app.route("/",methods=['GET', 'POST'])
#视图函数
def index():
return render_template("index.html")
@app.route('/word',methods=['GET', 'POST'])
def word():
with db.cursor() as cursor:
sql = 'select * from map_enword;'
cursor.execute(sql)
result = cursor.fetchall()
result = list(result)
cursor.close()
db.close()
return render_template("word.html", result=result)
@app.route('/face_recognition',methods=['GET', 'POST'])
def face_recognition():
import cv2
import numpy as np
import torch
from facenet_pytorch import MTCNN, InceptionResnetV1
# 获得人脸特征向量
def load_known_faces(dstImgPath, savePath, mtcnn, resnet):
aligned = []
knownImg = cv2.imread(dstImgPath) # 读取图片
face = mtcnn(knownImg) # 使用mtcnn检测人脸,返回【人脸数组】
# 新增人脸检测
from torchvision.transforms import ToPILImage
show = ToPILImage() # 可以把Tensor转成Image,方便可视化
#show(face[0]).show()
show(face[0]).save(savePath)
if face is not None:
aligned.append(face[0])
aligned = torch.stack(aligned).to(device)
with torch.no_grad():
known_faces_emb = resnet(aligned).detach().cpu() # 使用resnet模型获取人脸对应的特征向量
return known_faces_emb, knownImg
# 计算人脸特征向量间的欧氏距离,设置阈值,判断是否为同一个人脸
def match_faces(faces_emb, known_faces_emb, threshold):
isExistDst = False
distance = (known_faces_emb[0] - faces_emb[0]).norm().item()
print("距离:", round(distance, 2))
print("人脸特征向量n", known_faces_emb[0], faces_emb[0])
if (distance < threshold):
isExistDst = True
return isExistDst, distance
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
# mtcnn模型加载【设置网络参数,进行人脸检测】
mtcnn = MTCNN(min_face_size=12, thresholds=[0.2, 0.2, 0.3], keep_all=True, device=device)
# InceptionResnetV1模型加载【用于获取人脸特征向量】
resnet = InceptionResnetV1(pretrained='vggface2').eval().to(device)
MatchThreshold = 0.8 # 人脸特征向量匹配阈值设置
known_faces_emb, _ = load_known_faces('static/huge1.jpg', 'static/new_huge1.jpg', mtcnn, resnet) # 已知人物图
# bFaceThin.png lyf2.jpg
faces_emb, img = load_known_faces('static/huge2.jpg', 'static/new_huge2.jpg', mtcnn, resnet) # 待检测人物图
isExistDst ,distance= match_faces(faces_emb, known_faces_emb, MatchThreshold) # 人脸匹配
if isExistDst:
boxes, prob, landmarks = mtcnn.detect(img, landmarks=True) # 返回人脸框,概率,5个人脸关键点
result = '匹配'
else:
result = '不匹配'
return render_template("face_recognition.html", result=result, known_faces_emb=known_faces_emb, faces_emb=faces_emb, distance=distance)
if __name__=='__main__':
#启动方法
app.run(debug=True)
# if __name__ == '__main__':
# from gevent import pywsgi
#
# server = pywsgi.WSGIServer(('127.0.0.1', 5000), app)
# server.serve_forever()



