opencv学习:基于计算机视觉的表情识别系统

机器学习算法数据库

picture.image

向AI转型的程序员都关注公众号 机器学习AI算法工程

    基于计算机视觉的表情识别系统,该系统能够从视频流中实时检测人脸,并识别出两种基本表情:大笑和微笑。实验通过分析人脸关键点来计算表情特征指标,从而判断表情类型。

原理

基于以下原理进行:

人脸检测: 使用dlib库的get_frontal_face_detector函数检测视频中的人脸。

特征点预测: 使用dlib库的shape_predictor函数预测人脸的68个关键点。

表情特征计算:

嘴巴张开程度(MAR): 通过计算嘴巴周围特定点之间的欧几里得距离来衡量嘴巴的张开程度。

1.计算上下嘴唇的距离

picture.image

2.计算嘴唇的长度

picture.image

3.嘴巴宽度与脸部宽度的比例(MJR):通过比较嘴巴宽度和脸部宽度的比例来识别微笑表情。

picture.image

4.表情判断:根据计算出的特征指标,结合预设的阈值判断表情类型。

代码步骤:

1.导入必要的库:


          
import numpy as np
          
import cv2
          
from sklearn.metrics.pairwise import euclidean_distances
          
from PIL import Image, ImageDraw, ImageFont
          
import dlib
      

2.定义MAR函数:

    函数计算嘴巴张开的程度(MAR),通过计算嘴巴周围特定点之间的距离。

          
def MAR(shape):
          
    A = euclidean_distances(shape[50].reshape(1, 2), shape[58].reshape(1, 2))
          
    B = euclidean_distances(shape[51].reshape(1, 2), shape[57].reshape(1, 2))
          
    C = euclidean_distances(shape[52].reshape(1, 2), shape[56].reshape(1, 2))
          
    D = euclidean_distances(shape[48].reshape(1, 2), shape[54].reshape(1, 2))
          
    return ((A + B + C) / 3) / D
      

3.定义MJR函数:

    函数计算嘴巴宽度与脸部宽度的比例(MJR),用于判断微笑的程度。

          
def MJR(shape):
          
    m = euclidean_distances(shape[48].reshape(1, 2), shape[54].reshape(1, 2))
          
    j = euclidean_distances(shape[3].reshape(1, 2), shape[13].reshape(1, 2))
          
    return m / j
      

4.定义cv2addchinese函数:

    检查图像类型并转换:

          
def cv2addchinese(img, text, position, textColor=255, textSize=30):
          
    if isinstance(img, np.ndarray):
          
        if len(img.shape) == 2:  # 灰度图像
          
            img_pil = Image.fromarray(img)
          
        else:  # 彩色图像
          
            img_pil = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
          
    else:
          
        raise ValueError("img must be a numpy array")
      

创建了一个 ImageDraw 对象用于在PIL图像上绘制,加载了一个中文字体文件,在指定位置绘制文本。


          
    draw = ImageDraw.Draw(img_pil)
          
    fontstyle = ImageFont.truetype("simsun.ttc", textSize, encoding="utf-8")
          
    draw.text(position, text, font=fontstyle, fill=textColor)
      

将PIL图像转换回OpenCV图像,如果原图像是灰度图,直接转换即可;如果是彩色图,则需要从RGB色彩空间转换回BGR色彩空间。


          
    if len(img.shape) == 2:  # 灰度图像
          
        img_cv2 = np.array(img_pil, dtype=np.uint8)
          
    else:  # 彩色图像
          
        img_cv2 = cv2.cvtColor(np.array(img_pil), cv2.COLOR_RGB2BGR)
          
    return img_cv2
      

5.初始化人脸检测器和特征点预测器:


          
detector = dlib.get_frontal_face_detector()
          
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
          
cap = cv2.VideoCapture('xiao.mp4')
      

6.读取视频帧并检测人脸:


          
while True:
          
    ret, image = cap.read()
          
    faces = detector(image, 0)
          
    for face in faces:
          
        #获取特征点
          
        shape = predictor(image, face)
          
        #将 predictor 返回的特征点横坐标与纵坐标转换为NumPy数组
          
        shape = np.array([[p.x, p.y] for p in shape.parts()])
      

7.计算表情指标并绘制结果:

    根据MAR和MJR的值来判断表情类型

          
        mar = MAR(shape)
          
        mjr = MJR(shape)
          
        result = '正常'
          
        print("mar", mar, "\tmjr", mjr)
          
        if mar > 0.5:
          
            result = "大笑"
          
        elif mjr > 0.45:
          
            result = "微笑"
          
 
          
        #计算嘴巴的凸包
          
        mouth = cv2.convexHull(shape[48:61])
          
        #在图像上添加表情文本
          
        image = cv2addchinese(image, result, mouth[0,0])
          
        #绘制嘴巴轮廓
          
        cv2.drawContours(image, [mouth], -1, (0, 255, 0), 1)
          
    cv2.imshow('frame', image)
          
    key = cv2.waitKey(60)
          
    if key == 27:
          
        break
      

运行结果

picture.image

完整代码


          
import numpy as np
          
import cv2
          
from sklearn.metrics.pairwise import euclidean_distances
          
from PIL import Image, ImageDraw, ImageFont
          
import dlib
          
 
          
 
          
def MAR(shape):
          
    A = euclidean_distances(shape[50].reshape(1, 2), shape[58].reshape(1, 2))
          
    B = euclidean_distances(shape[51].reshape(1, 2), shape[57].reshape(1, 2))
          
    C = euclidean_distances(shape[52].reshape(1, 2), shape[56].reshape(1, 2))
          
    D = euclidean_distances(shape[48].reshape(1, 2), shape[54].reshape(1, 2))
          
    return ((A + B + C) / 3) / D
          
 
          
 
          
def MJR(shape):
          
    m = euclidean_distances(shape[48].reshape(1, 2), shape[54].reshape(1, 2))
          
    j = euclidean_distances(shape[3].reshape(1, 2), shape[13].reshape(1, 2))
          
    return m / j
          
 
          
 
          
def cv2addchinese(img, text, position, textColor=255, textSize=30):
          
    if isinstance(img, np.ndarray):
          
        if len(img.shape) == 2:  # 灰度图像
          
            img_pil = Image.fromarray(img)
          
        else:  # 彩色图像
          
            img_pil = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
          
    else:
          
        raise ValueError("img must be a numpy array")
          
 
          
    draw = ImageDraw.Draw(img_pil)
          
    fontstyle = ImageFont.truetype("simsun.ttc", textSize, encoding="utf-8")
          
    draw.text(position, text, font=fontstyle, fill=textColor)
          
 
          
    # 将PIL图像转换回OpenCV图像
          
    if len(img.shape) == 2:  # 灰度图像
          
        img_cv2 = np.array(img_pil, dtype=np.uint8)
          
    else:  # 彩色图像
          
        img_cv2 = cv2.cvtColor(np.array(img_pil), cv2.COLOR_RGB2BGR)
          
 
          
    return img_cv2
          
 
          
 
          
detector = dlib.get_frontal_face_detector()
          
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
          
cap = cv2.VideoCapture('xiao.mp4')
          
 
          
while True:
          
    ret, image = cap.read()
          
    faces = detector(image, 0)
          
    for face in faces:
          
        shape = predictor(image, face)
          
        shape = np.array([[p.x, p.y] for p in shape.parts()])
          
        mar = MAR(shape)
          
        mjr = MJR(shape)
          
        result = '正常'
          
        print("mar", mar, "\tmjr", mjr)
          
        if mar > 0.5:
          
            result = "大笑"
          
        elif mjr > 0.45:
          
            result = "微笑"
          
 
          
        mouth = cv2.convexHull(shape[48:61])
          
 
          
        image = cv2addchinese(image, result, mouth[0,0])
          
        cv2.drawContours(image, [mouth], -1, (0, 255, 0), 1)
          
    cv2.imshow('frame', image)
          
    key = cv2.waitKey(60)
          
    if key == 27:
          
        break
      

改进方法:

  1. 提高特征点预测的稳定性:考虑使用更先进的特征点预测模型。

  2. 优化表情识别算法:使用深度学习模型来提高表情识别的准确性。

  3. 改进阈值设置:根据实际应用场景调整MAR和MJR的阈值,以提高识别准确率。

  4. 增强系统的鲁棒性:通过算法优化,提高系统在不同光照和表情变化下的鲁棒性。

机器学习算法AI大数据技术

搜索公众号添加: datanlp

picture.image

长按图片,识别二维码

阅读过本文的人还看了以下文章:

实时语义分割ENet算法,提取书本/票据边缘

整理开源的中文大语言模型,以规模较小、可私有化部署、训练成本较低的模型为主

《大语言模型》PDF下载

动手学深度学习-(李沐)PyTorch版本

YOLOv9电动车头盔佩戴检测,详细讲解模型训练

TensorFlow 2.0深度学习案例实战

基于40万表格数据集TableBank,用MaskRCNN做表格检测

《基于深度学习的自然语言处理》中/英PDF

Deep Learning 中文版初版-周志华团队

【全套视频课】最全的目标检测算法系列讲解,通俗易懂!

《美团机器学习实践》_美团算法团队.pdf

《深度学习入门:基于Python的理论与实现》高清中文PDF+源码

《深度学习:基于Keras的Python实践》PDF和代码

特征提取与图像处理(第二版).pdf

python就业班学习视频,从入门到实战项目

2019最新《PyTorch自然语言处理》英、中文版PDF+源码

《21个项目玩转深度学习:基于TensorFlow的实践详解》完整版PDF+附书代码

《深度学习之pytorch》pdf+附书源码

PyTorch深度学习快速实战入门《pytorch-handbook》

【下载】豆瓣评分8.1,《机器学习实战:基于Scikit-Learn和TensorFlow》

《Python数据分析与挖掘实战》PDF+完整源码

汽车行业完整知识图谱项目实战视频(全23课)

李沐大神开源《动手学深度学习》,加州伯克利深度学习(2019春)教材

笔记、代码清晰易懂!李航《统计学习方法》最新资源全套!

《神经网络与深度学习》最新2018版中英PDF+源码

将机器学习模型部署为REST API

FashionAI服装属性标签图像识别Top1-5方案分享

重要开源!CNN-RNN-CTC 实现手写汉字识别

yolo3 检测出图像中的不规则汉字

同样是机器学习算法工程师,你的面试为什么过不了?

前海征信大数据算法:风险概率预测

【Keras】完整实现‘交通标志’分类、‘票据’分类两个项目,让你掌握深度学习图像分类

VGG16迁移学习,实现医学图像识别分类工程项目

特征工程(一)

特征工程(二) :文本数据的展开、过滤和分块

特征工程(三):特征缩放,从词袋到 TF-IDF

特征工程(四): 类别特征

特征工程(五): PCA 降维

特征工程(六): 非线性特征提取和模型堆叠

特征工程(七):图像特征提取和深度学习

如何利用全新的决策树集成级联结构gcForest做特征工程并打分?

Machine Learning Yearning 中文翻译稿

蚂蚁金服2018秋招-算法工程师(共四面)通过

全球AI挑战-场景分类的比赛源码(多模型融合)

斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)

python+flask搭建CNN在线识别手写中文网站

中科院Kaggle全球文本匹配竞赛华人第1名团队-深度学习与特征工程

不断更新资源

深度学习、机器学习、数据分析、python

搜索公众号添加: datayx

picture.image

0
0
0
0
相关资源
大规模高性能计算集群优化实践
随着机器学习的发展,数据量和训练模型都有越来越大的趋势,这对基础设施有了更高的要求,包括硬件、网络架构等。本次分享主要介绍火山引擎支撑大规模高性能计算集群的架构和优化实践。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论