【项目】基于Django、深度学习和Opencv的人脸表情识别管理系统(AlexNet、Resnet等分类网络均可)

一、引言

上次用该系统实现的功能为花分类,这次结合Opencv内置的人脸识别库与AlexNet分类网络实现人脸表情识别系统。(花分类系统地址如下)
链接: 基于Django和深度学习的分类检测系统

在这里插入图片描述在这里插入图片描述
(https://img-blog.csdnimg.cn/7402006845d7400284e36b48d6d3f9f9.png)
算法首先会对输入图像使用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. 编写人脸表情识别视图函数

处理人脸表情识别视图函数步骤大致如下:

  1. 获取前端传过来的图片文件
  2. 将文件保存到本地临时文件
  3. 调用OpenCVhaarcascade_frontalface_defaul人脸检测包
  4. 将OpenCV检测出来的人脸分割传入人脸表情分类模型进行推断
  5. 得到模型返回的数据后在图像上进行绘制
  6. 删除临时文件

人脸检测实现代码如下(核心代码):


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(有偿)
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值