AlexNet+Django+opencv实现人脸表情识别管理系统
一、引言
上次用该系统实现的功能为花分类,这次结合Opencv内置的人脸识别库与AlexNet分类网络实现人脸表情识别系统。(花分类系统地址如下)
链接: 基于Django和深度学习的分类检测系统
算法首先会对输入图像使用OpenCV进行人脸识别,再对人脸位置进行分割并传给表情分类网络(AlexNet),最后在图像中将人脸用绿色框框选起来,将表情类别显示在框的左上角,如上图所示。
二、Django部分
1. 创建Django项目
新建一个文件夹,cmd进入该目录,输入以下命令
django-admin startproject flower_reco
2. 创建APP
在项目根目录中输入命令
python manage.py startapp login
上述命令是创建一个名为login的的App,博主认为App可以理解为项目中的模块,需要后端实现什么功能就可以添加一个对应的模块,博主这里创建了login、recognition,分别实现登录和识别的功能。
注:下方为开启服务指令
python manage.py runserver
3. 编写路由
路由是后端接收请求的url,在Django服务器中,根据请求的url,做对应的后端逻辑处理。路由都写在urls文件里,它将浏览器输入的url映射到相应的业务处理逻辑也就是视图(views.py)。简单的urls编写方法如下图:
为了让urls更清晰明确,django的处理方式如上,在各个App中编写自己的url,然后再主App也就是入口文件中使用include
把子App中的url包含进来
4. 编写login请求的视图函数
路由转发用户请求到视图函数。视图函数处理用户请求,也就是编写业务处理逻辑,一般都在views.py文件里。
下面是相应登录请求的views:
from django.shortcuts import render
import os
from django.shortcuts import render
from django.conf import settings
import torch
from torchvision import transforms
from PIL import Image
def login(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
# 检查用户名和密码是否匹配
if username == 'admin' and password == 'password':
return render(request, 'success.html', {'username': username})
else:
return render(request, 'login.html', {'error': 'Invalid credentials'})
return render(request, 'login.html')
由于这里做的处理很简单,博主就不过多赘述了。
4.2 路由(urls)和视图(views)的对应关系
细心的读者可能会发现,urls中的path其实就是指向上述login文件的,明白了django中的这种一一对应的关系,编写起来就会很有条理。
5. 编写人脸表情识别视图函数
处理人脸表情识别视图函数步骤大致如下:
- 获取前端传过来的图片文件
- 将文件保存到本地临时文件
- 调用OpenCV的haarcascade_frontalface_defaul人脸检测包
- 将OpenCV检测出来的人脸分割传入人脸表情分类模型进行推断
- 得到模型返回的数据后在图像上进行绘制
- 删除临时文件
人脸检测实现代码如下(核心代码):
def face_expression_recognition(request):
if request.method == 'POST' and request.FILES.get('image'):
# 获取上传的图像文件
image = request.FILES['image'].read()
# 将图像数据转换为 OpenCV 的格式
nparr = np.frombuffer(image, np.uint8)
cv_image = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
# 在图像中检测人脸
face_cascade = cv2.CascadeClassifier('D:/PythonCode/xianyu/AlexNet-Flower_classification/Deep-Learning-Practice-AlexNet-master/Deep-Learning-Practice-AlexNet-master/login_project/recognition/haarcascade_frontalface_default.xml')
gray_image = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray_image, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# 遍历检测到的人脸
for (x, y, w, h) in faces:
# 在人脸部分绘制矩形框
cv2.rectangle(cv_image, (x, y), (x+w, y+h), (0, 255, 0), 2)
# 进行表情识别
face_roi = gray_image[y:y+h, x:x+w]
expression = predict_expression(face_roi)
# 在人脸框旁边显示表情
cv2.putText(cv_image, expression, (x, y+10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
# 将图像转换为base64编码的字符串
_, buffer = cv2.imencode('.jpg', cv_image)
image_base64 = base64.b64encode(buffer).decode('utf-8')
# 将结果返回给前端
response_data = {
'image': 'data:image/jpeg;base64,' + image_base64
}
return JsonResponse(response_data)
# 如果请求方法不是 POST 或没有上传图像文件,则返回错误信息
response_data = {
'error': 'Invalid request'
}
return JsonResponse(response_data, status=400)
表情识别代码如下:
emotion_labels = ['angry', 'disgust', 'fear', 'happy', 'neutral', 'sad', 'surprise']
# Define the image transformation
transform = transforms.Compose([
transforms.Grayscale(),
transforms.Resize((48, 48)),
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
def predict_expression(face_image):
# Apply the image transformation
face_image = Image.fromarray(face_image)
face_image = transform(face_image)
face_image = face_image.unsqueeze(0)
# Perform emotion recognition prediction
with torch.no_grad():
output = predFaceEmotion(face_image)
# probabilities = torch.softmax(output, dim=1)
# predicted_index = torch.argmax(probabilities, dim=1).item()
# expression = emotion_labels[predicted_index]
return output
三、深度学习模型部分
深度学习模型需要提前找好网络,得到训练权重并全部保存到创建的django项目目录下,这是一个小坑,如果放在django项目外的话,启动项目后可能会找不到项目外的一些文件,导致预测无法进行。
模型选用经典的AlenNet,由于本文选用的数据集过大,所以只用AlexNet可能检测有些吃力,读者后续可以修改为resnet等更强的分类网络。处理方式如下:
confMax = 0
maxIndex = 0
for i in range(len(predict)):
if predict[i] > confMax:
confMax = predict[i]
maxIndex = i
return str(class_indict[str(maxIndex)]),str(predict[maxIndex])
五、代码获取
django系统全套代码+三份人脸表情数据集,可以为写论文以及课设报告等作参考。也可将系统定值为自己的项目比如分割检测…,包定值包教会。
获取整套代码、测试视频、训练好的权重
也可以指导深度学习毕设、大作业等
q:1831255794(有偿)