目录

前言

一.图片准备

二.代码

1.将人脸检测出来并对图片进行裁剪

2. 划分数据集

3.提取人脸并判别是否为笑脸

4.调用模型检测微笑

三.参考资料


前言

阅读附件1,利用所提供的人脸微笑数据集(genki4k),训练一个微笑/非微笑识别模型,完成对人脸图片的微笑与非的识别,输出训练(train)和测试(test)的精度值(F1-score和ROC);然后保存这个模型,将其应用到人脸实时采集视频的微笑检测中,当检测到微笑人脸,视频窗口输出“smile”,否则输出“non  smile”;当识别结果准确时,按“s”键,保存10张对应分类的图片到本地目录。人脸表情特征的选择不限,可以是HoG、SIFT、dlib(68个关键点), 训练算法采用SVM(sklearn或libsvm)。

一.图片准备

二.代码

1.将人脸检测出来并对图片进行裁剪


import dlib         # 人脸识别的库dlib
import numpy as np  # 数据处理的库numpy
import cv2          # 图像处理的库OpenCv
import os# dlib预测器
detector = dlib.get_frontal_face_detector()
# shape_predictor_68_face_landmarks.dat文件的位置 之前有下载过 可见前面的文章里
predictor = dlib.shape_predictor('D:/ProgramData/wenjian/shape_predictor_68_face_landmarks.dat')# 读取图像的路径
path_read = "D:\\**\\genki4k\\files"
num=0
for file_name in os.listdir(path_read):#aa是图片的全路径aa=(path_read +"/"+file_name)#读入的图片的路径中含非英文img=cv2.imdecode(np.fromfile(aa, dtype=np.uint8), cv2.IMREAD_UNCHANGED)#获取图片的宽高img_shape=img.shapeimg_height=img_shape[0]img_width=img_shape[1]# 用来存储生成的单张人脸的路径,要先在你的文件里建好files1文件path_save="D:\\**\\genki4k\\files1" # dlib检测dets = detector(img,1)print("人脸数:", len(dets))for k, d in enumerate(dets):if len(dets)>1:continuenum=num+1# 计算矩形大小# (x,y), (宽度width, 高度height)pos_start = tuple([d.left(), d.top()])pos_end = tuple([d.right(), d.bottom()])# 计算矩形框大小height = d.bottom()-d.top()width = d.right()-d.left()# 根据人脸大小生成空的图像img_blank = np.zeros((height, width, 3), np.uint8)for i in range(height):if d.top()+i>=img_height:# 防止越界continuefor j in range(width):if d.left()+j>=img_width:# 防止越界continueimg_blank[i][j] = img[d.top()+i][d.left()+j]img_blank = cv2.resize(img_blank, (200, 200), interpolation=cv2.INTER_CUBIC)cv2.imencode('.jpg', img_blank)[1].tofile(path_save+"\\"+"file"+str(num)+".jpg") # 正确方法

运行结果

  • 共识别出3878张图片。
    某些图片没有识别出人脸(运行结果中显示人脸数0),所以没有裁剪保存,可以自行添加图片补充。

2. 划分数据集

import os, shutil
# 原始数据集路径(前面用来存储生成的单张人脸的路径)
original_dataset_dir = 'D:\\**\\genki4k\\files1'# 新的数据集(这里不用自己新建,会自己生成)
base_dir = 'D:\\**\\genki4k\\files2'
os.mkdir(base_dir)# 训练图像、验证图像、测试图像的目录
train_dir = os.path.join(base_dir, 'train')
os.mkdir(train_dir)
validation_dir = os.path.join(base_dir, 'validation')
os.mkdir(validation_dir)
test_dir = os.path.join(base_dir, 'test')
os.mkdir(test_dir)train_cats_dir = os.path.join(train_dir, 'smile')
os.mkdir(train_cats_dir)train_dogs_dir = os.path.join(train_dir, 'unsmile')
os.mkdir(train_dogs_dir)validation_cats_dir = os.path.join(validation_dir, 'smile')
os.mkdir(validation_cats_dir)validation_dogs_dir = os.path.join(validation_dir, 'unsmile')
os.mkdir(validation_dogs_dir)test_cats_dir = os.path.join(test_dir, 'smile')
os.mkdir(test_cats_dir)test_dogs_dir = os.path.join(test_dir, 'unsmile')
os.mkdir(test_dogs_dir)# 复制1000张笑脸图片到train_c_dir
fnames = ['file{}.jpg'.format(i) for i in range(1,900)]
for fname in fnames:src = os.path.join(original_dataset_dir, fname)dst = os.path.join(train_cats_dir, fname)shutil.copyfile(src, dst)fnames = ['file{}.jpg'.format(i) for i in range(900, 1350)]
for fname in fnames:src = os.path.join(original_dataset_dir, fname)dst = os.path.join(validation_cats_dir, fname)shutil.copyfile(src, dst)# Copy next 500 cat images to test_cats_dir
fnames = ['file{}.jpg'.format(i) for i in range(1350, 1800)]
for fname in fnames:src = os.path.join(original_dataset_dir, fname)dst = os.path.join(test_cats_dir, fname)shutil.copyfile(src, dst)fnames = ['file{}.jpg'.format(i) for i in range(2127,3000)]
for fname in fnames:src = os.path.join(original_dataset_dir, fname)dst = os.path.join(train_dogs_dir, fname)shutil.copyfile(src, dst)# Copy next 500 dog images to validation_dogs_dir
fnames = ['file{}.jpg'.format(i) for i in range(3000,3878)]
for fname in fnames:src = os.path.join(original_dataset_dir, fname)dst = os.path.join(validation_dogs_dir, fname)shutil.copyfile(src, dst)# Copy next 500 dog images to test_dogs_dir
fnames = ['file{}.jpg'.format(i) for i in range(3000,3878)]
for fname in fnames:src = os.path.join(original_dataset_dir, fname)dst = os.path.join(test_dogs_dir, fname)shutil.copyfile(src, dst)

3.提取人脸并判别是否为笑脸

# 导入包
import numpy as np
import cv2
import dlib
import random#构建随机测试集和训练集
from sklearn.svm import SVC #导入svm
from sklearn.svm import LinearSVC #导入线性svm
from sklearn.pipeline import Pipeline #导入python里的管道
import os
import joblib#保存模型
from sklearn.preprocessing import StandardScaler,PolynomialFeatures #导入多项式回归和标准化
import tqdm
folder_path='D:/**/genki4k/'
label='labels.txt'#标签文件
pic_folder='files/'#图片文件路径
#获得默认的人脸检测器和训练好的人脸68特征点检测器
def get_detector_and_predicyor():#使用dlib自带的frontal_face_detector作为我们的特征提取器detector = dlib.get_frontal_face_detector()"""功能:人脸检测画框参数:PythonFunction和in Classesin classes表示采样次数,次数越多获取的人脸的次数越多,但更容易框错返回值是矩形的坐标,每个矩形为一个人脸(默认的人脸检测器)"""#返回训练好的人脸68特征点检测器predictor = dlib.shape_predictor('D:/ProgramData/wenjian/shape_predictor_68_face_landmarks.dat')return detector,predictor
#获取检测器
detector,predictor=get_detector_and_predicyor()
def cut_face(img,detector,predictor):   #截取面部img_gry=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)rects = detector(img_gry, 0)  if len(rects)!=0:mouth_x=0mouth_y=0landmarks = np.matrix([[p.x, p.y] for p in predictor(img,rects[0]).parts()])for i in range(47,67):#嘴巴范围mouth_x+=landmarks[i][0,0]mouth_y+=landmarks[i][0,1]mouth_x=int(mouth_x/20)mouth_y=int(mouth_y/20)#裁剪图片img_cut=img_gry[mouth_y-20:mouth_y+20,mouth_x-20:mouth_x+20]return img_cutelse:return 0#检测不到人脸返回0
#提取特征值
def get_feature(files_train,face,face_feature):for i in tqdm.tqdm(range(len(files_train))):img=cv2.imread(folder_path+pic_folder+files_train[i])cut_img=cut_face(img,detector,predictor)if type(cut_img)!=int:face.append(True)cut_img=cv2.resize(cut_img,(64,64))#padding:边界处理的paddingpadding=(8,8)winstride=(16,16)hogdescrip=hog.compute(cut_img,winstride,padding).reshape((-1,))face_feature.append(hogdescrip)else:face.append(False)#没有检测到脸的face_feature.append(0)
def filtrate_face(face,face_feature,face_site): #去掉检测不到脸的图片的特征并返回特征数组和相应标签   face_features=[]#获取标签label_flag=[]with open(folder_path+label,'r') as f:lines=f.read().splitlines()#筛选出能检测到脸的,并收集对应的labelfor i in tqdm.tqdm(range(len(face_site))):if face[i]:#判断是否检测到脸#pop之后要删掉当前元素,后面的元素也要跟着前移,所以每次提取第一位就行了face_features.append(face_feature.pop(0))label_flag.append(int(lines[face_site[i]][0])) else:face_feature.pop(0)datax=np.float64(face_features)datay=np.array(label_flag)return datax,datay
def PolynomialSVC(degree,c=10):#多项式svmreturn Pipeline([# 将源数据 映射到 3阶多项式("poly_features", PolynomialFeatures(degree=degree)),# 标准化("scaler", StandardScaler()),# SVC线性分类器("svm_clf", LinearSVC(C=10, loss="hinge", random_state=42,max_iter=10000))])
#svm高斯核
def RBFKernelSVC(gamma=1.0):return Pipeline([('std_scaler',StandardScaler()),('svc',SVC(kernel='rbf',gamma=gamma))])
def train(files_train,train_site):#训练'''files_train:训练文件名的集合train_site :训练文件在文件夹里的位置'''#是否检测到人脸train_face=[]#人脸的特征数组train_feature=[]#提取训练集的特征数组get_feature(files_train,train_face,train_feature)#筛选掉检测不到脸的特征数组train_x,train_y=filtrate_face(train_face,train_feature,train_site)svc=PolynomialSVC(degree=1)svc.fit(train_x,train_y)return svc#返回训练好的模型
def test(files_test,test_site,svc):#预测,查看结果集'''files_train:训练文件名的集合train_site :训练文件在文件夹里的位置'''#是否检测到人脸test_face=[]#人脸的特征数组test_feature=[]#提取训练集的特征数组get_feature(files_test,test_face,test_feature)#筛选掉检测不到脸的特征数组test_x,test_y=filtrate_face(test_face,test_feature,test_site)pre_y=svc.predict(test_x)ac_rate=0for i in range(len(pre_y)):if(pre_y[i]==test_y[i]):ac_rate+=1ac=ac_rate/len(pre_y)*100print("准确率为"+str(ac)+"%")return ac
#设置hog的参数
winsize=(64,64)
blocksize=(32,32)
blockstride=(16,16)
cellsize=(8,8)
nbin=9
#定义hog
hog=cv2.HOGDescriptor(winsize,blocksize,blockstride,cellsize,nbin)
#获取文件夹里有哪些文件
files=os.listdir(folder_path+pic_folder)
ac=float(0)
for j in range(10):site=[i for i in range(4000)]#训练所用的样本所在的位置train_site=random.sample(site,3600)#预测所用样本所在的位置test_site=[]for i in range(len(site)):if site[i] not in train_site:test_site.append(site[i])files_train=[]#训练集,占总数的十分之九for i in range(len(train_site)):files_train.append(files[train_site[i]])#测试集files_test=[]for i in range(len(test_site)):files_test.append(files[test_site[i]])svc=train(files_train,train_site)ac=ac+test(files_test,test_site,svc)save_path='D:/1azanshi/genki4k/save'+str(j)+'(hog).pkl'joblib.dump(svc,save_path)
ac=ac/10
print("平均准确率为"+str(ac)+"%")

输出结果

4.调用模型检测微笑

def smile_detector(img,svc):cut_img=cut_face(img,detector,predictor)a=[]if type(cut_img)!=int:cut_img=cv2.resize(cut_img,(64,64))#padding:边界处理的paddingpadding=(8,8)winstride=(16,16)hogdescrip=hog.compute(cut_img,winstride,padding).reshape((-1,))a.append(hogdescrip)result=svc.predict(a)a=np.array(a)return result[0]else :return 2
##图片检测
pic_path='D:/1azanshi/genki4k/longl.jpg'
img=cv2.imread(pic_path)
result=smile_detector(img,svc7)
if result==1:img=cv2.putText(img,'smile',(21,50),cv2.FONT_HERSHEY_COMPLEX,2.0,(0,255,0),1)
elif result==0:img=cv2.putText(img,'no smile',(21,50),cv2.FONT_HERSHEY_COMPLEX,2.0,(0,255,0),1)
else:img=cv2.putText(img,'no face',(21,50),cv2.FONT_HERSHEY_COMPLEX,2.0,(0,255,0),1)
cv2.imshow('video', img)
cv2.waitKey(0)

结果

三.参考资料

微笑识别(HOG+SVM+opencv+python):
微笑识别(HOG+SVM+opencv+python)_junseven164的博客-CSDN博客
人脸表情识别:
人脸表情识别_Pilipalaaaaa的博客-CSDN博客
Python人脸识别微笑检测:
人脸表情识别_Pilipalaaaaa的博客-CSDN博客

SVM算法应用综合练习(2)--人脸微笑识别相关推荐

  1. Python人脸微笑识别2-----Ubuntu16.04基于Tensorflow卷积神经网络模型训练的Python3+Dlib+Opencv实现摄像头人脸微笑检测

    Python人脸微笑识别2--卷积神经网络进行模型训练目录 一.微笑数据集下载 1.微笑数据集下载 2.创建人脸微笑识别项目 3.数据集上传至Ubuntu人脸微笑识别项目文件夹 二.Python代码实 ...

  2. 人脸微笑识别,满足你鉴别女神的微笑

    1.人脸微笑识别,安装opencv-python库,使用命令 pip install opencv-python 2.找到人脸检测模型,haarcascade_frontalface_default. ...

  3. 基于SVM算法的人脸微笑识别

    一.环境搭建 安装项目所需要的包: 包括sklearn.pandas.joblib等: 哪些红色就安装哪些 二.下载数据集 我用的是genki-4k数据集,后面我会提供整个项目,包括数据集,也可以自己 ...

  4. 【计算视觉】人脸属性识别算法 | 性别+种族+年龄+表情

    随着社会的发展,快速有效的自动身份验证在安防领域变的越来越迫切.由于生物特性是人的内在属性,具有很强的自身稳定性和个体差异性,是身份验证的最理想依据.利用人脸属性进行身份验证又是最自然直接的手段,相比 ...

  5. 【完结】如何掌握基于图像和视频的人脸表情识别,这9篇文章可以作为一个参考...

    文/编辑 | 言有三 人脸表情识别(Facial Expression Recognition,FER)作为人脸识别技术中的一个重要组成部分,近年来在人机交互.安全.机器人制造.自动化.医疗.通信和驾 ...

  6. SVM算法人脸表情识别

    SVM算法人脸表情识别 前言 一.算法简介 (一)流程 (二)原理图 (三)HOG特征提取原理 二.代码实现 三.总结 参考资料 前言 准备资料 百度网盘 链接:https://pan.baidu.c ...

  7. 基于SVM算法的人脸表情识别

    基于SVM算法的人脸

  8. 人脸识别SVM算法实现--参考麦子学院彭亮机器学习基础5.2

    #本例为人脸识别的SVM算法 #首先fetch_lfw_people导入数据 #其次对数据进行处理,首先得到X,y,分割数据集为训练集和测试集,PCA降维,然后训练 #最后查看正确率,classifi ...

  9. 【图像识别】基于支持向量机算法svm实现脸部动态特征人脸表情识别附matlab代码

    1 简介 人脸表情识别技术涉及情感计算,图像处理,机器视觉模式识别,生物特征识别等研究领域,是一个极富挑战性的交叉课题.该文介绍一种基于lpq特征,利用支持向量机(SVM)进行分类的人脸表情识别技术. ...

最新文章

  1. 数据结构之数组定义及基本操作(转)
  2. systemverilog硬件设计及建模_3D建模和渲染都吃什么硬件?设计师该如何选购电脑...
  3. LeetCode-19 删除链表的倒数第N个节点
  4. 【AI视野·今日Robot 机器人论文速览 第十七期】Thu, 1 Jul 2021
  5. 宝塔 ftp 不能连接 列出时出错
  6. 方舟生存进化服务器Linux,方舟生存进化官方服务器与私人服务器有什么区别
  7. Cisco Router WEB管理
  8. 2021最新最细致的IDEA集成SVN工具的使用 (入门到精通)
  9. PSP3000/2000V3用5.03-GEN-C系统安装使用教程
  10. 24考研数学复习方法、全年规划
  11. 卷积神经网络超详细介绍1
  12. 如何检查java代码有误_Java代码查错题
  13. FPGA-10:设计个简单的cpu(真的简单!)
  14. linux俄罗斯方块源程序,《俄罗斯方块游戏》项目实作【附源码】
  15. python画羊_Artbreeder 给我画一只电子羊
  16. linux看剩余电量命令,Linux终端如何检查笔记本电脑电池的状态和电量
  17. 【 线性回归 Linear-Regression torch模块实现与源码详解 深度学习 Pytorch笔记 B站刘二大人(4/10)】
  18. iphone,ipad分辨率大全
  19. webp 项目总结以及思考
  20. 2021年安全员-A证考试题库及安全员-A证新版试题

热门文章

  1. 二叉树遍历-层序-递归
  2. css33d图片轮播_手把手教你用纯css3实现轮播图效果
  3. linux环境下如何安装DHCP服务器及示例
  4. 一英寸芯片大小_英寸,究竟是多大?
  5. VR这张旧船票,能否登上元宇宙这艘宇宙飞船?
  6. 顶尖文案app_17个文案网站 5款短视频软件,自媒体人必备,直接拿走不谢
  7. 如何写出好文案,不妨看看这篇(上)
  8. 【uni-app】总结uni-app订单支付和打包发布
  9. 如何搭建职业教育智慧课堂?
  10. SpringBoot整合Shiro学习(上)