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) 输出识别后的表情标签。
工作任务
- 补全该模型的使用交互流程对应的 Python 代码(3.2.3.ipynb),实现本地测试图片 img_test.png 的识别。
- 在上面的使用交互流程基础上,给出在面部表情识别系统中使用 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}")