专栏名称: AI科技大本营
迎来到AI科技大本营。这里汇集了优秀的AI学习者,技术大咖和产业领袖;提供接地气的实战课程。在这里和优秀的人一起成长。
目录
相关文章推荐
量子位  ·  DeepSeek-R1秘籍轻松迁移,最低只需 ... ·  21 小时前  
爱可可-爱生活  ·  【[1.7k星]best-system-de ... ·  22 小时前  
爱可可-爱生活  ·  【Copier-uv:为Python项目提供 ... ·  昨天  
爱可可-爱生活  ·  【[1k星]kro-run/kro:Kube ... ·  昨天  
营销之美  ·  DeepSeek使用图鉴:人类和AI谁在玩弄谁? ·  3 天前  
营销之美  ·  DeepSeek使用图鉴:人类和AI谁在玩弄谁? ·  3 天前  
51好读  ›  专栏  ›  AI科技大本营

女朋友啥时候怒了?Keras识别面部表情挽救你的膝盖

AI科技大本营  · 公众号  · AI  · 2019-11-03 16:27

正文


作者 | 叶圣
出品 | AI科技大本营(ID:rgznai100)


【导读】随着计算机和AI新技术及其涉及自然科学的飞速发展,整个社会上的管理系统高度大大提升,人们对类似人与人之间的交流日渐疲劳而希望有机器的理解。 计算机系统和机械人如果需要像生物那样具备解读和传达感情的战斗能力,将彻底转变人与计算机系统两者之间的的关系,使计算机系统需要更佳地为生物公共服务。 表情识别是感情解读的根基,是计算机系统解读人们感情的必要,也是人们探寻和解读人工智能的有效途径。

图片表情识别是所指从等价的动态影像或静态录像中的分离出来特定的眼神稳定状态 ,从而确认被辨识单纯的认知焦虑,构建计算机系统对图片眼神的解读与辨识 ,彻底转变人与计算机系统的的关系,从而超过更佳的嵌入式。 因此,图片表情识别在精神病学、智能机器人、人工智能监视、虚拟实境及制备动画电影等各个领域有相当大的潜在应用于商业价值。

面部表情识别技术是最近几十年来才发展起来的,由于面部表情的生态环境和复杂性,并且涉及生物化学及心理学,表情识别不具备较大的趣味性,因此,与其它生物识别技术如辨识、虹膜识别、人脸识别等相比发展状况较慢,运用于还不广泛。 但是表情识别对于操作系统却有重要的潜力,因此国内外很多研究中心、政府机构及学者致力于这方面的研究,并己经取得了一定的成果。
那么下面我们将用Keras搭建面部表情识别的模型。

首先准备数据集,如图所示:


将图片放在不同的文件夹下,文件夹名字就为他的标签名。

下面将建立神经网络代码。
首先导入需要使用的库:

from keras.models import Sequential
from keras.layers import Conv2D,MaxPool2D,Activation,Dropout,Flatten,Dense
from keras.optimizers import Adam
from keras.preprocessing.image import ImageDataGenerator,img_to_array,load_img
from keras.models import load_model

下面为了充分利用数据集,对图片加入一些裁剪等方面操作:

train_datagen = ImageDataGenerator(
    rotation_range = 40,     # 随机旋转度数
    width_shift_range = 0.2, # 随机水平平移
    height_shift_range = 0.2,# 随机竖直平移
    rescale = 1/255,         # 数据归一化
    shear_range = 20,       # 随机错切变换
    zoom_range = 0.2,        # 随机放大
    horizontal_flip = True,  # 水平翻转
    fill_mode = 'nearest',   # 填充方式
)

下面是网络层的搭建,利用卷积神经网络,下面每段代码有注释:

添加一个卷积层,传入固定宽高三通道的图片,以32种不同的卷积核构建32张特征图,

卷积核大小为3*3,构建特征图比例和原图相同,激活函数为relu函数。

model.add(Conv2D(input_shape=(IMG_W,IMG_H,3),filters=32,kernel_size=3,padding='same',activation='relu'))

再次构建一个卷积层

model.add(Conv2D(filters=32,kernel_size=3,padding='same',activation='relu'))

构建一个池化层,提取特征,池化层的池化窗口为2*2,步长为2。

model.add(MaxPool2D(pool_size=2,strides=2))

继续构建卷积层和池化层,区别是卷积核数量为64。

model.add(Conv2D(filters=64,kernel_size=3,padding='same',activation='relu'))
model.add(Conv2D(filters=64,kernel_size=3,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=2,strides=2))

继续构建卷积层和池化层,区别是卷积核数量为128。

model.add(Conv2D(filters=128,kernel_size=3,padding='same',activation='relu'))
model.add(Conv2D(filters=128,kernel_size=3,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=2, strides=2))

model.add(Flatten()) #数据扁平化
model.add(Dense(128,activation='relu')) #构建一个具有128个神经元的全连接层
model.add(Dense(64,activation='relu')) #构建一个具有64个神经元的全连接层
model.add(Dropout(DROPOUT_RATE)) #加入dropout,防止过拟合。
model.add(Dense(CLASS,activation='softmax')) #输出层

接下来是训练和保存的代码:

model.fit_generator( #模型拟合
                    train_generator,  #训练集迭代器
                    steps_per_epoch=len(train_generator), #每个周期需要迭代多少步(图片总量/批次大小=11200/64=175)
                    epochs=EPOCHS, #迭代周期
                    validation_data=test_generator, #测试集迭代器
                    validation_steps=len(test_generator) #测试集迭代多少步
                    )
model.save('{}.h5'.format(SAVE_PATH)) #保存模型

然后预测显示我们的代码:

image = load_img("56.jpg")
image = image_change(image)
img=cv2.imread("56.jpg")
img_PIL = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
myfont = ImageFont.truetype(r'C:/Windows/Fonts/simfang.ttf', 40)
draw = ImageDraw.Draw(img_PIL)
draw.text((300, 10), label[model.predict_classes(image)][0], font=myfont, fill=(200, 100, 0))
img_OpenCV = cv2.cvtColor(np.asarray(img_PIL), cv2.COLOR_RGB2BGR)
cv2.imshow('frame', img_OpenCV)
cv2.waitKey(0)

如果要调用摄像头就是这样的代码:

cap = cv2.VideoCapture(0)
while True:
    _,frame = cap.read()
    bg = "temp.png"
    cv2.imwrite(bg,frame)
    image = load_img("temp.png")
    #plt.imshow(image)
    image = image_change(image)
    img=cv2.imread("temp.png")
    img_PIL = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
myfont = ImageFont.truetype(r'C:/Windows/Fonts/simfang.ttf'40)
draw = ImageDraw.Draw(img_PIL)
draw.text((30010), label[model.predict_classes(image)][0], font=myfont, fill=(2001000))
img_OpenCV = cv2.cvtColor(np.asarray(img_PIL), cv2.COLOR_RGB2BGR)
cv2.imshow('frame', img_OpenCV)
key = cv2.waitKey(1) & 0xFF

if key == ord("q"):
        break

最终输出我们的实验效果:


由此可见其模型基本准确。
下面简单介绍表情识别的重要性和发展。

20世纪70至90年代,澳大利亚神经学Ekman 和 Friesen对人的表情识别做出了开创性的探索。 Ekman定义了生物体的6种表情状态: 喜欢 (Love)、生气(Angry)、惊讶 (Surprise)、忧虑(In)、厌恶(Disgust)和悲伤(Sad),证实了识别表情类别; 其次是创立了面部动作编码系统(Facial Freedom Control System,FACS),使研究者按照该系统,将一系列照片的动作分为两组(Freedom Services,AU)来描述照片面部动作,通过照片风格和表情的的关系,进而检测照片面部细微表情。

1978年,Suwa等人对一段视频进行了照片表情识别的最初处理,引发了一系列在照片和视频表情方面工作的展开。 到七十年代至九十年代,随着图像处理与神经网络技术的蓬勃发展,使得照片表情识别的计算机自动化处理变得可能,G Mase和 A Pentland是其中的奠基人。






请到「今天看啥」查看全文