tensorflow人脸识别_「深度学习」用TensorFlow实现人脸识别(附源码,快速get技能)...

2023-11-17

本文将会带你使用python码一个卷积神经网络模型,实现人脸识别,操作难度比较低,动手跟着做吧,让你的电脑认出你那帅气的脸。

由于代码篇幅较长,而且最重要的缩进都没了,建议直接打开源码或者点击分享->复制链接,然后到浏览器里观看,执行顺序(源码在src目录下)获取人脸数据:catchFace.py制作数据集:python mkDataset.py训练cnn:python trainFace.py测试:python testFace.py源码地址:https://gitee.com/face-id/practice/tree/release%2Fopencv-tensorflow-convol-camera-sample/

适合的读者:了解机器学习基础知识(线性代数、微积分求导求偏导);了解卷积神经网络;了解TensorFlow;熟悉python;最好用卷积神经网络实践过“手写数字识别”

011666af732e7894160dd5ac5ad13bd4.png

图片来源于网络,有疑问请联系庄大叔

目录

  • 准备工作
  • 获取人脸数据
  • 制作人脸数据集(分为训练集和测试集)
  • 构建并训练cnn(重点)
  • 识别人脸
  • 总结

准备工作

Python3.x;

tensorflow(深度学习框架,可以用anaconda安装);

opencv(Python图像处理库);

摄像头(用于捕获人脸数据);

获取人脸数据

出于习惯,我把各个独立的小功能都封装成一个函数,因此函数比较多,但都比较简单。

1.导包

import sysimport cv2import osimport shutil

2.声明配置

#type取值TYPE_TRAIN = 'train'TYPE_TEST = 'test'#cv2识别出人脸后使用的颜色COLOR_CV2_FRONTALFACE = (0, 255, 0)#识别出的人脸坐标要往外拓宽多少FACE_GIRD_EXT_SIZE = 10#图片储存地址PATH_FACE_SAVE = "D:bruceface-idpracticedataface"#一个人需要取多少张训练样本和测试样本SUM_OF_FACE_TRAIN = 200SUM_OF_FACE_TEST = 50#cv2人脸识别分类器地址PATH_CLASSFIER_CV2_FRONTALFACE_ALT2 = "C:ProgramDataAnaconda3Libraryetchaarcascadeshaarcascade_frontalface_alt2.xml"# 告诉OpenCV使用人脸识别分类器classfier = cv2.CascadeClassifier(PATH_CLASSFIER_CV2_FRONTALFACE_ALT2)#统计已经保存了多少张人脸num = 0

3.函数定义

def getFaceSavePath(name, num, type): ''' 获取该张人脸的存放路径 :param name '人名' :param num '第几张人脸' :param type '训练类型' :return '存放路径' ''' return '{}/{}/{}/{}.jpg'.format(PATH_FACE_SAVE, name, type, num+1)#-----------------头条里不能换行,函数分割线------------------def getFaceGird(face_rect): ''' 获取人脸坐标 ''' x, y, w, h = face_rect t = y + h + FACE_GIRD_EXT_SIZE #top r = x + w + FACE_GIRD_EXT_SIZE #right b = y - FACE_GIRD_EXT_SIZE #bottom l = x - FACE_GIRD_EXT_SIZE #left return t, b, r, l#-----------------头条里不能换行,函数分割线------------------def discernAndSaveFace(frame, name, type, sum): ''' 识别人脸并保存 ''' global num # 将当前桢图像转换成灰度图像 grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 人脸检测,scaleFactor和minNeighbors分别为图片缩放比例和需要检测的有效点数 face_rects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32)) #如果只有一张人脸则保存当前帧 if len(face_rects) == 1: t, b, r, l = getFaceGird(face_rects[0]) #坐标 image = frame[b: t, l: r] cv2.imwrite(getFaceSavePath(name, num, type), image) num += 1 #标记人脸 if len(face_rects) > 0: for face_rect in face_rects: # 单独框出每一张人脸 t, b, r, l = getFaceGird(face_rect) #坐标 # 框出人脸 cv2.rectangle(frame, (l, b), (r, t), COLOR_CV2_FRONTALFACE, 2) # 统计当前捕捉的人脸数量 cv2.putText(frame, '{} num:{}/{}'.format(type, num, sum), (l + 30, b + 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 255), 4)#-----------------头条里不能换行,函数分割线------------------def buildFaceDir(name): ''' 创建/清空目标文件夹 :param name '人名' ''' dir = '{}/{}'.format('D:bruceface-idpracticedataface', name) if os.path.isdir(dir): shutil.rmtree(dir) os.mkdir(dir) #存放训练数据 os.mkdir('{}/{}'.format(dir, TYPE_TRAIN)) #存放测试数据 os.mkdir('{}/{}'.format(dir, TYPE_TEST))#-----------------头条里不能换行,函数分割线------------------def catchFaceFromCamera(name): ''' 从摄像头捕捉人脸并保存为训练/测试样本 :param name 人名 ''' global num print('start to catch face of {}'.format(name)) #要捕捉的人脸总数 catch_sum = SUM_OF_FACE_TRAIN # 调用摄像头,conf.CAMERA_IDX为摄像头索引,默认为0 cap = cv2.VideoCapture(0) #构建该人脸的存放目录 buildFaceDir(name) #开始捕捉数据(人脸) current_type = TYPE_TRAIN while True: #训练数据捕捉完了,则捕捉测试数据 if num >= catch_sum and current_type == TYPE_TRAIN: current_type = TYPE_TEST num = 0 catch_sum = SUM_OF_FACE_TEST #测试数据也捕捉完了,则退出 elif num >= catch_sum and current_type == TYPE_TEST: break #其他情况则退出 elif num >= catch_sum: raise Exception('current_type error') # 读取一帧数据 if cap.isOpened()==False: break ok, frame = cap.read() if not ok: break #识别人脸并保存 if current_type==TYPE_TRAIN: discernAndSaveFace(frame, name, TYPE_TRAIN, SUM_OF_FACE_TRAIN) else: discernAndSaveFace(frame, name, TYPE_TEST, SUM_OF_FACE_TEST) # 显示图像 cv2.imshow(name, frame) #监听输入,按esc退出 c = cv2.waitKey(10) if c & 0xFF == 27: break # 释放摄像头并销毁所有窗口 cap.release() cv2.destroyAllWindows()

4.执行

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tensorflow人脸识别_「深度学习」用TensorFlow实现人脸识别(附源码,快速get技能)... 的相关文章

  • com.mongodb.MongoSocketReadTimeoutException: Timeout while receiving message

    报错 com mongodb MongoSocketReadTimeoutException Timeout while receiving message at com mongodb connection InternalStreamC
  • C++ list容器详解

    C list容器 list容器的基本概念 1 list的构造函数 2 list的赋值和交换 3 list的大小操作 4 list的插入和删除 5 list的数据存取 6 list的反转与排序 7 list的排序案例 list容器的基本概念
  • Vue 源码解读(12)—— patch

    当学习成为了习惯 知识也就变成了常识 感谢各位的 关注 点赞 收藏和评论 新视频和文章会第一时间在微信公众号发送 欢迎关注 李永宁lyn 文章已收录到 github 仓库 liyongning blog 欢迎 Watch 和 Star 前言
  • linux系统提示只读文件系统,无法创建文件

    可能磁盘写保护 第一步 df h 确定文件夹对应的磁盘 第二步 mount ro为只读 rw为可读可写 可以用mount命令看看ro的分区 如果发现有ro 就重新mount 如 umount dev sda1 mount dev sda1
  • 备战2022,Android中高级面试必知必会

    在过去不久的金九银十 有些小伙伴已经找到了理想的工作 当然也有很多小伙伴因为准备不充分 面试挂了 临近年关 最近有很多网友都在求大厂面试题 正好我在9月份和10月份整理和收集了 Android 中高级面试真题解析 于是就发上来分享给大家 这
  • 如何使用matlab读取excel中的表格数据

    如何使用matlab读取excel中的表格数据 设备系统 win10 操作软件 matlab2020b 1 首先打开matlab软件 点击 新建 脚本 2 在脚本中输入代码 A xlsread C Users Administrator D
  • [附源码]java毕业设计订单管理系统

    项目运行 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEclispe Sts都支持 项目技术 SSM mybatis Ma
  • 【操作系统】虚拟内存的最大容量和实际容量的区别(以一道例题开头)

    实际内存为什么是2GB 512MB 因为实际容量是取CPU寻址 2 32B 与内存与外存之和 2GB 512MB 的最小值 就是相当于 数学里面两个值取最小值一样
  • gdbserver配置、远程调试以及ssh配置

    引言 GDB调试主要有两种方法 1 直接在目标板上通过gdb调试程序 2 在目标板上通过gdbserver运行程序 在宿主机上通过gdb调试程序 本篇文章主要来说明一下gdbserver远程调试的方法 主要以VScode举例说明 步骤 一
  • idea下载Scala插件(详细)

    目录 1 idea下载Scala 2 点击 Restart IDE 重启IDEA即可 3 创建scala目录 4 Mark scala目录为 source root 5 在windows的电脑安装scala jdk并且配置 环境变量 6 在
  • labelImg支持中文标注的文件

    链接 https pan baidu com s 1XCuLTlKRN7gVxJdQkcKnUw 密码 iaws
  • 读者-写者问题 (操作系统-进程)

    读者 写者问题 读进程优先算法 写者优先算法 问题描述 有读者和写者两组并发进程 共享一个文件 当两个或两个以上的读进程同时访问共享数据时不会产生副作用 但若某个写进程和其他进程 读进程或写进程 同时访问共享数据时则可能导致数据不一致的错误
  • 用vue3+elementplus做的一个滚动菜单栏的组件

    目录 起因 概览 设计及解决思路 1 滚动条竖起来 2 绑定菜单 3 吸附 优化 组件全部代码 起因 在elementplus中看到了滚动条绑定了slider 但是这个感觉很不实用 在底部 而且横向滚动 最常见的应该是那种固定在左上角的带着
  • 交叉编译适配mips架构的GDB

    交叉编译GDB 交叉编译GDB 1 下载GDB源码 2 解压并创建安装目录 3 编译安装 4 可能遇到的错误解决方法 1 下载termcap 2 将上面的编译安装gdb的脚本改一下 3 对于最后的权限不够无法删除PC机上termcap h文
  • 使用UE4(UnrealEngine)创建工程

    UE4系列文章目录 文章目录 UE4系列文章目录 前言 一 步骤 1 打开UE4软件 2 新建工程 3 选择游戏类型模板 4 项目设置 运行游戏 前言 使用UE4 UnrealEngine 创建工程 我这里的ue4版本是4 27 2 一 步
  • stm32循迹小车详细制作过程(附加完全版代码)

    stm32循迹小车详细制作过程 一 材料准备 1 主控板 Stm32f103c8t6 推荐 便宜够用 2 下载器 USB转TTL串口模块 3 电源 12v锂电池组 配套充电器 推荐下图这种 方便 好接线 12v 12v 12v 4 电机驱动
  • No module named ‘dateutil‘解决

    运行程序报错 无法直接pip install dateutil 需要pip install python dateutil
  • [非线性控制理论]6_滑模控制 (sliding mode control)

    非线性控制理论 1 Lyapunov直接方法 非线性控制理论 2 不变性原理 非线性控制理论 3 基础反馈稳定控制器设计 非线性控制理论 4 反馈线性化 反步法 非线性控制理论 5 自适应控制器 Adaptive controller 非线
  • CF 935E - Fafa and Ancient Mathematics

    CF 935E Fafa and Ancient Mathematics 题目描述 定义合法数学表达式 E E E 为一个数或两个合法数学表达式中间加上一个加或减运算符 并且在外面加上一对括号 给定一个合法数学表达式 将其中加减运算符用

随机推荐

  • QML Image内部缓存导致的问题

    QML Image BUG BUG描述 两个界面login qml 和 modify qml 页面 内部代码大致如下 Camera id camera imageProcessing whiteBalanceMode CameraImage
  • python实现vlookup_干货一:怎么在python里面实现vlookup

    vlookup应该是excel里用的比较多的功能 我刚接触excel的时候 反正觉得这个功能非常神奇 省了很多事 但是用久了以后就发现vlookup的限制太多了 第一大痛点 只能往右边 gt 找 如果要往左边找 最笨的办法就是把要找的col
  • rpm软件包解读

    一 linux应用程序与系统命令关系 二 典型应用程序的目录结构 三 常见的软件包封装类型 RPM包管理工具 RPM软件包管理器RED HAT PACKAGE MANAGER 由Red Hat公司提出 被众多linux发行版所采用 建立统一
  • 【机器学习】Q-Learning详细介绍

    Q learning Q learning 是一种机器学习方法 它使模型能够通过采取正确的操作来迭代学习和改进 Q learning属于强化学习的算法 通过强化学习 可以训练机器学习模型来模仿动物或儿童的学习方式 好的行为会得到奖励或加强
  • 如何从几何角度上理解方程组只有一个解_线性方程组的解集及其几何意义

    由于这三者之间的等价关系 我们解决现实问题时可以自由选取其中任意一个作为模型 我个人认为 线性方程组是最 质朴 的形式 向量方程则是与几何建立了关系 这将方便我们进行更直观的推理 矩阵方程则是向量方程的一种 封装 是向量方程的一种抽象 它将
  • Hotspot 垃圾回收之ConcurrentMarkSweepThread 源码解析

    目录 一 ConcurrentGCThread 二 SurrogateLockerThread 1 make 2 loop manipulatePLL 三 ConcurrentMarkSweepThread 1 定义 2 start和构造方
  • 微服务系列(六) 服务熔断与服务降级

    一 背景 分布式系统环境下 服务间类似依赖非常常见 一个业务调用通常依赖多个基础服务 如下图 对于同步调用 当库存服务不可用时 商品服务请求线程被阻塞 当有大批量请求调用库存服务时 最终可能导致整个商品服务资源耗尽 无法继续对外提供服务 并
  • element-ui表格列el-table-column如何根据数据不同显示不同的值,获取prop值

    方法一 格式化数据 在使用element ui的表格时 有时候后台给你的字段和你要显示在表格列里的内容不一致 例如后台给的字段是state 它的值为true或false 要求显示在表格里是 正确 或 错误 这时可以给el table col
  • FreeRTOS轻量级同步--任务通知

    1 简介 在FreeRTOS的配置参数中的configUSE TASK NOTIFICATIONS宏打开 一般RTOS会默认打开 如图1所示 图1 notify宏开关 RTOS在创建任务时 会创建一个32位的通知值ulNotifiedVal
  • C#中await Task.Run 返回值

    using System using System Text using System Collections Generic using System Threading using System Threading Tasks name
  • Cadence Allegro PCB设计88问解析(十一) 之 Allegro中文件自动保存时间设置

    一个学习信号完整性的layout工程师 大家在设计图纸或者编辑文档时 最常点击的应该就是保存图标了 谁也不想因为软件闪退 电脑断电等情况 我们的劳动成果就白白的消失了 在我们用Allegro进行PCB设计 就会有一个自动保存的功能 每隔一段
  • 一文看懂L1、L2正则化的区别

    正则化是一种为了减小测试误差的行为 有时候会增加训练误差 我们在构造机器学习模型时 最终目的是让模型在面对新数据的时候 可以有很好的表现 当你用比较复杂的模型比如神经网络 去拟合数据时 很容易出现过拟合现象 训练集表现很好 测试集表现较差
  • 牛顿迭代法求解二元非线性方程组,C++代码实现

    整体迭代公式就是 上式中 为的雅克比矩阵 为雅克比矩阵的逆矩阵 实例 求解的x和y的解 上面求根问题可转化为的问题 即可用牛顿迭代法求解此二元非线性方程 具体求解过程代码如下所示 线性方程组中方程个数 未知量个数 include
  • 推荐书目

    深入理解计算机系统 原书第2版 作 者 美 Randal E Bryant David R O Hallaron 著 出 版 社 机械工业出版社 图书定价 99 00 准备看看 C C 从入门到高手所有必备PDF书籍收藏 喜欢的朋友支持下吧
  • 经典的python基础练习

    假设市面上有4种面值 硬币 20元 10元 5元 1元 输入一个钱数 能够使用最少的硬币凑成这个钱数 def mon money ss 0 0 0 0 coinKinds 20 10 5 1 for i in range len coinK
  • 代码覆盖率与测试覆盖率你选哪个?

    目录 一 概念 二 代码覆盖率 三 为什么要执行代码覆盖率 四 如何执行代码覆盖率 五 代码覆盖率工具 六 测试覆盖率 七 如何执行测试覆盖率 八 测试覆盖率工具 九 代码覆盖率与测试覆盖率 哪一个 十 测试覆盖范围的优势 十一 测试覆盖范
  • 2017年全国数学建模国赛B题题目、解题思路、matlab代码(三)

    题目 移动互联网的迅速发展使得任务完成新模式 众包 的实现成为可能 这种自助式服务模式以移动互联网为劳务众包平台 通过线上 APP 建立起需要商业检查和信息搜集的企业与可以完成规定任务的大众之间的联系 从而大大节省企业调查成本 有效地保证调
  • 设计模式读书笔记

    希望通过记录一些关键点做到实际开发中能够得心应手 目录 状态模式 策略模式 观察者模式 装饰者模式 适配器模式 外观模式 抽象工厂模式 工厂方法模式 单例模式 命令模式 模板方法模式 迭代器模式 组合模式 代理模式 建造者模式 桥接 Bri
  • c语言,通讯录

    目录 test c contact h contact c 我们先创建三个不同的文件 分别是主体函数test c 函数实现contact c 和头文件contact h test c 制作一个简单的目录即可 记得包含头文件 include
  • tensorflow人脸识别_「深度学习」用TensorFlow实现人脸识别(附源码,快速get技能)...

    本文将会带你使用python码一个卷积神经网络模型 实现人脸识别 操作难度比较低 动手跟着做吧 让你的电脑认出你那帅气的脸 由于代码篇幅较长 而且最重要的缩进都没了 建议直接打开源码或者点击分享 gt 复制链接 然后到浏览器里观看 执行顺序