深度学习实战人脸表情识别【源码+模型+PyQt5界面】

在这里插入图片描述

AI人脸表情识别


研究背景与意义

  人脸表情识别是计算机视觉领域中的一个重要研究方向,它涉及到通过分析人脸图像中的面部表情来理解人的情感状态。这项技术具有广泛的研究背景和实际应用意义:

研究背景:

  1. 心理学基础: 人类情感通过面部表情得以传递和理解。Paul Ekman等研究者提出的基础情感模型中包含了六种基本表情(快乐、愤怒、恐惧、悲伤、惊讶、厌恶),这为人脸表情识别研究提供了基本理论依据。

  2. 社交交互: 在人与人之间的交往中,情感的传递和理解是非常重要的。人脸表情识别可以用于改善计算机与人类之间的交互体验,例如,通过识别用户的情感状态来自适应性地调整系统的行为。

  3. 娱乐与游戏: 在娱乐和游戏领域,人脸表情识别可以用于创造更加逼真的虚拟角色,使其能够根据玩家的情感状态做出相应反应,增强游戏的沉浸感。

研究意义与应用:

  1. 情感分析: 人脸表情识别技术可以应用于情感分析,帮助分析人们在特定情境下的情感状态。这在市场调研、广告评估等领域有很大的价值。

  2. 心理健康: 人脸表情识别可以辅助心理健康领域,帮助识别抑郁、焦虑等情感障碍的迹象,为临床诊断提供参考。

  3. 用户体验改善: 在人机交互中,通过分析用户的面部表情,系统可以实时了解用户的情感状态,从而调整界面设计、推荐内容等,提供更好的用户体验。

  4. 虚拟现实与增强现实: 在虚拟现实和增强现实应用中,人脸表情识别可以使虚拟角色更加逼真地模拟真实的情感表现,提升沉浸感。

  5. 安全与监控: 人脸表情识别技术可以应用于安全领域,帮助检测人们在监控画面中的情感变化,从而及早发现潜在威胁或异常行为。

总之,人脸表情识别作为一项综合性的研究和应用领域,既有深厚的理论基础,又有广泛的实际应用,对于改善人机交互、促进情感分析、提升虚拟现实体验等方面都有重要的意义。


觉得不错的小伙伴,感谢点赞、关注加收藏哦!更多干货内容持续更新…

代码下载链接

关注博主的G Z H【小蜜蜂视觉】,回复【表情识别】即可获取下载方式

  若您想获得博文中涉及的实现完整全部程序文件(包括测试图片、测试视频、py文件,模型权重文件,调试说明等),代码获取与技术指导,具体见可参考博客与视频,已将所有涉及的文件同时打包到里面,软件安装调试有具体说明,我们有专业的调试技术人员,将远程协助客户调试,具体请看安装调试说明.txt,完整文件截图如下:

在这里插入图片描述

一、效果演示

  本文构建的AI人脸表情识别系统支持图像、视频以及摄像头三种图像输入。

1.1 图像识别

在这里插入图片描述

1.2 视频识别

在这里插入图片描述

1.3 摄像头识别

在这里插入图片描述

二、技术原理

2.1 整体技术流程

  人脸表情识别系统的整体流程通常可以分为以下步骤:人脸检测(定位)、特征提取、分类器构建和情感分类。下面是一个简要的流程:

  1. 人脸检测(定位): 这一步骤的目标是从图像中定位出人脸的位置。常用的人脸检测方法包括基于特征的方法(如Haar特征、HOG特征)和基于深度学习的方法(如卷积神经网络)。一旦检测到人脸位置,就可以将人脸区域提取出来进行后续处理。

  2. 特征提取: 从人脸图像中提取有关表情的特征,通常会使用各种图像处理和计算机视觉技术。常用的特征提取方法包括局部二值模式(LBP)、梯度直方图(HOG)、人脸关键点等。这些特征能够捕捉人脸的纹理和结构信息,有助于区分不同的表情。

  3. 分类器构建: 特征提取后,需要构建一个分类器来将提取到的特征映射到不同的表情类别。在这一步中,您提到了构建VGG分类器,VGG是一个经典的卷积神经网络结构,适用于图像分类任务。您可以将提取到的特征输入VGG网络中,经过训练后得到一个适用于表情分类的分类器。

  4. 情感分类: 在分类器构建完成后,将其应用于新的人脸图像。这一步骤涉及将新的图像数据输入到分类器中,然后分类器会输出预测的情感类别。一般来说,每个情感类别都与一种特定的面部表情相对应,如快乐、愤怒、悲伤等。

2.2 常见七种人脸表情

在这里插入图片描述
  当涉及到人脸表情识别时,这些词语通常用于描述不同的情感类别,每个情感类别都对应着人脸上不同的表情特征。以下是对每个情感类别的简要介绍:

  1. 惊讶(Surprise): 惊讶是一种突然、意外的情感体验,通常由于出现了令人吃惊的事情而引发。人脸的惊讶表情通常表现为眼睛睁得大大的,眉毛上扬,嘴巴张开。

  2. 恐惧(Fear): 恐惧是一种对可能的威胁、危险或不安全情境的反应。人脸的恐惧表情可能包括紧闭的眼睛、皱起的眉毛、嘴巴微微张开。

  3. 厌恶(Disgust): 厌恶是一种对于令人讨厌、恶心的事物的强烈反感。人脸的厌恶表情通常表现为皱着的鼻子、紧闭的眼睛,嘴巴可能稍微撇嘴。

  4. 开心(Happy): 开心是一种愉悦和高兴的情感状态。人脸的开心表情通常包括眼睛眯成一条线,嘴巴向上弯曲,可能伴随着笑声。

  5. 悲伤(Sad): 悲伤是一种因失落、伤心或失望而引起的情感体验。人脸的悲伤表情通常表现为眼睛下垂、嘴角下弯,整个表情显得萎靡。

  6. 愤怒(Angry): 愤怒是一种对不公平、冲突或受到伤害的强烈情感反应。人脸的愤怒表情可能包括皱起的眉毛、紧闭的嘴唇,以及可能显露出的紧张感。

  7. 正常(Neutral): 正常情感状态指的是没有明显情感表达的状态,也被称为中性情感。在这种情况下,人脸通常表现出平静、不带有强烈情感的表情。

2.3 传统人脸定位

# encoding:utf-8
import cv2
import numpy as np



# 通过numpy读取中文路径图像
def image_read_from_chinese_path(image_file_name):
    image_numpy_data = cv2.imdecode(np.fromfile(image_file_name, dtype=np.uint8), 1)
    #返回numpy的ndarray
    return image_numpy_data


# 运行之前,检查cascade文件路径是否在相应的目录下
face_cascade = cv2.CascadeClassifier('model/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('model/haarcascade_eye.xml')

# 读取图像
img = image_read_from_chinese_path('./images/test2.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转为灰度图


# 检测脸部
faces = face_cascade.detectMultiScale(gray,
                            scaleFactor=1.1,
                            minNeighbors=5,
                            minSize=(100, 100),
                            flags=cv2.CASCADE_SCALE_IMAGE)


# 标记位置
for (x, y, w, h) in faces:
    img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)

    roi_gray = gray[y: y + h, x: x + w]
    roi_color = img[y: y + h, x: x + w]

    eyes = eye_cascade.detectMultiScale(roi_gray)
    for (ex, ey, ew, eh) in eyes:
        cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 0, 255), 2)


label = f'OpenCV  Haar Detected {
      
      str(len(faces))} faces'
cv2.putText(img, label, (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 1)

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

  如果新同学不知道如何配置环境,可以参考博主写的【Anaconda3与PyCharm安装配置保姆教程

  其中,函数image_read_from_chinese_path函数主要是解决cv2无法读取中文路径图像的解决方案,具体可以参考博主写的文章【opencv-python[cv2]读取中文路径图像

2.4 深度学习人脸定位

  深度学习人脸定位算法的一般流程包括:首先对输入图像进行预处理,包括缩放、裁剪等操作,然后使用卷积神经网络(CNN)提取特征,接着使用回归器或分类器对得到的特征进行分析,最终输出人脸的位置和大小。

2.4.1 MTCNN

  MTCNN (Multi-task Cascaded Convolutional Networks)是由中国科学院提出的一种多任务级联卷积神经网络,它可以同时进行人脸检测、关键点定位和姿态估计等任务,具有精度高、速度快、能够处理多个尺度的人脸等优点。

  具体说明与代码实现可参考博主写的教程MTCNN人脸检测算法实现(python)

2.4.2 RetinaFace

  RetinaFace 是由中国香港城市大学提出的一种准确率更高的人脸检测与关键点定位算法,其使用了可变形卷积网络(Deformable Convolutional Network)来实现更加准确的定位,RetinaFace 特别适用于小尺度人脸的定位。

2.4.3 CenterFace

  CenterFace 是由华为提出的一种轻量级人脸检测与关键点定位算法,该算法只需要 1.5MB 的模型大小,可以在移动端实时运行,CenterFace 采用了 Hourglass 模型和特征金字塔网络(Feature Pyramid Network)来实现高精度的人脸定位。

2.4.4 BlazeFace

  BlazeFace 是由 Google 提出的一种极其轻量级的人脸检测算法,它的模型大小只有 2MB 左右,可以在移动端实时运行,BlazeFace 采用了创新的 anchor-free 检测方式,可以实现更快速度的人脸定位。

2.4.5 YOLO

  YOLO 是一种端到端的实时目标检测算法,可以同时对多个目标进行检测和定位。由于 YOLO 可以将整张图像划分为网格,并在每个网格上预测目标的类别和边界框,因此它通常比其他基于区域的目标检测算法更快。

2.4.6 SSD

  SSD 是一种基于卷积神经网络的单步目标检测算法,可以在一次前向传播中完成对多个目标的检测,相对于 Faster R-CNN 等基于区域的检测算法,SSD 更加简单与高效。

2.4.7 CascadeCNN

  CascadeCNN 是由微软亚洲研究院提出的级联卷积神经网络,能够在不牺牲性能的情况下大幅减小网络规模和计算量。CascadeCNN 的结构是由多个级联阶段组成,每个阶段包含多个级联卷积层和池化层,可以有效地提高人脸定位的精确度和稳定性。

2.5 人脸表情分类

2.5.1 RAF-DB数据集介绍

  RAF-DB 全称 Real-world Affective Faces,是一个大规模面部表情数据集。该数据集由 ​​29,672​​​ 张多样化的面部图像组成,由 40 名标记者对图像标注基本或复合表情。

  此外每张图像还包括 5 个精准 landmark location、37 个自动 landmark location、bounding box、race、age range 以及gender attribute 标注。

  该数据集中的图像人脸在年龄、性别和种族、头部姿势、照明条件、遮挡物(如眼镜、面部毛发或自我遮挡)、后期处理操作(如各种滤镜和特效)等方面具有极大差异。

2.5.2 FER2013数据集介绍

  FER2013 全称 Facial Expression Recognition 2013 Dataset,该数据集包含大约 30,000 张不同表情的面部 RGB 图像,图像的尺寸均为 48×48 像素。

  该数据集中的主要标注可分为 7 种类型:0 = 愤怒,1 = 厌恶,2 = 恐惧,3 = 快乐,4 = 悲伤,5 = 惊奇,6 = 中立。其中厌恶表情的图像数量最少,仅有 600 张,而其他每个类型都有近 5,000 个样本。
FER2013默认提供的csv格式文件,如下代码是csv转png图像的python脚本

import numpy as np
import pandas as pd 
from PIL import Image
from tqdm import tqdm
import os

# convert string to integer
def atoi(s):
    n = 0
    for i in s:
        n = n*10 + ord(i) - ord("0")
    return n

# making folders
outer_names = ['test','train']
inner_names = ['angry', 'disgusted', 'fearful', 'happy', 'sad', 'surprised', 'neutral']
os.makedirs('data', exist_ok=True)
for outer_name in outer_names:
    os.makedirs(os.path.join('data',outer_name), exist_ok=True)
    for inner_name in inner_names:
        os.makedirs(os.path.join('data',outer_name,inner_name), exist_ok=True)

# to keep count of each category
angry = 0
disgusted = 0
fearful = 0
happy = 0
sad = 0
surprised = 0
neutral = 0
angry_test = 0
disgusted_test = 0
fearful_test = 0
happy_test = 0
sad_test = 0
surprised_test = 0
neutral_test = 0

df = pd.read_csv('./fer2013.csv')
mat = np.zeros((48,48),dtype=np.uint8)
print("Saving images...")

# read the csv file line by line
for i in tqdm(range(len(df))):
    txt = df['pixels'][i]
    words = txt.split()
    
    # the image size is 48x48
    for j in range(2304):
        xind = j // 48
        yind = j % 48
        mat[xind][yind] = atoi(words[j])

    img = Image.fromarray(mat)

    # train
    if i < 28709:
        if df['emotion'][i] == 0:
            img.save('data/train/angry/im'+str(angry)+'.png')
            angry += 1
        elif df['emotion'][i] == 1:
            img.save('data/train/disgusted/im'+str(disgusted)+'.png')
            disgusted += 1
        elif df['emotion'][i] == 2:
            img.save('data/train/fearful/im'+str(fearful)+'.png')
            fearful += 1
        elif df['emotion'][i] == 3:
            img.save('data/train/happy/im'+str(happy)+'.png')
            happy += 1
        elif df['emotion'][i] == 4:
            img.save('data/train/sad/im'+str(sad)+'.png')
            sad += 1
        elif df['emotion'][i] == 5:
            img.save('data/train/surprised/im'+str(surprised)+'.png')
            surprised += 1
        elif df['emotion'][i] == 6:
            img.save('data/train/neutral/im'+str(neutral)+'.png')
            neutral += 1

    # test
    else:
        if df['emotion'][i] == 0:
            img.save('data/test/angry/im'+str(angry_test)+'.png')
            angry_test += 1
        elif df['emotion'][i] == 1:
            img.save('data/test/disgusted/im'+str(disgusted_test)+'.png')
            disgusted_test += 1
        elif df['emotion'][i] == 2:
            img.save('data/test/fearful/im'+str(fearful_test)+'.png')
            fearful_test += 1
        elif df['emotion'][i] == 3:
            img.save('data/test/happy/im'+str(happy_test)+'.png')
            happy_test += 1
        elif df['emotion'][i] == 4:
            img.save('data/test/sad/im'+str(sad_test)+'.png')
            sad_test += 1
        elif df['emotion'][i] == 5:
            img.save('data/test/surprised/im'+str(surprised_test)+'.png')
            surprised_test += 1
        elif df['emotion'][i] == 6:
            img.save('data/test/neutral/im'+str(neutral_test)+'.png')
            neutral_test += 1

print("Done!")

2.5.3 vgg-16人脸表情分类

  VGG-16(Visual Geometry Group 16)是一个深度卷积神经网络架构,由牛津大学视觉几何小组(Visual Geometry Group)开发。VGG-16在2014年的ImageNet图像分类竞赛中取得了很大的成功,为图像分类领域的深度学习奠定了重要基础。

网络结构:
  VGG-16由16个卷积层和3个全连接层组成,其中的16表示网络总共有16个卷积层。这种结构的特点是将较小的3x3卷积核连续叠加使用,从而增加网络的深度。通过这种方式,VGG-16网络达到了比之前更深的卷积神经网络,从而能够更好地学习图像的特征。

卷积层设置:
  VGG-16的卷积层设置可以分为几个阶段,其中每个阶段都包含一到多个卷积层,后跟一个池化层来降低特征图的尺寸。网络的最后一部分是三个全连接层,用于将卷积特征映射到不同类别的预测。

特点:

  1. 小卷积核: VGG-16采用小尺寸的3x3卷积核,这可以增加网络的深度,并且有助于捕获不同尺度的特征。

  2. 相对简单的架构: VGG-16的架构相对来说相当简单,仅使用了卷积和池化层,没有复杂的网络结构模块,这使得网络的理解和实现相对容易。

  3. 堆叠卷积层: VGG-16通过多次堆叠卷积层,使网络具有更深的层次,这有助于学习更复杂的图像特征。

def vgg16(input_shape, num_classes, weights_path=None, pooling='avg'):
    # 构造VGG16模型
    model = Sequential()

    # Block 1
    model.add(Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1', input_shape=input_shape))
    model.add(Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2'))
    # model.add(BatchNormalization(name='bn_1'))
    model.add(MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool'))

    # Block 2
    model.add(Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv1'))
    model.add(Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv2'))
    # model.add(BatchNormalization(name='bn_2'))
    model.add(MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool'))

    # Block 3
    model.add(Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1'))
    model.add(Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv2'))
    model.add(Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv3'))
    # model.add(BatchNormalization(name='bn_3'))
    model.add(MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool'))

    # Block 4
    model.add(Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1'))
    model.add(Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv2'))
    model.add(Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv3'))
    # model.add(BatchNormalization(name='bn_4'))
    model.add(MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool'))

    # Block 5
    model.add(Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1'))
    model.add(Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv2'))
    model.add(Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv3'))
    # model.add(BatchNormalization(name='bn_5'))
    model.add(MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool'))

    if weights_path:
        model.load_weights(weights_path)

    out = model.get_layer('block5_pool').output

    if pooling is None:
        out = Flatten(name='flatten')(out)
        out = Dense(512, activation='relu', kernel_initializer='he_normal', name='fc')(out)
        out = Dropout(0.5)(out)
        # out = Dense(512, activation='relu', kernel_initializer='he_normal', name='fc2')(out)
        # out = Dropout(0.5)(out)
    elif pooling == 'avg':
        out = GlobalAveragePooling2D(name='global_avg_pool')(out)
    elif pooling == 'max':
        out = GlobalMaxPooling2D(name='global_max_pool')(out)

    out = Dense(num_classes, activation='softmax', kernel_initializer='he_normal', name='predict')(out)

    model = Model(model.input, out)

    return model

2.5.4 表情分类网络模型训练

from tensorflow.keras import optimizers
from tensorflow.keras.callbacks import CSVLogger, ModelCheckpoint, EarlyStopping, ReduceLROnPlateau
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.contrib import lite
from nets.choose_net import choose_net
from utils.data_manager import DataManager
from utils.data_manager import split_raf_data
from utils.preprocessor import process_img
from utils.plot import plot_log, plot_emotion_matrix
from config.train_cfg import *
from .evaluate import evaluate

# data generator
data_generator = ImageDataGenerator(
    rotation_range=30, horizontal_flip=True,
    width_shift_range=0.1, height_shift_range=0.1,
    zoom_range=0.2, shear_range=0.1,
    channel_shift_range=0.5)
#  channel_shift_range=50,
emotion_model = choose_net(USE_EMOTION_MODEL, INPUT_SHAPE, EMOTION_NUM_CLS)
sgd = optimizers.SGD(lr=LEARNING_RATE, decay=LEARNING_RATE/BATCH_SIZE, momentum=0.9, nesterov=True)
emotion_model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy'])

# callbacks
csv_logger = CSVLogger(EMOTION_LOG_NAME, append=False)
early_stop = EarlyStopping('val_loss', patience=PATIENCE)
reduce_lr = ReduceLROnPlateau('val_loss', factor=0.1, patience=int(PATIENCE/4), verbose=1)
# model_names = trained_models_path + '.{epoch:02d}-{val_acc:.2f}.hdf5'
model_checkpoint = ModelCheckpoint(EMOTION_MODEL_NAME, 'val_loss', verbose=1,
                                   save_weights_only=False, save_best_only=True)
callbacks = [model_checkpoint, csv_logger, reduce_lr, early_stop]

# loading dataset
data_loader = DataManager(USE_EMOTION_DATASET, image_size=INPUT_SHAPE[:2])
faces, emotions, usages = data_loader.get_data()
faces = process_img(faces)
num_samples, num_classes = emotions.shape
train_data, val_data = split_raf_data(faces, emotions, usages)
train_faces, train_emotions = train_data

# if os.path.exists(EMOTION_MODEL_NAME):
#     emotion_net = load_model(EMOTION_MODEL_NAME)

emotion_model.fit_generator(data_generator.flow(train_faces, train_emotions, BATCH_SIZE),
                            steps_per_epoch=len(train_faces) / BATCH_SIZE,epochs=EPOCHS,
                            verbose=1, callbacks=callbacks, validation_data=val_data)


if IS_CONVERT2TFLITE:
    converter = lite.TFLiteConverter.from_keras_model_file(EMOTION_MODEL_NAME)
    tflite_model = converter.convert()
    with open(TFLITE_NAME, "wb") as f:
        f.write(tflite_model)

truth, prediction, accuracy = \
        evaluate(USE_EMOTION_DATASET, INPUT_SHAPE, EMOTION_MODEL_NAME)
plot_log(EMOTION_LOG_NAME)
plot_emotion_matrix(USE_EMOTION_DATASET, USE_EMOTION_MODEL, truth, prediction, accuracy)

在这里插入图片描述
在这里插入图片描述

觉得不错的小伙伴,感谢点赞、关注加收藏哦!更多干货内容持续更新…

代码下载链接

关注博主的G Z H【小蜜蜂视觉】,回复【表情识别】即可获取下载方式

参考文献

[1] 基于轻量卷积网络多层特征融合的人脸表情识别. 申毫;孟庆浩;刘胤伯.激光与光电子学进展,2021
[2] TP-FER:基于优化卷积神经网络的三通道人脸表情识别方法. 高静文;蔡永香;何宗宜.计算机应用研究,2021
[3] 基于多尺度细节增强的面部表情识别方法. 谭小慧;李昭伟;樊亚春.电子与信息学报,2019
[4] 基于改进的GAN的局部遮挡人脸表情识别. 王海涌;梁红珠.计算机工程与应用,2020
[5] 面向人脸表情识别的迁移卷积神经网络研究. 翟懿奎;刘健.信号处理,2018
[6] 驾驶员不良情绪状态检测系统的方法研究. 马兴民;孙文财;徐艺;郑鹏宇.吉林大学学报(信息科学版),2015
[7] 基于卷积神经网络的人脸表情识别研究. 史浩.南昌大学,2021
[8] 基于平行生成对抗网络的遮挡表情识别研究. 孙超.吉林大学,2020
[9] 基于胶囊网络的人脸表情特征提取与识别算法研究. 姚玉倩.北京交通大学,2019
[10] Deep-Emotion: Facial Expression Recognition Using Attentional Convolutional Network. Minaee Shervin;Minaei Mehdi;Abdolrashidi Amirali.Sensors,2021
[11] Reconstruction of Partially Occluded Facial Image for Classification. Zou Min;You Mengbo;Akashi Takuya.IEEJ Transactions on Electrical and Electronic Engineering,2021
[12] E-FCNN for tiny facial expression recognition. Jie Shao;Qiyu Cheng.Applied Intelligence,2020
[13] Region Attention Networks for Pose and Occlusion Robust Facial Expression Recognition… Wang Kai;;Peng Xiaojiang;;Yang Jianfei;;Meng Debin;;Qiao Yu.IEEE transactions on image processing : a publication of the IEEE Signal Processing Society,2020
[14] Multiple Attention Network for Facial Expression Recognition. Gan Yanling;Chen Jingying;Yang Zongkai;Xu Luhui.IEEE Access,2020
[15] Dual-Path Siamese CNN for Hyperspectral Image Classification With Limited Training Samples. Huang Lingbo;Chen Yushi.IEEE Geoscience and Remote Sensing Letters,2020
[16] A Novel Facial Expression Intelligent Recognition Method Using Improved Convolutional Neural Network. Shi Min;Xu Lijun;Chen Xiang.IEEE Access,2020
[17] Deep multi-path convolutional neural network joint with salient region attention for facial expression recognition. Siyue Xie;;Haifeng Hu;;Yongbo Wu.Pattern Recognition,2019
[18] Extended Deep Neural Network for Facial Emotion Recognition. Deepak Kumar Jain;;Pourya Shamsolmoali;;Paramjit Sehdev.Pattern Recognition Letters,2019
[19] Siamese Convolutional Neural Networks for Remote Sensing Scene Classification. Xuning Liu;Yong Zhou 0003;Jiaqi Zhao;Rui Yao;Bing Liu;Yi Zheng.IEEE Geoscience and Remote Sensing Letters,2019

猜你喜欢

转载自blog.csdn.net/weixin_40280870/article/details/132535350