人脸图像特征提取的各种方法、笑脸识别及口罩识别
一、人脸图像特征提取的各种方法
(一)HOG
1.HOG定义
方向梯度直方图(Histogram of Oriented Gradient, HOG)是一种在计算机视觉和图像处理中用来进行物体检测的特征描述方法(特征描述方法:就是通过从图像中提取有用信息和丢弃无关信息来简化图像,并将信息运用于算法)。
Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。
2.HOG提取的图像信息
a.特征描述方法从图像中提取有用信息
b.在图像中,物体的边缘和角落包含了关于物体形状的更多信息,也就是我们平时能看到的物体轮廓。如果能够提取出图像边缘和角落的信息,将非常有利于物体检测。
c.而对于图像的边缘和角落周围的梯度这个特征,变化幅度很大,所以在HOG特征描述方法中,使用梯度方向的分布(直方图)作为它的特征。
3.HOG算法的基本流程
a.计算图像梯度
b.计算Cell中的梯度直方图
c.Block归一化
d.计算HOG特征
(二)Dlib
算法思路
Dlib实现的人脸检测方法便是基于图像的Hog特征,结合支持向量机算法实现的人脸检测功能。该算法的大致思路如下:
1 )对正样本(即包含人脸的图像)数据集提取Hog特征,得到Hog特征描述子;
2 )对负样本(即不包含人脸的图像)数据集提取Hog特征,得到Hog特征描述子;其中,负样本数据集中样本的数量要远远大于正样本数据集中的样本数,负样本图像可以使用不含人脸的图片进行随机裁剪获取;
3 )利用支持向量机算法训练正负样本,显然这是一个二分类问题,可以得到训练后的模型。
4 )利用该模型进行负样本难例检测,也就是难分样本挖掘( hard-negativemining ) ,以便提高最终模型的分类能力。具体思路为:对训练集里的负样本不断进行缩放,直至与模板匹配为止,通过模板滑动窗口搜索匹配(该过程即多尺度检测过程),,如果分类器误检出非人脸则截取该部分图像加入负样本中。
5 )结合难例样本重新训练模型,反复如此得到最终分类器模型。
(三)卷积神经网络特征
卷积神经网络最早是为了解决图像识别的问题,现在也用在时间序列数据和文本数据处理当中,卷积神经网络对于数据特征的提取不用额外进行,在对网络的训练的过程当中,网络会自动提取主要的特征.
卷积神经网络直接用原始图像的全部像素作为输入,但是内部为非全连接结构.因为图像数据在空间上是有组织结构的,每一个像素在空间上和周围的像素是有关系的,和相距很远的像素基本上是没什么联系的,每个神经元只需要接受局部的像素作为输入,再将局部信息汇总就能得到全局信息. 权值共享和池化两个操作使网络模型的参数大幅的减少,提高了模型的训练效率.
二、笑脸数据集划分、训练、测试
(一)划分
1.将train_folder文件夹下俩个文件夹内的图片的名字做修改,格式修改成猫狗的格式。
#coding=gbk
import os
import sys
def rename():
path=input("请输入路径(例如D:\\\\picture):")
name=input("请输入开头名:")
startNumber=input("请输入开始数:")
fileType=input("请输入后缀名(如 .jpg、.txt等等):")
print("正在生成以"+name+startNumber+fileType+"迭代的文件名")
count=0
filelist=os.listdir(path)
for files in filelist:
Olddir=os.path.join(path,files)
if os.path.isdir(Olddir):
continue
Newdir=os.path.join(path,name+str(count+int(startNumber))+fileType)
os.rename(Olddir,Newdir)
count+=1
print("一共修改了"+str(count)+"个文件")
rename()
分别将两个文件夹下的文件名进行修改
2.图片分类
import os, shutil #复制文件
# 原始目录所在的路径
# 数据集未压缩
original_dataset_dir1 = 'D:\\smile\\datasets\\train_folder\\1' ##笑脸
original_dataset_dir0 = 'D:\\smile\\datasets\\train_folder\\0' ##非笑脸
# 我们将在其中的目录存储较小的数据集
base_dir = 'D:\\smile1'
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_cats_dir
fnames = ['smile.{}.jpg'.format(i) for i in range(1000)]
for fname in fnames:
src = os.path.join(original_dataset_dir1, fname)
dst = os.path.join(train_cats_dir, fname)
shutil.copyfile(src, dst)
# 将下500张笑脸图像复制到validation_cats_dir
fnames = ['smile.{}.jpg'.format(i) for i in range(500)]
for fname in fnames:
src = os.path.join(original_dataset_dir1, fname)
dst = os.path.join(validation_cats_dir, fname)
shutil.copyfile(src, dst)
# 将下500张笑脸图像复制到test_cats_dir
fnames = ['smile.{}.jpg'.format(i) for i in range(500)]
for fname in fnames:
src = os.path.join(original_dataset_dir1, fname)
dst = os.path.join(test_cats_dir, fname)
shutil.copyfile(src, dst)
# 将前1000张非笑脸图像复制到train_dogs_dir
fnames = ['unsmile.{}.jpg'.format(i) for i in range(1000)]
for fname in fnames:
src = os.path.join(original_dataset_dir0, fname)
dst = os.path.join(train_dogs_dir, fname)
shutil.copyfile(src, dst)
# 将下500张非笑脸图像复制到validation_dogs_dir
fnames = ['unsmile.{}.jpg'.format(i) for i in range(500)]
for fname in fnames:
src = os.path.join(original_dataset_dir0, fname)
dst = os.path.join(validation_dogs_dir, fname)
shutil.copyfile(src, dst)
# 将下500张非笑脸图像复制到test_dogs_dir
fnames = ['unsmile.{}.jpg'.format(i) for i in range(500)]
for fname in fnames:
src = os.path.join(original_dataset_dir0, fname)
dst = os.path.join(test_dogs_dir, fname)
shutil.copyfile(src, dst)
3.新数据集的尺寸
print('total training cat images:', len(os.listdir(train_cats_dir)))
print('total training dog images:', len(os.listdir