跳转到主要内容
3.2.3 · 建议 20 分钟 · 满分 18

面部表情识别系统交互流程设计

背景

面部表情识别系统是一种先进的计算机视觉技术,它能够分析人脸的微表情,识别出诸如快乐、悲伤、惊讶等基本情绪。通过捕捉和解读面部特征,如眼睛、眉毛和嘴部的动作,这类系统能在实时或预录的视频中判断人的情感状态,广泛应用于人机交互、市场调研、医疗健康监测、安全监控及教育科技等多个领域,为提升用户体验、增进情感智能和优化社会服务提供了有力工具。 AI模型说明:提供的已训练的模型 emotion-ferplus.onnx 专门用于进行面部表情识别。定义情感类别与数字标签的映射表为 {'neutral':0, 'happiness':1, 'surprise':2, 'sadness':3, 'anger':4, 'disgust':5, 'fear':6, 'contempt':7}。 该模型的使用交互流程为: 1) 加载模型 emotion-ferplus.onnx 和加载情感类别与数字标签的映射表; 2) 加载一张本地图片 img_test.png,并预处理图像; 3) 使用已训练的模型对图片面部表情识别; 4) 输出识别后的表情标签。

工作任务

  1. 补全该模型的使用交互流程对应的 Python 代码(3.2.3.ipynb),实现本地测试图片 img_test.png 的识别。
  2. 在上面的使用交互流程基础上,给出在面部表情识别系统中使用 emotion-ferplus.onnx 模型的一种人机交互的最优方式,将其保存为 docx 文件,命名为 3.2.3.docx。

素材预览

emotion-ferplus.onnx
二进制文件,见素材包
img_test.png
二进制文件,见素材包

代码填空

# 导入必要的库
import numpy as np
from PIL import Image
import onnxruntime as ort


# 定义预处理函数,用于将图片转换为模型所需的输入格式
def preprocess(image_path):
    input_shape = (1, 1, 64, 64)    # 模型输入期望的形状,这里是 (N, C, H, W),N=batch size, C=channels, H=height, W=width
    img = Image.open(image_path).convert('L')    # 打开图像文件并将其转换为灰度图  1分
    img = img.resize((64, 64), Image.ANTIALIAS)    # 调整图像大小到模型输入所需的尺寸
    img_data = np.array(img, dtype=np.float32)    # 将PIL图像对象转换为numpy数组,并确保数据类型是float32
    # 调整数组的形状以匹配模型输入的形状
    img_data = np.expand_dims(img_data, axis=0)  # 添加 batch 维度
    img_data = np.expand_dims(img_data, axis=1)  # 添加 channel 维度
    assert img_data.shape == input_shape, f"Expected shape {input_shape}, but got {img_data.shape}"    # 确保最终的形状与模型输入要求的形状一致
    return img_data    # 返回预处理后的图像数据


# 定义情感类别与数字标签的映射表 3分
emotion_table = {}


# 加载模型 3分
ort_session =     # 使用onnxruntime创建一个会话,用于加载并运行模型


# 加载本地图片并进行预处理 3分
input_data = 


# 准备输入数据,确保其符合模型输入的要求
ort_inputs = {ort_session.get_inputs()[0].name: input_data}    # ort_session.get_inputs()[0].name 是获取模型的第一个输入的名字


# 运行模型,进行预测 3分
ort_outs = (None, )


# 解码模型输出,找到预测概率最高的情感类别 3分
predicted_label = (ort_outs[0])


# 根据预测的标签找到对应的情感名称 3分
predicted_emotion = [predicted_label]


# 输出预测的情感
print(f"Predicted emotion: {predicted_emotion}")