表情识别(基于kreas和RAF数据集)

  1. 导入必要的库和模型文件:

    • 导入了OpenCV、Keras模型加载相关库,以及自定义的工具函数和预处理函数。
    • 指定了情绪识别模型路径、情绪标签列表、是否使用灰度图像、人脸检测模型路径等。
  2. 定义函数 detect_emotion(image):

    • 从输入的图像中检测人脸。
    • 针对每张检测到的人脸:
      • 根据人脸位置应用偏移量,提取人脸图像并进行预处理(缩放、拓展维度等)。
      • 使用情绪识别模型对人脸图像进行情绪预测。
      • 根据预测结果确定情绪标签,并根据不同情绪选择不同的颜色。
      • 在原始图像上绘制人脸边界框和情绪标签。
  3. 定义函数 show_image(window_name, image):

    • 调用 detect_emotion(image) 处理传入的图像,并在图像上显示实时的情绪分析结果。
    • 计算并显示处理速度(FPS)。
  4. 定义函数 catch_camera(window_name, camera_idx):

    • 创建窗口并打开指定摄像头。
    • 在循环中读取摄像头帧画面,调用 show_image(window_name, frame) 处理每一帧图像,并显示实时结果。
    • 当按下 'q' 键或关闭窗口时退出循环,释放摄像头资源并关闭窗口。
  5. 主程序入口:

    • 如果直接运行该代码文件,则会调用 catch_camera("表情识别", 0),打开摄像头并展示实时的情绪识别结果。

总体思路是通过人脸检测模型检测人脸位置,然后利用情绪识别模型对人脸进行情绪识别,并将识别结果实时绘制在图像上展示给用户。整个流程涵盖了图像处理、模型推断和实时展示等方面,为用户提供了一个简单但有趣的表情识别应用。

主程序代码:


import cv2
from keras.models import load_model
import numpy as np
from utils.inference import detect_faces
from utils.inference import draw_text, draw_text_lines
from utils.inference import draw_bounding_box
from utils.inference import apply_offsets
from utils.preprocessor import process_img
import time


emotion_model_path = '../trained_models/emotion_models/VGG16_Dense_RAF_20190714.h5'  # 选择模型
emotion_labels = ['Surprise', 'Fear', 'Disgust', 'Happy', 'Sad', 'Angry', 'Neutral']

isgray = False
detection_model_path = '../trained_models/detection_models/haarcascade_frontalface_default.xml'

face_detection = cv2.CascadeClassifier(detection_model_path)
emotion_classifier = load_model(emotion_model_path, compile=True)
emotion_target_size = emotion_classifier.input_shape[1:3]


def detect_emotion(image):
    bgr_image = image
    if isgray:
        gray_image = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2GRAY)
        gray_image = np.squeeze(gray_image)
        gray_image = gray_image.astype('uint8')
        image_origin = gray_image
    else:
        rgb_image = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2RGB)
        rgb_image = np.squeeze(rgb_image).astype('uint8')
        image_origin = rgb_image
    emotion_offsets = (0, 0)

    faces = detect_faces(face_detection, image_origin)

    if len(faces) > 0:
        for face in faces:
            x1, x2, y1, y2 = apply_offsets(face, emotion_offsets)
            face_image = image_origin[y1:y2, x1:x2]

            face_image = cv2.resize(face_image, emotion_target_size)

            face_image = process_img(face_image)
            face_image = np.expand_dims(face_image, 0)
            if isgray:
                face_image = np.expand_dims(face_image, -1)


            emotion_texts = []
            emotion_prediction = emotion_classifier.predict(face_image)[0]
            max_emotion_probability = np.max(emotion_prediction)
            emotion_labels_arg = np.argsort(-emotion_prediction)
            max_emotion_text = emotion_labels[int(emotion_labels_arg[0])]
            for emotion_label_arg in emotion_labels_arg:
                emotion_texts.append(emotion_labels[int(emotion_label_arg)] + ' '
                                     + str('%.2f' % emotion_prediction[int(emotion_label_arg)]))

            if max_emotion_text == 'Angry':
                color = max_emotion_probability * np.asarray((255, 0, 0))
            elif max_emotion_text == 'Sad':
                color = max_emotion_probability * np.asarray((0, 0, 255))
            elif max_emotion_text == 'Happy':
                color = max_emotion_probability * np.asarray((255, 255, 0))
            elif max_emotion_text == 'Surprise':
                color = max_emotion_probability * np.asarray((0, 255, 255))
            else:
                color = max_emotion_probability * np.asarray((0, 255, 0))

            color = color.astype(int)
            color = color.tolist()

            draw_bounding_box(face, bgr_image, color)
            # draw_text(face, rgb_image, max_emotion_text, color, 0, -50, 1, 2)
            draw_text_lines(face, bgr_image, emotion_texts, (255, 255, 255), 0, -50, 0.5, 1)

    return bgr_image


def show_image(window_name, image):
    start = time.time()
    image = detect_emotion(image)
    fps = 1. / (time.time() - start)
    draw_text((10, 30), image, "FPS:" + str(int(fps)), (0, 0, 255))
    cv2.imshow(window_name, image)


def catch_camera(window_name, camera_idx):
    cv2.namedWindow(window_name, cv2.WINDOW_NORMAL)

    cap = cv2.VideoCapture(camera_idx)
    while cap.isOpened():
        ok, frame = cap.read()  # 读取一帧数据
        if not ok:
            break

        show_image(window_name, frame)

        c = cv2.waitKey(10)
        if c & 0xFF == ord('q') or c & 0xFF == ord('Q'):
            break

        if cv2.getWindowProperty(window_name, cv2.WND_PROP_VISIBLE) < 1:
            break

    # 释放摄像头并销毁所有窗口
    cap.release()
    cv2.destroyAllWindows()


if __name__ == '__main__':
    catch_camera("表情识别", 0)    

需要工具函数和模型权重私信我。

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Keras印刷体数据集是专门为机器学习任务开发的一个包含印刷体字符图像的数据集。它通常用于训练和验证神经网络模型,以识别和分类印刷体字符。 该数据集中的图像以灰度图像的形式呈现,每个字符图像的大小相同。一般来说,数据集中的每个图像都包含单个字符,比如数字、字母或符号。 使用Keras框架,可以借助内置的函数和方法来加载和处理这个印刷体数据集。通过这些方法,我们可以将数据集划分为训练数据和测试数据,并对图像进行预处理,如调整大小、归一化或其他增强方法。这些预处理步骤可以提高模型的性能,并增强对印刷体字符的识别能力。 一旦数据集准备好后,我们可以使用Keras提供的各种神经网络模型来训练和验证数据。这些模型可以是常见的卷积神经网络(CNN)架构,如LeNet、AlexNet或VGG,也可以是更先进的架构,如ResNet、Inception等。我们可以通过设置适当的超参数和优化算法来优化这些模型,以获得更好的性能。 最后,在模型训练之后,我们可以使用测试数据集来评估模型的准确性和性能。通过计算准确率、精确率、召回率和F1值等指标,我们可以了解模型对印刷体字符的识别能力如何,并对模型进行改进或选择最佳模型。 总的来说,Keras印刷体数据集提供了一个用于训练和验证印刷体字符分类模型的基准数据集,使用Keras框架可以方便地加载、处理和训练这个数据集,并通过合适的神经网络模型来实现高准确率的印刷体字符识别任务。 ### 回答2: Keras 印刷体数据集是一个常用的机器学习数据集,使用这个数据集可以训练和测试印刷体字符的识别模型。该数据集由大量的手写印刷体字符样本组成,每个样本都标注有对应的标签,并且可用于训练和评估字符识别模型的性能。 Keras 印刷体数据集的特点之一是具有多样性,涵盖了各种不同的字符类型,包括数字、字母和特殊符号。这使得该数据集非常适合用于开发具有广泛泛化能力的模型,可以用来识别各种印刷体字符。 另一个值得注意的特点是,印刷体数据集是通过标记手写字符图像而创建的。这意味着每个样本都有一个对应的标签,指示了该字符的类别。这种标注方法使得该数据集非常适合用于监督学习的训练和评估。 使用 Keras 印刷体数据集进行模型训练时,可以采用各种机器学习方法,如深度学习、卷积神经网络等。通过在该数据集上进行训练,可以建立一个模型,能够正确地将输入的印刷体字符映射到对应的标签,实现字符识别的功能。 总之,Keras 印刷体数据集是一个用于训练和评估印刷体字符识别模型的常用数据集。它具有多样性和标注丰富的特点,可以用于各种机器学习方法。通过使用该数据集进行训练,可以构建出准确识别印刷体字符的模型。 ### 回答3: Keras印刷体数据集是一个常用的机器学习数据集,用于训练和测试印刷体字符识别模型。这个数据集包含了各种印刷体字符的图像样本,可以帮助我们构建识别和分类印刷体字符的模型。 Keras印刷体数据集一般包含大量的印刷体字符图像样本,这些样本可以是手写或者打印的字符,通常是黑白的,也可以是灰度图像。每个图像样本都有相应的标签,表示该字符的正确类别。 通过使用Keras印刷体数据集,我们可以训练一个深度学习模型,例如卷积神经网络(CNN),来识别和分类印刷体字符。我们可以将数据集划分为训练集和测试集,用训练集来训练模型,然后使用测试集评估模型的性能。 在使用Keras印刷体数据集时,我们可以通过预处理图像数据来提高模型的性能。这可能包括将图像调整为固定的尺寸、对图像进行归一化处理或增强数据集等。 总的说来,Keras印刷体数据集提供了一个方便和广泛使用的工具,用于训练和评估印刷体字符识别模型。通过使用这个数据集,我们可以构建高性能的模型,用于各种实际应用,例如自动识别和分类印刷体字符的系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值