环境配置

tensorflow和keras参考我之前的博客https://blog.csdn.net/A981012/article/details/106650686
下载dlib库不能从anaconda prompt中直接pip install dlib下载,要先从
https://blog.csdn.net/weixin_39954229/article/details/81878864下载dlib库,在anaconda prompt中cd 到这里whl文件下载的位置,然后使用下面的命令下载

pip install dlib-19.7.0-cp36-cp36m-win_amd64.whl


至此dlib库下载完成,然后测试是否安装成功输入python 然后输入这两句代码,得到结果而不报错说明安装成功

python
import dlib
dlib.get_frontal_face_detector()


至此环境配置完成

微笑识别

导入所需的库

import keras
import os, shutil
from keras import layers
from keras import models
from keras import optimizers
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
import scipy

微笑数据集准备

从网上下载微笑数据集,对微笑数据集进行处理,参考猫狗数据集进行划分。生成三个文件夹train、test、validation,然后在这三个文件下面有正负样本。
然后给定数据集的地址

train_dir='./smiledata/train'
train_smiles_dir='./smiledata/train/smile'
train_unsmiles_dir='./smiledata/train/unsmile'
test_dir='./smiledata/test'
test_smiles_dir='./smiledata/test/smile'
test_unsmiles_dir='./smiledata/test/unsmile'
validation_dir='./smiledata/test'
validation_smiles_dir='./smiledata/test/smile'
validation_unsmiles_dir='./smiledata/test/unsmile'

创建模型

from keras import layers
from keras import models
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
model.summary()

查看设计的模型

对图片进行处理

from keras import optimizersmodel.compile(loss='binary_crossentropy',optimizer=optimizers.RMSprop(lr=1e-4),metrics=['acc'])from keras.preprocessing.image import ImageDataGenerator
# All images will be rescaled by 1./255
train_datagen = ImageDataGenerator(rescale=1./255)
validation_datagen=ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)train_generator = train_datagen.flow_from_directory(# 目标文件目录train_dir,#所有图片的size必须是150x150target_size=(150, 150),batch_size=20,# Since we use binary_crossentropy loss, we need binary labelsclass_mode='binary')validation_generator = test_datagen.flow_from_directory(validation_dir,target_size=(150, 150),batch_size=20,class_mode='binary')
test_generator = test_datagen.flow_from_directory(test_dir,target_size=(150, 150),batch_size=20,class_mode='binary')
for data_batch, labels_batch in train_generator:print('data batch shape:', data_batch.shape)print('labels batch shape:', labels_batch)break
train_generator.class_indices

定义微笑输出为0,不微笑为1

训练模型

设计代数epochs,数据越大训练精度会提高一些,如果是GPU运行就会快很多,如果是CPU运行,建议代数适中就好。最好进行数据增强防止过拟合

history = model.fit_generator(train_generator,steps_per_epoch=100,epochs=100,validation_data=validation_generator,validation_steps=50)
datagen = ImageDataGenerator(rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,fill_mode='nearest')
model.save('smile_and_unsmiles_small_2.h5')#保存模型


保存模型后,就可以用模型来进行测试,是否可以将微笑识别出来

基于dlib库进行识别

直接用shape_predictor_68_face_landmarks.dat模型,不用自己训练模型

import sys
import dlib  # 人脸识别的库dlib
import numpy as np  # 数据处理的库numpy
import cv2  # 图像处理的库OpenCvclass face_emotion():def __init__(self):# 使用特征提取器get_frontal_face_detectorself.detector = dlib.get_frontal_face_detector()# dlib的68点模型,使用作者训练好的特征预测器self.predictor = dlib.shape_predictor("C:/Users/lanxi/Desktop/Smile_Detector-master/data/data_dlib_model/shape_predictor_68_face_landmarks.dat")# 建cv2摄像头对象,这里使用电脑自带摄像头,如果接了外部摄像头,则自动切换到外部摄像头self.cap = cv2.VideoCapture(0)# 设置视频参数,propId设置的视频参数,value设置的参数值self.cap.set(3, 480)# 截图screenshoot的计数器self.cnt = 0def learning_face(self):# 眉毛直线拟合数据缓冲line_brow_x = []line_brow_y = []# cap.isOpened() 返回true/false 检查初始化是否成功while (self.cap.isOpened()):# cap.read()# 返回两个值:#    一个布尔值true/false,用来判断读取视频是否成功/是否到视频末尾#    图像对象,图像的三维矩阵flag, im_rd = self.cap.read()# 每帧数据延时1ms,延时为0读取的是静态帧k = cv2.waitKey(1)# 取灰度img_gray = cv2.cvtColor(im_rd, cv2.COLOR_RGB2GRAY)# 使用人脸检测器检测每一帧图像中的人脸。并返回人脸数rectsfaces = self.detector(img_gray, 0)# 待会要显示在屏幕上的字体font = cv2.FONT_HERSHEY_SIMPLEX# 如果检测到人脸if (len(faces) != 0):# 对每个人脸都标出68个特征点for i in range(len(faces)):# enumerate方法同时返回数据对象的索引和数据,k为索引,d为faces中的对象for k, d in enumerate(faces):# 用红色矩形框出人脸cv2.rectangle(im_rd, (d.left(), d.top()), (d.right(), d.bottom()), (0, 0, 255))# 计算人脸热别框边长self.face_width = d.right() - d.left()# 使用预测器得到68点数据的坐标shape = self.predictor(im_rd, d)# 圆圈显示每个特征点for i in range(68):cv2.circle(im_rd, (shape.part(i).x, shape.part(i).y), 2, (222, 222, 0), -1, 8)#cv2.putText(im_rd, str(i), (shape.part(i).x, shape.part(i).y), cv2.FONT_HERSHEY_SIMPLEX, 0.5,#          (255, 255, 255))# 分析任意n点的位置关系来作为表情识别的依据mouth_width = (shape.part(54).x - shape.part(48).x) / self.face_width  # 嘴巴咧开程度mouth_higth = (shape.part(66).y - shape.part(62).y) / self.face_width  # 嘴巴张开程度# 通过两个眉毛上的10个特征点,分析挑眉程度和皱眉程度brow_sum = 0  # 高度之和frown_sum = 0  # 两边眉毛距离之和for j in range(17, 21):brow_sum += (shape.part(j).y - d.top()) + (shape.part(j + 5).y - d.top())frown_sum += shape.part(j + 5).x - shape.part(j).xline_brow_x.append(shape.part(j).x)line_brow_y.append(shape.part(j).y)# self.brow_k, self.brow_d = self.fit_slr(line_brow_x, line_brow_y)  # 计算眉毛的倾斜程度tempx = np.array(line_brow_x)tempy = np.array(line_brow_y)z1 = np.polyfit(tempx, tempy, 1)  # 拟合成一次直线self.brow_k = -round(z1[0], 3)  # 拟合出曲线的斜率和实际眉毛的倾斜方向是相反的brow_hight = (brow_sum / 10) / self.face_width  # 眉毛高度占比brow_width = (frown_sum / 5) / self.face_width  # 眉毛距离占比# 眼睛睁开程度eye_sum = (shape.part(41).y - shape.part(37).y + shape.part(40).y - shape.part(38).y +shape.part(47).y - shape.part(43).y + shape.part(46).y - shape.part(44).y)eye_hight = (eye_sum / 4) / self.face_width# 分情况讨论# 张嘴if round(mouth_higth >= 0.03):if eye_hight >= 0.056:cv2.putText(im_rd, "amazing", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX,0.8,(0, 0, 255), 2, 4)else:cv2.putText(im_rd, "smile", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8,(0, 0, 255), 2, 4)# 没有张嘴else:if self.brow_k <= -0.3:cv2.putText(im_rd, "angry", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8,(0, 0, 255), 2, 4)else:cv2.putText(im_rd, "", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8,(0, 0, 255), 2, 4)# 标出人脸数cv2.putText(im_rd, "Faces: " + str(len(faces)), (20, 50), font, 1, (0, 0, 255), 1, cv2.LINE_AA)else:# 没有检测到人脸cv2.putText(im_rd, "No Face", (20, 50), font, 1, (0, 0, 255), 1, cv2.LINE_AA)# 添加说明#im_rd = cv2.putText(im_rd, "S: screenshot", (20, 400), font, 0.8, (0, 0, 255), 1, cv2.LINE_AA)im_rd = cv2.putText(im_rd, "Q: quit", (20, 450), font, 0.8, (0, 0, 255), 1, cv2.LINE_AA)# 按下s键截图保存#if (k == ord('s')):#self.cnt += 1#cv2.imwrite("screenshoot" + str(self.cnt) + ".jpg", im_rd)# 按下q键退出if (k == ord('q')):break cv2.imshow("camera", im_rd) self.cap.release()cv2.destroyAllWindows()my_face = face_emotion()my_face.learning_face()

口罩识别

这个其实和微笑差不多,也是准备好数据集,然后进行预处理,通过建立卷积神经网络进行模型训练,并用模型测试是否能识别出到了口罩或者不带口罩。
导入所需的库

import keras
import os, shutil
from keras import layers
from keras import models
from keras import optimizers
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
import scipy

口罩数据集准备

下载口罩数据集,对口罩数据集进行处理,参考猫狗数据集进行划分。生成三个文件夹train、test、validation,然后在这三个文件下面有正负样本。
然后给定数据集的地址

train_dir='./maskdata/train'
train_masks_dir='./maskdata/train/mask'
train_unmasks_dir='./maskdata/train/unmask'
test_dir='./maskdata/test'
test_masks_dir='./maskdata/test/mask'
test_unmasks_dir='./smiledata/test/unmask'
validation_dir='./maskdata/test'
validation_masks_dir='./maskdata/test/mask'
validation_unmasks_dir='./maskdata/test/unmask'

创建模型

from keras import layers
from keras import models
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
model.summary()

查看设计的模型

对图片进行处理

from keras import optimizers
model.compile(loss='binary_crossentropy',optimizer=optimizers.RMSprop(lr=1e-4),metrics=['acc'])
from keras.preprocessing.image import ImageDataGenerator
# All images will be rescaled by 1./255
train_datagen = ImageDataGenerator(rescale=1./255)
validation_datagen=ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(# 目标文件目录train_dir,#所有图片的size必须是150x150target_size=(150, 150),batch_size=20,# Since we use binary_crossentropy loss, we need binary labelsclass_mode='binary')validation_generator = test_datagen.flow_from_directory(validation_dir,target_size=(150, 150),batch_size=20,class_mode='binary')
test_generator = test_datagen.flow_from_directory(test_dir,target_size=(150, 150),batch_size=20,class_mode='binary')
for data_batch, labels_batch in train_generator:print('data batch shape:', data_batch.shape)print('labels batch shape:', labels_batch)break
train_generator.class_indices

定义戴口罩输出为0,不戴口罩为1

训练模型

设计代数epochs

history = model.fit_generator(train_generator,steps_per_epoch=100,epochs=60,validation_data=validation_generator,validation_steps=50)
datagen = ImageDataGenerator(rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,fill_mode='nearest')
model.save('mask_and_unmask_small_2.h5')#保存模型


保存模型后,就可以用模型来进行测试,是否可以将微笑识别出来

基于dlib库的识别

import cv2
from keras.preprocessing import image
from keras.models import load_model
import numpy as np
import dlib
from PIL import Image
model = load_model('D:/mask1/masks_and_unmasks_small_2.h5')
detector = dlib.get_frontal_face_detector()
video=cv2.VideoCapture(0)
font = cv2.FONT_HERSHEY_SIMPLEX
def rec(img):gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)dets=detector(gray,1)if dets is not None:for face in dets:left=face.left()top=face.top()right=face.right()bottom=face.bottom()cv2.rectangle(img,(left,top),(right,bottom),(0,255,0),2)img1=cv2.resize(img[top:bottom,left:right],dsize=(150,150))img1=cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)img1 = np.array(img1)/255.img_tensor = img1.reshape(-1,150,150,3)prediction =model.predict(img_tensor)    if prediction[0][0]>0.5:result='unmask'else:result='mask'cv2.putText(img, result, (left,top), font, 2, (0, 255, 0), 2, cv2.LINE_AA)cv2.imshow('Video', img)
while video.isOpened():res, img_rd = video.read()if not res:breakrec(img_rd)if cv2.waitKey(5) & 0xFF == ord('q'):break
video.release()
cv2.destroyAllWindows()

如有错误请指正!
参考:
https://blog.csdn.net/weixin_41770169/article/details/80925342.
http://www.cnblogs.com/AdaminXie/
https://github.com/coneypo/Smile_Detector
https://blog.csdn.net/lxzysx/article/details/107126764

基于dlib库进行微笑识别和口罩识别相关推荐

  1. 基于Dlib库的人脸表情分析与识别——Python

    本项目主要由包含我在内的四名成员共同完成:孙明喆.吴震.张晨.张明 项目介绍,及可执行文件.模型文件.详细报告均在GitHub中可以查看: GitHub 关于项目的详细介绍,可能过些日子在复习时候会有 ...

  2. 【人脸识别】基于dlib库实现人脸特征值提取

    一.Dlib库介绍与安装 1. Dlib库简介 Dlib库是一个机器学习的开源库,包含了机器学习的很多算法,使用起来很方便,直接包含头文件即可,并且不依赖于其他库(自带图像编解码库源码).Dlib可以 ...

  3. 人脸图像特征提取的各种方法、笑脸识别及口罩识别

    人脸图像特征提取的各种方法.笑脸识别及口罩识别 一.人脸图像特征提取的各种方法 (一)HOG 1.HOG定义 2.HOG提取的图像信息 3.HOG算法的基本流程 (二)Dlib (三)卷积神经网络特征 ...

  4. Opencv之多目标追踪(基于Dlib库)

    Dlib介绍 Dlib是一个包含机器学习算法的C++开源工具包.Dlib可以帮助您创建很多复杂的机器学习方面的软件来帮助解决实际问题.目前Dlib已经被广泛的用在行业和学术领域,包括机器人,嵌入式设备 ...

  5. 基于dlib库关键点检测(图片和视频)demo

    环境win10,python3.9,dlib-19.22.9 安装dlib库存在很多问题,尤其是在win10上,记录了存在的问题,供参考: dlibyou俩个版本,一个是使用到GPU和cuda的版本 ...

  6. python中dlib库_python 基于dlib库的人脸检测的实现

    本周暂时比较清闲,可以保持每日一更的速度. 国外身份证项目新增需求,检测出身份证正面的人脸.最开始考虑mobilenet-ssd,经同事提醒,有现成的人脸库dlib,那就用传统方法尝试一下. dlib ...

  7. 人脸识别(摄像头)——基于face_recognition库

    目录 1.需要用到的方法 2.人脸识别的流程 3.测试代码 1.需要用到的方法 官方指南参考: face_recognition package - Face Recognition 1.4.0 do ...

  8. Pytorch实现戴口罩人脸检测和戴口罩识别(含训练代码 戴口罩人脸数据集)

    Pytorch实现戴口罩人脸检测和戴口罩识别(含训练代码 戴口罩人脸数据集) 目录 Pytorch实现戴口罩人脸检测和戴口罩识别(含训练代码 戴口罩人脸数据集) 1.戴口罩识别的方法 (1)基于多类别 ...

  9. Opencv项目实战:基于dlib的疲劳检测

    文章目录 一.项目简介 二.算法原理 三.环境配置 3.1.dlib人脸检测器:dlib.get_frontal_face_detector() 3.2.dlib关键点定位工具:shape_predi ...

最新文章

  1. 《C++成员函数重载、覆盖与隐藏》
  2. python读写csv确定编码格式_Python使用utf8编码读写csv文件
  3. Java TreeMap 和 TreeSet 源码解析
  4. Unity 3D:在现有的Android游戏场景中显示AdMob的横幅
  5. windowsserver服务器维护,Windows Server服务器日常管理技巧
  6. 仿 小米运动_小米有品上架“黑科技”床垫,让你睡在“空气”上,改变睡眠体验...
  7. java简易记账软件_0006JavaSE简单的项目FamilyAccount家庭记账控制台应用程序
  8. sql 查询 tag_Askgit:给git增加个翅膀,用sql挖掘仓库的信息
  9. seq2seq模型_用 CNN 实现 Seq2Seq 模型
  10. h5实现一键复制到粘贴板 兼容iOS
  11. emu8086打印等腰三角形
  12. 【Java】指定【微信】好友自动发送消息
  13. LoopClosing中为什么要使用剥离尺度的sim3计算投影匹配
  14. 【机器学习】【可解释性】LIME
  15. 交换机和路由器技术-07-静态路由配置
  16. php时区问题,php时区问题
  17. 《30天自制操作系统》学习笔记--第11天
  18. 再见2020,你好2021(2020年度总结)
  19. 专属微信公众号消息推送(java版)
  20. css画三角形(面试题)

热门文章

  1. 聊聊C++标准库,准标准库中关于时间的概念和用法
  2. photoshop中怎么绘制虚线
  3. android 发送短信例子
  4. Ubuntu安装企业微信解决中文字体乱码的问题
  5. 设计师悲剧:你一天内要完成100张海报
  6. 如何解读测试结果出现负数
  7. 提问:微信网页授权到第三方调用错误、调用微信公众号扫码登陆错误、微信SCOP权限错误或没有权限
  8. Ubuntu 20.04 实现Windows 复制粘贴
  9. java线程游戏V4之飞机大战(二)
  10. 哈哈哈哈哈哈不错测试一下测试一下哈哈哈哈哈哈不错测试一下测试一下