基于机器学习的目标检测实践(人脸识别python+tensorflow)

人脸识别技术原理:人脸识别的五大技术流程,包括人脸图像的采集与预处理、人脸检测、人脸特征提取、人脸识别和活体鉴别;目前人脸识别的主要方法,包括基于特征脸的方法、基于几何特征的方法、基于深度学习的方法、基于支持向量机的方法和其他综合方法。

1. 人脸图像采集

1.1 数据集准备

首先为训练神经网络准备数据集,这里是使用了课件给出的10个人脸图像train文件夹,每个文件夹大概都有200张训练集左右,如下图:

1.2 数据增强  

200张左右的数据集还是比较单薄,训练出来的模型可能不会太准确,所以我在这里采用了多种数据增强,大概有亮度对比度调整、增加噪声、随机变形、随机变换颜色等方法。具体实现:augmented_pic.py代码

具体方法如下:

镜像翻转 (horizontal_flip 方法):

这个方法接受一张图像作为输入,然后使用OpenCV的 cv2.flip 函数对图像进行水平翻转,创建图像的镜像版本。

随机裁剪 (random_crop 方法):

这个方法接受一张图像和裁剪尺寸作为输入,然后根据裁剪尺寸在图像中随机选择一个矩形区域进行裁剪。如果图像尺寸小于裁剪尺寸,不进行裁剪。

随机旋转 (random_rotate 方法):

这个方法接受一张图像和最大旋转角度作为输入,然后随机选择一个角度在指定范围内进行旋转,使用 cv2.getRotationMatrix2D 和 cv2.warpAffine 函数来实现旋转操作。

亮度和对比度调整 (adjust_brightness_contrast 方法):

这个方法接受一张图像以及亮度和对比度参数作为输入,使用 cv2.convertScaleAbs 函数来对图像的亮度和对比度进行调整。

随机变换颜色 (random_color_change 方法):

这个方法接受一张图像和最大颜色变化值作为输入,然后分离图像的颜色通道(蓝色、绿色、红色),然后随机选择每个通道的颜色变化值,并使用 np.clip 函数来限制颜色通道的像素值在0到255之间,最后合并通道生成一个新的彩色图像。

这里给出部分代码:

然后输出的数据增强图片放在augmented_data和augmented_data2文件夹下,平均每个人脸创造出1000张数据增强图片,用来准备训练模型,效果如下:

2. 图像预处理

2.1 人脸对齐

进行模型训练之前非常重要的一步,就是对图像进行人脸对齐,有助于减小图像中的变化,使人脸更容易被识别,提高了模型的鲁棒性。

主要有以下任务:

调整角度:校正人脸的旋转角度,使人脸保持水平。

调整位置:将人脸移动到图像中的特定位置,通常是中心位置。

调整尺寸:调整人脸的尺寸,以使其具有一致的尺寸,适应模型的输入要求。

保持比例:保持人脸的比例,以避免拉伸或压缩。

这里我主要使用了MTCNN进行人脸和特征点的检测,然后再进行人脸对齐,主要代码如下:

2.2 图像裁剪

对感兴趣区域进行裁剪。图像裁剪有助于减小输入数据的维度,减少模型的计算复杂性,加快训练速度。裁剪可以提高模型的鲁棒性,减少不相关信息的干扰。对于特定任务,如对象检测或分类,确保输入图像尺寸一致有助于模型的稳定性和性能。具体代码如下:

2.3 数据集加载和输出路径

然后是加载数据增强的图像路径和本来的图像路径

输出的图像效果如下:

大概每个人脸序列能有800张识别和裁剪好的图片,这些接下来就是用来进行训练模型

3. 数据标签和图片路径的处理

3.1 数据集

加载数据集:代码从指定路径 dataset_path 中加载图像数据集,该数据集包含了不同人的脸部图像。这些图像将用于训练模型。

3.2 调整图像大小

通过 resize_image 函数,将加载的图像调整为指定的大小(IMAGE_SIZE),通常是400x400像素。这是为了确保所有图像具有相同的尺寸,以便进行模型训练。

3.3 标注数据

为每个加载的图像分配标签,标签通常表示图像所属的类别或人物。不同人物的图像可以分为不同的类别,标签通过数字表示(0, 1, 2, ...)。在代码中,不同人物的图像被分为10个类别。代码如下:

3.4 检查标签和图像

代码中的 check_labels_and_images 函数用于检查加载的图像和它们的标签是否正确匹配。它逐个加载图像,并在终端显示图像的实际标签和形状。这可以用来验证数据集的准确性和一致性。

可以通过输出的信息和显示图像检查图像有没有正确加载,效果如下:

4. 人脸识别模型构建和训练(CNN

4.1 CNN神经网络

CNN 是一种特殊类型的神经网络,专用于处理图像数据。CNN 主要包括卷积层、池化层和全连接层。它在图像处理任务中非常有效,因为它能够自动学习和提取图像中的特征。

4.2 人脸识别方面最常用的度量学习方法

是三元组损失函数 ,最早在被用于人脸识别任务。三元组损失的目标是以一定余量分开正例对之间的距离和负例对之间的距离。从数学形式上讲,对于每个三元组 i,需要满足以下条件:

【其中 x_a 是锚图像,x_p 是同一主体的图像,x_n 是另一个不同主体的图像,f 是模型学习到的映射关系,α 施加在正例对和负例对距离之间的余量。在实践中,使用三元组损失训练的 CNN 的收敛速度比使用 softmax 的慢,这是因为需要大量三元组(或对比损失中的配对)才能覆盖整个训练集】

4.3 模型使用

我的模型构建主要原理涉及神经网络和卷积网络神经网络,其中使用Keras库构建卷积神经网络(CNN)模型,主要通过学习权重和偏差来建立输入和输出之间的复杂关系。

该模型包括:

卷积层: CNN 的核心部分。它使用卷积核(也称为滤波器)来滑动在输入图像上,提取局部特征。卷积操作可以捕捉到图像中的边缘、纹理等低级特征。

激活函数:引入非线性性质,使神经网络能够学习更复杂的函数关系。在这段代码中,使用了 ReLURectified Linear Unit)作为激活函数。

池化层:用于降低图像尺寸,减少计算复杂性,并提取图像中的主要特征。最大池化是常见的池化操作,它选择每个区域中的最大值作为输出。

丢弃层和全连接层:用于将卷积层提取的特征图展平成一维向量,然后通过一系列全连接层进行分类或回归。具体代码如下:

下面的函数用于构建深度学习模型的不同类型层次,它们被定义在Model类中,并用于添加相应类型的层到模型中,具体代码如下:

4.4 主要训练过程:

创建随机梯度下降(Stochastic Gradient DescentSGD)优化器:

通过SGD类创建一个SGD优化器,指定学习率、学习率衰减、动量和Nesterov动量的参数。

编译模型:

使用self.model.compile方法编译模型,指定损失函数(categorical cross-entropy)、优化器(SGD)和评估指标(准确度)。

训练模型:

如果data_augmentationFalse,模型将使用原始的训练数据进行训练。使用self.model.fit方法,传递训练图像(dataset.train_images)、训练标签(dataset.train_labels)、批次大小、迭代次数、验证数据(dataset.valid_imagesdataset.valid_labels)以及shuffle=True表示在每轮训练前随机打乱数据。

如果data_augmentationTrue,模型将使用数据增强技术进行训练。创建一个ImageDataGenerator对象(datagen),用于对训练数据进行数据增强,包括旋转、平移和水平翻转等操作。

调用datagen.fit(dataset.train_images)以适应训练数据的统计信息。

使用self.model.fit方法,传递通过datagen.flow生成的数据流(包括增强后的图像和对应的标签),以及steps_per_epoch参数,该参数表示每个迭代(轮)的步数,通常为总训练样本数除以批次大小。

具体代码如下:

4.5 数据预处理

首先加载具体的数据集路径,十个人的数据集加起来总共差不多8675张,平均每个人800张左右进行训练

4.5.1 神经网络预测函数

主要实现根据图像数据的格式('channels_first''channels_last')来检查图像的形状,并根据需要调整大小和重塑。将图像的像素值转换为浮点数并进行归一化(范围缩放到 [0, 1])具体代码如下:

这里的具体输出参数如下:

因为使用了TensorFlow,最终经过深度学习模型训练生成一个h5模型文件,如下图:

5. 人脸识别

5.1 MTCNN人脸检测

这里我使用了MTCNN检测器检测输入图像帧中的人脸,对于每个检测到的人脸,提取其位置和尺寸,并裁剪出人脸图像,然后使用预训练的人脸识别模型对裁剪出的人脸进行识别,得出每个类别的概率。确定最可能的人脸属于哪个类别,并计算其置信度(识别率),再根据load_data的标签处理,如果置信度大于等于50%,则在图像上绘制绿色矩形框,显示预测的标签和置信度。具体代码实现:

5.2 逐帧分析

然后每个类别对应的每一帧和识别率输出在一个csv文件上,后面作为一个数据分析和对比,如下图:

5.3 命令行加载数据集

相关的人脸识别过程,这里使用了argparse库的命令行参数去读取测试数据集的路径,然后进行识别。这里初始化了模型加载路径和对应标签列表,具体代码如下:

5.4 人脸识别实现效果

这个人脸识别分类主要是使用了MTCNN检测器,效果精度很不错,因为此前图像处理和人脸检测的时候同样是使用了MTCNN。这是一种用于人脸检测的神经网络架构。它是一种级联的多任务学习网络,由三个级联的子网络组成,分别是:

P-Net(Proposal Network):负责生成候选框(bounding boxes)以及对这些框进行初步筛选。

R-Net(Refine Network):对 P-Net 生成的候选框进行进一步的筛选,同时生成更准确的边界框。

O-Net(Output Network):最终的网络,对边界框进行进一步的筛选和人脸特征点的预测。

MTCNN 的主要优势在于其能够在单个模型中完成多个任务,包括人脸检测、人脸边界框回归(bounding box regression)和人脸关键点(landmark points)定位。该模型通过级联的方式,逐步提高对人脸的检测精度。

具体效果如下:

可以看到训练出来的模型,有遮挡脸和运动模糊的数据集,识别的精确度也非常高

5.5 Haar级联分类器

在这里我还用haar级联分类器去识别人脸,发现精确度远远不如MTCNN高,但是运行速度却高了很多,代价确实每一帧的图像很难被识别到,对于遮挡和运动模糊等数据集,如下图:

5.6 数据结果分析

通过识别每个人脸,得到了每一帧的人脸识别率,输出到一个csv文件上,得出图表如下:

结果分析:

下面就具体分析一下识别率没达到90%的人脸图像是因为什么原因造成的

5.6.1 通过查看预处理好的图片,同时跟测试集(test)比较,可以看到4Dudek这个测试集有一半是没戴眼镜,而他的训练集(train)全部都是戴着眼镜的,所以这可能导致模型在未见过的情况下性能下降。如下图:

然后同样查看测试集,可以发现5FaceOcc1和6FaceOcc2,一个是很多图像集完全遮挡住了脸,导致分类器完全检测不了人脸,如下图:

而6FaceOcc的测试集是因为很多都是侧脸,导致很多识别不出来,如下图:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 实时人脸表情识别是一种基于人工智能和计算机视觉的技术,结合Python编程语言进行毕业设计的主题。该项目旨在实现对人脸表情的实时识别和分类,通过分析和判断人脸表情的变化,进而实现情感识别和情感分析。 首先,为了实现实时人脸表情识别,我们需要采集一组包含不同表情的人脸图像数据集。此数据集可以通过网络资源、开源数据集或自己采集得到。接下来,我们使用Python中的图像处理库OpenCV来获取实时视频流,并使用面部检测算法定位和提取视频流中的人脸。 然后,我们需要使用深度学习方法来训练一个人脸表情分类器。可以使用所采集到的人脸图像数据集,使用Python中的深度学习框架如TensorFlow或PyTorch来构建一个卷积神经网络(CNN)模型。该模型将接受人脸图像作为输入,经过多个卷积层和池化层进行特征提取,并使用全连接层进行分类预测。 在训练好的模型基础上,我们可以将其应用于实时人脸表情识别。通过将每一帧的人脸图像传入该模型,可以获取到实时的人脸表情分类结果。可以根据分类结果,判断人脸表情是开心、生气、惊讶等不同的情绪。 最后,为了更好地展示实时人脸表情识别的效果,我们可以将识别结果通过图像或视频的方式展示出来,比如将分类结果添加在人脸图像上方,或者在视频中不同表情时变换特定符号或贴图。 总结来说,实时人脸表情识别的毕业设计将采用Python编程语言,结合图像处理库和深度学习框架,通过建立和训练卷积神经网络模型,实现对实时人脸表情的识别和分类,并将识别结果进行展示。该项目对于理解和实践人工智能、计算机视觉和深度学习等相关领域的知识具有重要意义。 ### 回答2: 实时人脸表情识别是一种使用计算机视觉技术来检测和识别人脸表情的方法。而使用Python语言进行实时人脸表情识别的毕业设计,可以通过以下步骤来完成: 1. 数据集准备:首先需要准备一个包含多种表情的人脸图像数据集。可以使用公开的人脸表情数据集,如FER2013、CK+等,或者自己构建数据集。 2. 数据预处理:对数据集进行预处理,包括将图像进行裁剪和缩放,使其符合模型输入的要求。还可以使用数据增强技术来扩充数据集,以提高模型的泛化能力。 3. 特征提取:利用深度学习模型,如卷积神经网络(CNN),来提取人脸图像的特征。可以使用已经预训练好的CNN模型,如VGGNet、ResNet等,也可以根据具体需求自己搭建模型。 4. 模型训练:使用提取到的特征作为输入,利用训练集进行模型的训练。可以使用Python深度学习库,如Tensorflow、Keras等,来搭建和训练模型。在训练过程中,可以使用交叉验证等技术来评估模型的性能。 5. 模型验证:使用测试集对训练好的模型进行验证,评估其在实时人脸表情识别任务上的性能。可以计算模型的准确率、召回率等评价指标,或者通过混淆矩阵来分析不同表情类别的识别结果。 6. 实时表情识别:将训练好的模型应用到实时视频流中,进行人脸表情的实时识别。可以使用Python的图像处理和视频处理库来实现这一步骤,如OpenCV、Dlib等。通过实时检测人脸区域,并对每个人脸区域进行表情分类。 7. 界面设计和优化:将实时人脸表情识别算法与用户界面结合,可以使用Python的GUI库,如Tkinter等,设计一个友好的界面,使用户可以方便地进行实时人脸表情的测试和观察。 通过以上步骤的实现,我们可以完成一个基于Python的实时人脸表情识别系统。该系统可以用于情感分析、人机交互等领域,具有一定的实际应用价值。 ### 回答3: 实时人脸表情识别是一种通过使用Python编程语言开发的技术,用于实时检测和识别人脸表情。它可以分析人脸上的特征,并根据这些特征识别出人脸表情的种类,例如开心、悲伤、惊讶等。 实时人脸表情识别的毕业设计主要包括以下几个步骤: 1. 数据集准备:首先,需要准备一份包含人脸表情样本的数据集。可以通过收集照片、视频或者使用现有的数据集来构建。 2. 数据预处理:对数据进行预处理是非常重要的一步。可以使用Python图像处理库如OpenCV对图像进行裁剪、缩放和灰度化等处理,以提升后续的算法准确度。 3. 特征提取:接下来,使用Python中常用的机器学习库,如Scikit-learn或Tensorflow等,进行特征提取。可以使用基于人脸的特征提取算法,例如局部二值模式(Local Binary Patterns,LBP)或主成分分析(Principal Component Analysis,PCA),来提取人脸表情的特征。 4. 训练模型:使用已经提取的特征,建立分类器模型。可以使用各种机器学习算法,例如支持向量机(Support Vector Machine,SVM)或卷积神经网络(Convolutional Neural Network,CNN),对数据集进行训练,以使模型能够准确地识别人脸表情。 5. 实时检测和识别:最后,使用摄像头采集实时视频流,并对每一帧图像进行处理和分析,以实现人脸表情的实时检测和识别。可以使用Python库如Dlib或OpenCV中的人脸检测器和分类器,对视频流中的人脸进行定位和分类。 总结来说,实时人脸表情识别的毕业设计将通过预处理、特征提取、模型训练和实时检测等步骤,利用Python编程语言实现对人脸表情的实时检测和识别。这项技术可以应用于许多领域,例如情感分析、人机交互等,具有广泛的应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值