OpenCV人脸识别之一: 数据采集和预处理

优采云 发布时间: 2020-08-06 09:14

  要获得更简洁,方便的分​​类文章以及最新的课程和产品信息,请转到新展示的

  该系列人脸识别文章使用opencv2,请参考该文章以获取最新版本的opencv3.2代码:

  “ OpenCV对您的Face-C ++源代码广播的识别”;

  “人脸识别源代码操作指南”(文章末尾附有编辑器)

  前段时间已经对面部检测进行了一些尝试: 面部检测(C ++ / Python)(/ p / 504c081d7397),但是检测和识别有所不同. 检测解决的问题是图片中是否有人脸;和识别要解决的问题是,如果图片中有一张脸,那是谁的脸. 人脸检测可以使用opencv随附的分类器,但是人脸识别需要采集数据并自己训练分类器. opencv提供的面部识别教程: 使用OpenCV进行面部识别(/2.4/modules/contrib/doc/facerec/facerec_tutorial.html). 中文版本也可以在网上找到.

  俗话说,自己做. 站在巨人的肩膀上,参考前辈的经历,我终于能够确定自己的身份. 我觉得内容很多,没有时间一次全部编写,因此我将分阶段编写. 每个博客都是一个工作阶段. 初步思想分为三个部分: 数据采集和预处理,训练模型和面部识别. 今天写第一部分.

  1. 后台数据集

  opencv提供的教程中的第一个数据集,这次使用的数据集是: AT&T Facedatabase(cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html). 也称为ORL人脸数据库,可容纳40人,每人10张照片. 这些照片是在不同的时间,不同的光线,不同的表情(睁开眼睛和闭合的眼睛,是否微笑)以及不同的脸部细节(戴或不戴眼镜)下采集的. 所有图像都是在深色均匀背景下采集的,正面垂直(有些许旋转).

  下载后,它看起来像这样:

  

  

  您可以看到每个人的文件夹,并且在每个文件夹下是该人的十张照片,但它们不是熟悉的BMP,PNG或JPEG格式,而是PGM格式. Windows7随附的照片查看器和绘图软件无法打开此格式的图片.

  幸运的是,我昨天刚刚研究了imread()函数: 使用imread()函数读取图片的六个正确姿势. 因此请记住,opencv文档中有这样的描述:

  

  imread()仍然非常强大,因此编写一个程序来了解这些人的情况.

  

  2,自己的面部数据集

  1. 相机程序

  如果您想标识自己,那么拥有其他人的数据集是不够的. 您还需要一张自己的脸的照片. 这要求我们采集自己的照片,然后使用上述数据集训练模型. 我想,在用手机拍摄自拍照的过程中,为什么不编写一个程序以使用计算机的相机拍摄自拍照,我还可以研究如何使用opencv实现拍照功能. 经过一番实验(实际上花了很长时间),我终于写了一个相机程序.

  程序的功能是打开计算机*敏*感*词*,然后按P键(P是照片的第一个字母吗?还是Photo的第一个字母?还是Picture的第一个字母?),当前帧的图像被保存. 很简单,没有朋友(花了很长时间!).

  while (1)

{

char key = waitKey(100);

cap >> frame;

imshow("frame", frame);

string filename = format("D:\\pic\\pic%d.jpg", i);

switch (key)

{

case'p':

i++;

imwrite(filename, frame);

imshow("photo", frame);

waitKey(500);

destroyWindow("photo");

break;

default:

break;

}

}

  然后,我们可以运行程序并按住p键以疯狂地射击自己.

  2,预处理

  获取自己的面部照片后,需要对这些照片进行一些预处理,然后才能使用它们来训练模型. 所谓的预处理实际上是检测和分割人脸,并更改人脸的大小以使其与下载的数据集中的图像大小一致.

  在上一个博客中已经介绍了人脸检测,因此在此不再赘述. 有关详细信息,请参阅: OpenCV人脸检测(C ++ / Python)(/ p / 504c081d7397). 使用ROI进行拆分.

  检测到面部之后,更改大小以使其与ORL面部数据库的面部大小一致. 通过在Locals或ImageWatch中添加断点,可以看到ORL face数据库的大小为92 x 112.

  

  

  这里,您只需调整一次检测后获得的ROI的大小即可.

  这两个步骤的代码如下:

  std::vector faces;

Mat img_gray;

cvtColor(img, img_gray, COLOR_BGR2GRAY);

equalizeHist(img_gray, img_gray);

//-- Detect faces

face_cascade.detectMultiScale(img_gray, faces, 1.1, 3, CV_HAAR_DO_ROUGH_SEARCH, Size(50, 50));

for (size_t j = 0; j < faces.size(); j++)

{

Mat faceROI = img(faces[j]);

Mat MyFace;

if (faceROI.cols > 100)

{

resize(faceROI, MyFace, Size(92, 112));

string str = format("D:\\MyFaces\\MyFcae%d.jpg", i);

imwrite(str, MyFace);

imshow("ii", MyFace);

}

waitKey(10);

}

  这时,我们已经获得了自己的面部数据集,该数据集与ORL面部数据库的面部大小一致. 然后,我们将自己视为第41位用户,在下载的face文件夹下创建s41的子文件夹,并将其面部数据放入其中. 变成这样,最后一个文件夹是我自己的头像:

  

  最后一个at.txt被放到下一次,训练模型取决于它.

  这里有一点值得注意: 我在这里保存的图像格式是.jpg,而不是原创数据集的.pgm. 经过测试后,我仍然可以训练可以正确识别自己脸部的模型. 但是,如果大小不一致,则会报告错误.

  OpenCV对您自己的Face-C ++源代码广播的认可

  前言

  大约一年前,我在CSDN专栏“ OpenCV Practice Road”上连续发表了三个博客,这些博客充分描述了基于OpenCV的人脸识别的整个过程. 这三篇文章有近10,000篇阅读文章,大量评论表明,人脸识别确实是每个人都对学习OpenCV最感兴趣的主题之一. 当然,这也可能是本科生老师最感兴趣的话题之一.

  由于它是按照前后的过程编写的,因此源代码相对分散. 另外,我认为在上一个博客中已经发布了许多源代码,并且可以用一句话提及. 这导致许多学生的学业差异很大. 但是,由于重新安装了系统,原创的源代码丢失了,我也没有花时间重组它. 这个清明节没有出去. 根据先前的博客,源代码是根据最新的OpenCV3.2重新组织的. 现在将其发布给读者.

  差异小

  当然,重新排列不是源代码的简单集合. 如果真的那么简单,则无需整理,只需自己采集即可. 因为OpenCV3.2人脸识别的内容也略有变化. 因此,当前的代码仍然与原创的三个博客相同,但是细节有所不同.

  1. 自动拍照

  以前采集我自己的图像时,程序设置为按“ p”键拍照并在运行后保存图像,然后您需要手动将图像尺寸转换为与图像相同的尺寸. ORL人脸数据库.

  现在一切都是自动的. 只需运行它即可拍照,更改尺寸并保存. 默认设置是拍摄10张照片,这与ORL人脸数据库一致.

  2,Python脚本生成at.txt

  当我写博客时,我还没有使用Python,因此生成的at.txt不是与s1文件夹对应的标签为1,而s2则对应于2. 这很混乱. 您需要记住谁是谁.

  修改后的Python脚本可以完美地对应于文件夹和标签.

  3. 培训代码

  用于训练人脸识别模型的代码发生了一些变化,主要是因为OpenCV的变化.

  头文件和名称空间分别需要添加一个句子:

  #include

using namespace cv::face;

  更改模型创建部分,原创代码为

  Ptr model = createEigenFaceRecognizer();

Ptr model1 = createFisherFaceRecognizer();

Ptr model2 = createLBPHFaceRecognizer();

  现在更改为:

  Ptr model = createEigenFaceRecognizer(); Ptr model1 = createFisherFaceRecognizer(); Ptr model2 = createLBPHFaceRecognizer();

  其余的变化不大.

  下载Office

  源代码已上传到Github和Baidu.com. 其中,由于大小限制,github不收录我训练有素的模型.

  Github: `/ LiuXiaolong19920720 / recognise-your-own-face

  百度网盘: 链接: / s / 1nuPFthR密码: slh8

  要强调的另一件事是: 面部识别源代码操作指南

  发布人脸识别源代码后,许多朋友下载后仍然无法成功运行. 因此,我不得不将源代码更改为我认为最容易成功运行的版本. 即使这样,我认为还是有必要编写本指南. 因为反复回答同一问题太累人了.

  再重复一次,本文的环境为win7 + vs2015 + opencv3.2_with_contrib

  源代码下载地址

  网络磁盘: / s / 1b1J23O密码: kv1e(记住该网络磁盘的链接和密码,这是该系列最新代码的下载地址)

  几个问题

  首先,我将解释一些问题. 尽管有人说过,但仍有人问. 如果将来有人问,只需给他这篇文章即可.

  找不到FaceRecognizer

  FaceRecognizer位于opencv的contrib模块中的face模块中. 默认情况下,opencv正式下载的opencv没有贡献. 要实现人脸识别,您需要使用已编译contrib模块的opencv. 通常,您需要自己编译. 但是,自己编译更麻烦. 有人在Internet上共享了opencv3.2的编译版本. 下载地址如下:

  链接: / s / 1qYx3v8S密码: i0c0

  csv文件(即at.txt)很难自动生成.

  在源代码中,我编写了一个名为add_label.py的python脚本,运行该脚本可以自动生成at.txt.

  有时程序会崩溃,但黑色窗口中没有错误消息.

  一个可能的原因是,当添加其他依赖项时,调试模式最好仅添加* d.lib. 释放模式最好只添加* .lib.

  操作指南

  为方便起见,所需的ORL人脸数据库已经收录在下载的源代码文件夹中. 在配置opencv的情况下,需要执行以下步骤.

  1. 首先用VS打开face-rec.sln. 在解决方案管理器的源文件下添加take_photos.cpp. 如果源文件下还有其他cpp文件,请从项目中排除它们. 然后运行此相机程序. 如果照片效果不好,请自动调整脸部与相机之间的距离,或调整照明条件. 拍摄的照片将保存在att_faces \ s41文件夹中.

  2. 生成一个csv文件. 您需要在计算机上安装Python2. 如果是Python3,则需要注释掉print语句. 尚未测试. 如果您对python有一定的了解,那就不难了. 按住Shift并右键单击add_label.py所在的文件夹,然后选择在此处打开命令行窗口. 在命令行上输入命令: python add_label.py,按Enter键运行.

  3. 回到VS. 从项目中排除take_photos.cpp,将train.cpp添加到源文件中,然后运行. 最后,输出类似于以下内容的三行句子,以表明训练模型成功. 现在打开项目文件夹,您可以看到带有后缀xml的生成的模型文件.

  预测类别= 9 /实际类别= 9.

  4. 回到VS. 从项目中排除train.cpp,将rec-your-own-face.cpp添加到源文件中,然后运行. 此时应打开相机并识别您的脸.

  最后

  此面部识别程序只能用于学习和研究,因为准确率略低. 对于有更高要求的人,请自行探索更好的方法. 在这方面,我可以给您有限的建议.

  原创链接: / p / c722d20944f2

  CSDN博客地址: / xingchenbingbuyu / article / details / 73733490

  作者的官方帐户: 旨在共享OpenCV和Python实际内容的官方帐户CVPy,欢迎关注.

  有关更简洁,方便的分​​类文章以及最新的课程和产品信息,请移至新显示的“ LeadAI Academy官方网站”:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线