【转】OpenCV人脸识别
转自:https://blog.csdn.net/learning_tortosie/article/details/85121576
写在前面
这是Adrian Rosebrock博客的第二篇翻译,原文地址请戳这里。
博客写得通俗易懂,逐行解释代码,非常适合初学者。
Introduction
在本教程中,您将学习如何使用OpenCV来执行人脸识别。为了构建我们的人脸识别系统,我们首先进行人脸检测,使用深度学习从每个人脸提取面部嵌入,在嵌入上训练人脸识别模型,然后最终使用OpenCV识别图像和视频流中的人脸。
今天的教程也是我未婚妻Trisha(现在正式为我的妻子)的特别礼物。我们的婚礼是在周末,当你正在阅读这篇博文时,我们将在机场准备搭乘我们的航班度蜜月。
为了庆祝这个场合,并向她展示她对我自己的支持,PyImageSearch博客和PyImageSearch社区对我意味着什么,我决定使用OpenCV对我们脸部的数据集进行人脸识别。
您当然可以更换自己的面部数据集!您需要做的就是按照我的目录结构插入您自己的面部图像。
作为福利,我还包括如何标记“未知”的面孔,这些面孔无法充分放心地分类。
OpenCV人脸识别
您可能想知道本教程与我几个月前用dlib进行人脸识别时所写的不同?
好吧,请记住,dlib人脸识别帖子依赖于两个重要的外部库:
- dlib(显然)
- face_recognition(这是一组易于使用的人脸识别实用程序,包含dlib)
虽然我们使用OpenCV来进行人脸识别,但OpenCV本身并不负责识别人脸。
在今天的教程中,我们将学习如何将深度学习和OpenCV一起应用(除了scikit-learn
之外没有其他库):
- 检测人脸
- 计算128维人脸嵌入以量化人脸
- 在嵌入之上训练支持向量机(SVM)
- 识别图像和视频流中的人脸
所有这些任务都将通过OpenCV完成,使我们能够获得“纯粹的”OpenCV人脸识别管道(pipeline)。
OpenCV的人脸识别如何工作
为了构建我们的OpenCV人脸识别管道,我们将在两个关键步骤中应用深度学习:
- 应用人脸检测,检测人脸在图像中的存在和位置,但不识别它
- 提取量化图像中每个面部的128维特征向量(称为“嵌入”)
我之前已经讨论过OpenCV的人脸检测是如何工作的,所以如果你以前没有检测到人脸,请参考它。
负责实际量化图像中每个面部的模型来自OpenFace项目,这是一个Python和Torch实现的面部识别和深度学习。该实现来自Schroff等人于2015年在CVPR发表的论文,FaceNet: A Unified Embedding for Face Recognition and Clustering。
查看整个FaceNet实现超出了本教程的范围,但管道(pipeline)的要点可以在上图中看到。
首先,我们将图像或视频帧输入到人脸识别管道。给定输入图像,我们应用面部检测来检测图像中面部的位置。
我们可以选择计算面部标志,使我们能够预处理和对齐面部。
顾名思义,面部对齐是:(1)识别面部的几何结构;(2)基于平移,旋转和缩放来尝试获得面部的规范对齐的过程。
虽然可选,但已经证明面部对齐可以提高某些管道中的人脸识别精度。
在我们(可选)应用人脸对齐和裁剪之后,将其输入到深度神经网络:
深度学习模型FaceNet计算128维嵌入,以量化人脸。
但网络如何实际计算面部人脸?
答案在于训练过程本身,包括:
- 输入数据到网络
- 三重损失函数
为了使用深度学习训练人脸识别模型,每个输入的批量数据包括三个图像:
- The anchor
- The positive image
- The negative image
anchor是我们当前的人脸并具有身份A。
第二张图片是我们的positive image,此图像也包含A的人脸。
另一方面,negative image不具有相同的身份,可能属于人B,C,甚至Y!
关键是anchor和positive image都属于同一个人/人脸,而negative image不包含相同的人脸。
神经网络计算每个人脸的128-d嵌入,然后调整网络的权重(通过三重损失函数),这样:
- anchor和positive image的128-d嵌入更靠近在一起
- 与此同时,将negative image的嵌入推得更远
以这种方式,网络能够学习量化面部并返回适合于面部识别的高度鲁棒且有区别的嵌入。
而且,我们实际上可以将OpenFace模型重用于我们自己的应用程序,而无需明确地训练它!
即使我们今天使用的深度学习模型(很可能)从未见过我们即将通过它的人脸,模型仍然能够为每个人脸计算嵌入,理想情况下,这些人脸嵌入将充分不同,以便我们可以在人脸嵌入的基础上训练“标准”机器学习分类器(SVM,SGD分类器,随机森林等),从而获得我们的OpenCV人脸识别管道。
如果您有兴趣了解有关三重损失的详细信息以及如何使用它来训练人脸嵌入模型,请务必参考我之前的博客文章,以及Schroff等人的论文。
我们的人脸识别数据集
我们今天使用的数据集包含三个人:
- 我
- 特丽莎(我的妻子)
- “未知”,用于表示我们不知道并希望标记的人脸(这里我只是从我之前的帖子中使用的电影“侏罗纪公园”中采样,你可能想插入自己的“未知”“数据集”)。
每个类包含六个图像。
如果您正在构建自己的人脸识别数据集,理想情况下,我建议有每个想要识别的人的10-20张图像,请务必参考这篇博客的“缺点,限制以及如何获得更高的人脸识别准确度”部分以了解更多详情。
项目结构
下载代码,并在终端使用tree
命令:
$ tree --dirsfirst
.
├── dataset
│ ├── adrian [6 images]
│ ├── trisha [6 images]
│ └── unknown [6 images]
├── images
│ ├── adrian.jpg
│ ├── patrick_bateman.jpg
│ └── trisha_adrian.jpg
├── face_detection_model
│ ├── deploy.prototxt
│ └── res10_300x300_ssd_iter_140000.caffemodel
├── output
│ ├── embeddings.pickle
│ ├── le.pickle
│ └── recognizer.pickle
├── extract_embeddings.py
├── openface_nn4.small2.v1.t7
├── train_model.py
├── recognize.py
└── recognize_video.py
相关文章:
- 人脸识别技术分析
- OpenCV加载人脸识别器出错解决办法
- 实时人脸识别
- svm 用来人脸识别_基于SVM的人脸识别
- OpenCV官方训练好的人脸识别器
- Python-OpenCV创建人脸识别器
- UWB DW1000 硬件设计
- DW1000学习笔记4 - 移植
- dw1000信标码_DW1000超宽带测距源码和原理图
- DW1000-数据传输与数据接收
- DW1000应用
- dw1000信标码_基于UWB技术的DW1000芯片简单解析
- DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信
- UWB(DW1000 关键API说明)
- 【文档】Decawave-OP-DW1000AoA-Basics
- DW1000 学习笔记3 - SPI
- DW1000芯片 室内定位传感器
- dw1000信标码_DW1000芯片定位技术解析
- UWB-DW1000初始化、发送和接收详解(一)
- DW1000开发笔记(四)DW1000使用轮询方式发送数据
- dw1000信标码_熊大UWB系列教程三:DW1000测距原理以及软件实现
- DW1000开发笔记(六)DW1000发送数据并等待另一个DW1000回应
- DW1000开发笔记(五)DW1000使用轮询方式接收数据
- DW1000 学习笔记2 - 硬件
- DW1000学习之路(二)--------使用DW1000接收数据
- DW1000开发笔记(三)基于STM32 HAL库裸机工程移植DW1000官方驱动
- Visio 文本输入不了空格
- Mac蓝牙键盘空格space与回车enter失灵问题
- 计算机键盘光标上下键失灵,键盘键位失灵_教你分析键盘失灵的原因及解决方案...
- java判断上传文件是否为Mp4文件
【转】OpenCV人脸识别相关推荐
- opencv 全志_移植opencv人脸识别到全志A10开发板上 +linux3.0内核
移植opencv人脸识别 libz: zlib-1.2.3 libjpeg: jpegsrc.v6b libpng: libpng-1.2.18 libyasm: yasm-0.7. ...
- python人脸照片分类_Python OpenCV 人脸识别(一)
前面介绍了Numpy模块,下面再介绍一个OpenCV模块,就基于这两个库看一下当下很火的人工智能是如何实现的,我们介绍几个:人脸识别(当下非常火的).音视频操作等等.今天先介绍一下静态图片的人脸识别, ...
- 图像识别——(java)opencv(人脸识别简单实现)
人脸识别 package com.acts.opencv.demo;import javax.servlet.http.HttpServletRequest; import javax.servlet ...
- Python+OpenCV人脸识别签到考勤系统(新手入门)
Python+OpenCV人脸识别签到考勤系统(新手入门) 前言 项目效果图 项目需要的环境 编译器 辅助开发QT-designer 项目配置 代码部分 核心代码 项目目录结构 后记 正式版改进 项目 ...
- python opencv人脸识别考勤系统的完整源码
这篇文章主要介绍了python opencv人脸识别考勤系统的完整源码,本文给大家介绍的非常详细,希望对大家的学习或工作具有一定的参考借鉴价值. 代码如下: import wx import wx.g ...
- openCV人脸识别简单案例
1 基础 我们使用机器学习的方法完成人脸检测,首先需要大量的正样本图像(面部图像)和负样本图像(不含面部的图像)来训练分类器.我们需要从其中提取特征.下图中的 Haar 特征会被使用,就像我们的卷积核 ...
- 【opencv人脸识别1】从图片中检测人脸
[opencv人脸识别一]从图片中检测人脸 本系列主要讲述利用opencv实现人脸识别的相关知识,并给出实际代码.且循序渐进,由基础到复杂,从最基本的图片检测人脸到视频检测.识别人脸,再到较大型人脸数 ...
- OpenCV 人脸识别 源代码
请直接查看原文 OpenCV 人脸识别 源代码 https://hotdog29.com/?p=553 在 2019年7月6日 上张贴 由 hotdog发表回复 opencv 人脸识别 在本教程中,您 ...
- 基于python opencv人脸识别的员工考勤系统
WorkAttendanceSystem 一个基于opencv人脸识别的员工考勤系统,作者某双一流A类大学里的一流学生,写于2018/09/,python课设期间. 源代码详细解释请关注微信公众号: ...
- WPF编程--OpenCV人脸识别
目录 1. 环境 2. NuGet导入依赖 3. 创建WriteableBitmapHelper.cs类 4. 编辑MainWindow.xaml.cs 5. 编辑MainWindow.xaml 1. ...
最新文章
- php如何判断提交内容为空,php不允许用户提交空表单(php空值判断)
- python 遍历listbox_Python仿evething的文件搜索器 !
- 直播技术初体验,简单实现直播不同阶段
- eMMC基础技术8:操作模式1-boot mode
- excel怎么添加diy工具箱_一秒生成工资条,你知道怎么做嘛?(一)
- 控制台下载vue_DubboAdmin管理控制台
- Microsoft AJAX Library对 String的扩展
- host速度 mtk usb_MTK功能机MT2503平台USB充电电流设置
- Mellanox IB卡介绍
- Ubuntu 20.04.2.0 LTS 下Geany 1.36的“编译文件”和“生成当前文件”两个按键不可用
- MySQL数据库的卸载与安装
- iOS中“事件”的前因后果
- 微信小程序按钮实现点击复制功能的步骤
- 求五边形的面积,输入7个数求出面积
- 基于51单片机的无线防盗报警器
- 通过360 软件管家,直接安装PinPKM V9.62
- kivy配置Buildozer
- 羊皮卷之四-我是自然界最伟大的奇迹(中英对照)
- 51单片机的基础知识——单片机简介
- 阿里人事巨变!张建锋卸任 CTO,胡晓明任蚂蚁金服 CEO