热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python构造自定义数据包_构建自定义人脸识别数据集的三种训练方法

在接下来的几篇文章中,我们将训练计算机视觉深度学习模型来进行面部识别。在此之前,我们首先需要收集脸部数据集。如果你已经在使用预先准备好的数据集ÿ

在接下来的几篇文章中,我们将训练计算机视觉+深度学习模型来进行面部识别。在此之前,我们首先需要收集脸部数据集。

如果你已经在使用预先准备好的数据集,比如Labeled Faces in the Wild(LFW),那么你可以省略这步。但对于大多数人来说,我们会想要识别不属于当前数据集的面部,如,识别自己,朋友,家人和同事等。

为了实现这一点,我们需要收集我们想要识别的人脸实例,然后以某种方式对其进行量化。这个过程通常被称为面部识别注册(facial recognition enrollment)。我们简称为“注册”。

本文将重点介绍注册流程的第一步:创建示例人脸的自定义数据集。

在下篇文章中,你将学习如何利用这个数据集的示例图像,量化人脸,并创建你自己的面部识别+ OpenCV应用。

如何创建自定义人脸识别数据集

在本教程中,我们将介绍三种创建面部识别自定义数据集的方法。

第一种方法将使用OpenCV和网络摄像头

(1)检测视频流中的脸部

(2)将示例脸部图像或者说帧保存到磁盘。

第二种方法将讨论如何以编程方式下载人脸图像。

最后,我们将讨论手动收集图像的方法,以及该方法何时适用。

让我们开始构建一个人脸识别数据集!

方法#1:通过OpenCV和网络摄像头进行面部注册

创建自己的自定义人脸识别数据集的第一种方法适用于以下情况:

你正在构建“现场”人脸识别系统

你需要对某个特定的人进行物理接触来收集他们脸部的示例图像

这样的系统对于公司,学校或其他需要每天出勤的组织来说是典型的。

为了收集这些人的脸部图像,我们可能会带他们到一个特殊的房间,在那里安装了一个摄像机(1)在视频流中检测他们脸部的(x,y)坐标,(2)将包含他们脸的帧写到磁盘中。

我们甚至可能会在数天或数周内执行此过程,以收集他们的脸部示例:

不同的照明条件

一天不同的时间

不同的情绪

…创建一个代表特定人脸的多样的图像数据集。

让我们写一个简单的Python脚本来帮助构建我们的自定义人脸识别数据集。这个Python脚本包括:

访问我们的摄像头

检测人脸

将包含脸部的帧写入磁盘

下载代码访问:https://www.pyimagesearch.com/2018/06/11/how-to-build-a-custom-face-recognition-dataset/

下载完成后,打开 build_face_dataset.py   并分步理解它:

# import the necessary packages

from imutils.video import VideoStream

import argparse

import imutils

import time

import cv2

import os

在 第2-7行,我们导入我们所需的软件包。值得注意的是,我们需要OpenCV和imutils 。

可以通过pip非常轻松地安装或升级 imutils:

pip install --upgrade imutils

如果你正在使用Python虚拟环境,请不要忘记使用workon命令!

现在你的环境已经建立,我们来讨论两个必需的命令行参数:

# construct the argument parser and parse the arguments

ap = argparse.ArgumentParser()

ap.add_argument("-c", "--cascade", required=True,

help = "path to where the face cascade resides")

ap.add_argument("-o", "--output", required=True,

help="path to output directory")

args = vars(ap.parse_args())

命令行参数在运行时由一个名为argparse的包进行分析 (它包含在Python的安装中)。

我们有两个必需的命令行参数:

–cascade :磁盘上Haar cascade文件的路径。

–output:输出目录的路径。人脸图像存储在此目录中,我建议你以人名的名字命名这个目录。如果名字是“John Smith”,你可以将所有图像放入dataset/john_smith。

让我们加载我们的人脸Haar cascade并初始化我们的视频流:

# load OpenCV's Haar cascade for face detection from disk

detector = cv2.CascadeClassifier(args["cascade"])

# initialize the video stream, allow the camera sensor to warm up,

# and initialize the total number of example faces written to disk

# thus far

print("[INFO] starting video stream...")

vs = VideoStream(src=0).start()

# vs = VideoStream(usePiCamera=True).start()

time.sleep(2.0)

total = 0

第二行,我们加载了OpenCV的Haar人脸检测器(detector)。detector将在逐帧循环环节工作。

我们在8行上实例化并启动我们的VideoStream。

注意: 如果你使用Raspberry Pi,请注释第8行,并取消注释第九行。

为了让我们的相机启动,我们需停顿两秒(第10行)。

我们还初始化一个total计数器,以表示存储在磁盘上的人脸图像的数量(第11行)。

现在让我们逐帧循环视频流:

# loop over the frames from the video stream

while True:

# grab the frame from the threaded video stream, clone it, (just

# in case we want to write it to disk), and then resize the frame

# so we can apply face detection faster

frame = vs.read()

orig = frame.copy()

frame = imutils.resize(frame, Frame", frame)

key = cv2.waitKey(1) & 0xFF

# if the `k` key was pressed, write the *original* frame to disk

# so we can later process it and use it for face recognition

if key == ord("k"):

p = os.path.sep.join([args["output"], "{}.png".format(

str(total).zfill(5))])

cv2.imwrite(p, orig)

total += 1

# if the `q` key was pressed, break from the loop

elif key == ord("q"):

break

在第2行,我们将框架显示在屏幕上,然后在第3行捕获按键。

根据是否按下“k”或“q”键,我们将:

将frame保存到磁盘(7-10行)。我们还添加了我们捕获的总帧数(total,第11行)。对于我们希望“保留”的每一帧,必须按下“k”键 。我建议你脸部的帧数有不同的角度,区域,带或者不带眼镜等。

退出循环并准备退出脚本(quit)。

如果没有按键被按下,我们从循环的顶部开始, 从流中抓取一个frame。

最后,我们将打印存储在终端中的图像数量并进行清理:

# print the total faces saved and do a bit of cleanup

print(“[INFO] {} face images stored”.format(total))

print(“[INFO] cleaning up…”)

cv2.destroyAllWindows()

vs.stop()

现在让我们运行脚本并收集面孔!

在你的终端执行以下命令:

$ python build_face_dataset.py --cascade haarcascade_frontalface_default.xml \

--output dataset/adrian

[INFO] starting video stream...

[INFO] 6 face images stored

[INFO] cleaning up...

在我们退出脚本后,我们会注意到6个图像已经保存到dataset的adrian子目录中:

$ ls dataset/adrian

00000.png00002.png00004.png

00001.png00003.png00005.png

我建议将面部人脸图像存储在与这个人名对应的子目录中。

完成此过程之后,你就成功建立了的自定义人脸识别数据集。

方法#2:以编程方式下载人脸图像

如果你无法物理访问目标人群或者他们是公众人物,则可以通过API在不同的平台上以编程方式下载其脸部的示例图像。

在这里选择的API取决于你想收集示例人脸图像的人。

举个例子,如果这人一直在Twitter或Instagram上发帖,则可能需要利用他们的社交媒体API中的一个来获取图像。

或者你可以利用搜索引擎,例如Google或Bing:

Google:https://www.pyimagesearch.com/2017/12/04/how-to-create-a-deep-learning-dataset-using-google-images/

bing(推荐):https://www.pyimagesearch.com/2018/04/09/how-to-quickly-build-a-deep-learning-image-dataset/

中文:http://www.atyun.com/18403.html

使用后一种方法,我能够从侏罗纪公园和侏罗纪世界的演员中下载218个示例脸部图像。

下面是通过Bing Image Search API为人物欧文·格雷迪(Owen Grady)下载人脸图像的示例命令:

$ mkdir dataset/owen_grady

$ python search_bing_api.py --query "owen grady" --output dataset/owen_grady

现在我们来看看整个数据集(删除不包含角色脸部的图像之后):

$ tree jp_dataset --filelimit 10

jp_dataset

├── alan_grant [22 entries]

├── claire_dearing [53 entries]

├── ellie_sattler [31 entries]

├── ian_malcolm [41 entries]

├── john_hammond [36 entries]

└── owen_grady [35 entries]

6 directories, 0 files

在短短20多分钟内(包括除错的时间),我就收集到了我的《侏罗纪公园》/《侏罗纪世界》的人脸数据集:

方法#3:手动收集人脸图像

创建自己的自定义人脸识别数据集的最后一种也是最不理想的一种方法,手动查找并保存示例人脸图像。

这种方法显然很无聊,需要最多的工作时间 – 通常我们更喜欢自动化的解决方案,但在某些情况下,你可能需要手动。

使用这种方法,你需要手动检查:

搜索引擎结果

社交媒体资料

照片分享服务

…然后手动将这些图像保存到磁盘。

总结

在这篇文章中,我们简要介绍了三种创建面部识别自定义数据集的方法。

你选择哪种方法完全取决于你自己的面部识别应用。



推荐阅读
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • Python操作MySQL(pymysql模块)详解及示例代码
    本文介绍了使用Python操作MySQL数据库的方法,详细讲解了pymysql模块的安装和连接MySQL数据库的步骤,并提供了示例代码。内容涵盖了创建表、插入数据、查询数据等操作,帮助读者快速掌握Python操作MySQL的技巧。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
author-avatar
喜劲瓶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有