【深度学习】基于卷积神经网络(tensorflow)的人脸识别项目(一)

这篇具有很好参考价值的文章主要介绍了【深度学习】基于卷积神经网络(tensorflow)的人脸识别项目(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

活动地址:CSDN21天学习挑战赛

前言

经过前段时间研究,从LeNet-5手写数字入门到最近研究的一篇天气识别。我想干一票大的,因为我本身从事的就是C++/Qt开发,对Qt还是比较熟悉,所以我想实现一个基于Qt的界面化的一个人脸识别。

对卷积神经网络的概念比较陌生的可以看一看这篇文章:卷积实际上是干了什么
想了解神经网络的训练流程、或者环境搭建的可以看这篇文章:环境搭建与训练流程

ps:由于前段时间有小伙伴反应虽然跟着能正常训练但是好多函数都不明白,所以我这里就对所用到的函数都做一个介绍,不要嫌啰嗦哦。

基本思路

具体步骤如下:

  1. 首先需要收集数据,我的想法是通过OpenCV调用摄像头进行收集人脸照片。
  2. 然后进行预处理,主要是对对数据集分类,训练集、验证集、测试集。选取合适的参数,例如损失函数。图像灰度化、归一化等等操作。
  3. 开始训练模型,提前创建好标签键值对。
  4. 测试人脸识别效果,通过OpenCV捕获人脸照片然后对图片进行预处理最后传入模型中,然后将识别的结果通过文字的形式打印在屏幕上,以此循环,直到输入q退出。

关于环境

版本
python 3.7.0
tensorflow 2.1
OpenCV 3.4.2
pyQt 5.15.7

OpenCV

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效–由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的接口。这些语言的API接口函数可以通过在线文档获得。如今也提供对于C#,Ch, Ruby的支持。

OpenCV具有的特征

  1. 开源计算机视觉库采用C/C++编写;
  2. 使用目的是开发实时应用程序;
  3. 独立于操作系统、硬件和图形管理器;
  4. 具有通用的图像/视频载入、保存和获取模块;
  5. 具有底层和高层的应用开发包。

OpenCV具有的功能

  1. 对图像数据的操作,包括分配、释放、复制、设置和转换数据;
  2. 对图像和视频的输入输出;
  3. 具有对矩阵和向量的操作以及线性代数的算法程序;
  4. 可对各种动态数据结构进行操作;
  5. 具有基本的数字图像处理能力;
  6. 可对各种结构进行分析;
  7. 对摄像头的定标;
  8. 对运动的分析;
  9. 对目标的识别;
  10. 具有基本的GUI功能。

安装OpenCV

建议采用Anaconda方式安装更加容易。

关键API

导入方式:import cv2

imread

功能:读取图片文件
函数原型:imread(filename, flags)
参数介绍

参数 说明
filepath 读入imge的完整路径
flags 标志位,读取图片的形式{cv2.IMREAD_COLOR,cv2.IMREAD_GRAYSCALE,cv2.IMREAD_UNCHANGED}

这里对flags的参数进行详细介绍:

标志位 说明
cv2.IMREAD_COLOR 默认参数,读入一副彩色图片,忽略alpha通道,可用1作为实参替代
cv2.IMREAD_GRAYSCALE 读入灰度图片,可用0作为实参替代
cv2.IMREAD_UNCHANGED 顾名思义,读入完整图片,包括alpha通道,可用-1作为实参替代

注:alpha通道,又称A通道,是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度复信息,定义透明、不透明和半透明区域,其中黑表示全透明,白表示不透明,灰表示半透明

namedWindow

功能·:新建一个显示窗口。可以指定窗口的类型。
函数原型:void nameWindow(const string& winname,int flags = WINDOW_AUTOSIZE) ;
参数介绍

参数 说明
winname 窗口的名称
WINDOW_AUTOSIZE 窗口的标识,默认为WINDOW_AUTOSIZE

这里对第二个参数进行了详细说明:

标识的分类 说明
WINDOW_AUTOSIZE 窗口大小自动适应图片大小,并且不可手动更改。
WINDOW_NORMAL 用户可以改变这个窗口大小
WINDOW_OPENGL 窗口创建的时候会支持OpenGL
示例

使用cv2.imshow()的时候,如果图片太大,会显示不全并且无法调整。因此在cv2.imshow()的前面加上这样的一个语句:cv2.namedWindow('image', 0),得到的图像框就可以自行调整大小,可以拉伸进行自由调整。
这里需要注意的是namedWindow和imshow中的窗口名称需要一致不然会创建多个窗口出来。
waitKey:表示等待时间,单位毫秒。0表示一直等待。

import cv2
import sys

img = cv2.imread("C:\\Users\\Administrator\\Desktop\\9.jpg", 1)  # 参数1:图片路径。参数2:显示原图
cv2.namedWindow("aa", 0)
cv2.imshow("aa", img)
cv2.waitKey(0) # 0表示不自动退出  如5000表示等待5秒

运行结果:
【深度学习】基于卷积神经网络(tensorflow)的人脸识别项目(一)

cv2.VideoCapture(0)

参数0表示默认为使用电脑的内第一个摄像头,如果需要读取已有的视频则参数改为视频所在路径路径

cap=cv2.VideoCapture('video.mp4')

CascadeClassifier

OpenCV下的data\haarcascades中有4个haar特征训练的级联分类器:

  1. haarcascade_frontalface_alt.xml
  2. haarcascade_frontalface_alt_tree.xml
  3. haarcascade_frontalface_alt2.xml
  4. haarcascade_frontalface_default.xml
    这里不对级联分类器展开讨论,有兴趣的小伙伴自己去深入了解一下啦。

在本次项目中采用的是haarcascade_frontalface_alt2.分类器。通过CascadeClassifier函数进行添加分类器。

classfier = cv2.CascadeClassifier("./model/haarcascade_frontalface_alt2.xml")

cap.isOpened()

判断视频对象是否成功读取,成功读取视频对象返回True,失败返回False。

ok, frame = cap.read()

读取一帧数据,返回值ok是布尔类型,正确读取则返回True,读取失败或读取视频结尾则会返回False。frame为每一帧的图像,这里图像是三维矩阵,即frame.shape = (640,480,3),读取的图像为BGR格式。

cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

功能:颜色空间转换函数,参数一是需要转换的图片,参数二是转换成何种格式

格式介绍

格式 说明
cv2.COLOR_BGR2RGB 将BGR格式转换成RGB格式
cv2.COLOR_BGR2GRAY 将BGR格式转换成灰度图片

classfier.detectMultiScale

功能:检测出图片中所有的人脸,并将人脸用vector保存各个人脸的坐标、大小(用矩形表示)
函数原型:void detectMultiScale(const Mat& image,CV_OUT vector & objects,double scaleFactor = 1.1,int minNeighbors = 3, int flags = 0,Size minSize = Size(),Size maxSize = Size());

参数介绍

参数 说明
image 待检测图片,一般为灰度图像加快检测速度;
objects 被检测物体的矩形框向量组;
scaleFactor 表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;
minNeighbors 表示构成检测目标的相邻矩形的最小个数(默认为3个)。如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。 如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框, 这种设定值一般用在用户自定义对检测结果的组合程序上;
flags 要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域, 因此这些区域通常不会是人脸所在区域;
minSize和maxSize 用来限制得到的目标区域的范围。

cv2.rectangle

功能:通过对角线上的两个顶点绘制简单、指定粗细或者带填充的矩形。
在这里主要用于框出人脸区域。
函数原型:void rectangle(Mat& img, Point pt1,Point pt2,const Scalar& color, int thickness=1, int lineType=8, int shift=0)

参数介绍

参数 说明
img 图像.
pt1 矩形的一个顶点。
pt2 矩形对角线上的另一个顶点
color 线条颜色 (RGB) 或亮度(灰度图像 )(grayscale image)。
thickness 组成矩形的线条的粗细程度。取负值时(如 CV_FILLED)函数绘制填充了色彩的矩形。
line_type 线条的类型。见cvLine的描述
shift 坐标点的小数点位数。

框出人脸区域
通过 OpenCV 的 Harr 分类器检测人脸,并输出识别结果(x,y,w,h)。
图片坐标以左上角为原点;
(x,y)代表人脸区域左上角坐标;
w代表人脸区域的宽度(width);
h代表人脸区域的高度(height)。

x, y, w, h = faceRect  # 原图上框出需要保存的图
color = (0, 0, 255)  # 识别出人脸后要画的边框的颜色,RGB格式

# frame 是原图,(x - 10, y - 10) 是图片的左上角的那个点,(x + w + 10, y + h + 10)是图片右下角的点 color, 2 颜色和线的宽度
cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)

imwrite

功能:用于将图像保存到指定的文件,可以为各种格式的图像。
函数原型:imwrite(const String & filename,InputArray img,const std::vector & params = std::vector<int>() )
参数介绍

参数 说明
filename 需要保存图像的文件名,要保存图片为哪种格式,就带什么后缀。
img 要保存的图像。
params 表示为特定格式保存的参数编码。

编码参数:

编码 说明
IMWRITE_JPEG_QUALITY Python :cv.IMWRITE_JPEG_QUALITY 对于JPEG,它可以是从0到100的质量(越高越好)。默认值为95。
IMWRITE_JPEG_PROGRESSIVE Python:cv.IMWRITE_JPEG_PROGRESSIVE 启用JPEG功能,0或1,默认为False。
IMWRITE_JPEG_OPTIMIZE Python:cv.IMWRITE_JPEG_OPTIMIZE 启用JPEG功能,0或1,默认为False。
IMWRITE_JPEG_RST_INTERVAL Python:cv.IMWRITE_JPEG_RST_INTERVAL JPEG重启间隔,0 - 65535,默认为0 - 无重启。
IMWRITE_JPEG_LUMA_QUALITY Python:cv.IMWRITE_JPEG_LUMA_QUALITY 单独的亮度质量等级,0 - 100,默认为0 - 不使用。
IMWRITE_JPEG_CHROMA_QUALITY Python:cv.IMWRITE_JPEG_CHROMA_QUALITY 单独的色度质量等级,0 - 100,默认为0 - 不使用。
IMWRITE_PNG_COMPRESSION Python:cv.IMWRITE_PNG_COMPRESSION 对于PNG,它可以是从0到9的压缩级别。值越高意味着更小的尺寸和更长的压缩时间。如果指定,则策略更改为IMWRITE_PNG_STRATEGY_DEFAULT(Z_DEFAULT_STRATEGY)。默认值为1(最佳速度设置)。
IMWRITE_PNG_STRATEGY Python:cv.IMWRITE_PNG_STRATEGY 其中一个品种:: ImwritePNGFlags,默认为IMWRITE_PNG_STRATEGY_RLE。
IMWRITE_PNG_BILEVEL Python:cv.IMWRITE_PNG_BILEVEL 二进制级别PNG,0或1,默认为0。
IMWRITE_PXM_BINARY Python:cv.IMWRITE_PXM_BINARY 对于PPM,PGM或PBM,它可以是二进制格式标志,0或1.默认值为1。
IMWRITE_WEBP_QUALITY Python:cv.IMWRITE_WEBP_QUALITY 覆盖EXR存储类型(默认为FLOAT(FP32))对于WEBP,它可以是1到100的质量(越高越好)。默认情况下(不带任何参数),如果质量高于100,则使用无损压缩。
IMWRITE_PAM_TUPLETYPE Python:cv.IMWRITE_PAM_TUPLETYPE 对于PAM,将TUPLETYPE字段设置为为格式定义的相应字符串值。
IMWRITE_TIFF_RESUNIT Python:cv.IMWRITE_TIFF_RESUNIT 对于TIFF,用于指定要设置的DPI分辨率单位; 请参阅libtiff文档以获取有效值。
IMWRITE_TIFF_XDPI Python:cv.IMWRITE_TIFF_XDPI 对于TIFF,用于指定X方向DPI。
IMWRITE_TIFF_YDPI Python:cv.IMWRITE_TIFF_YDPI 对于TIFF,用于指定Y方向DPI。
IMWRITE_TIFF_COMPRESSION Python:cv.IMWRITE_TIFF_COMPRESSION 对于TIFF,用于指定图像压缩方案。请参阅libtiff以获取与压缩格式对应的整数常量。注意,对于深度为CV_32F的图像,仅使用libtiff的SGILOG压缩方案。对于其他支持的深度,可以通过此标志指定压缩方案; LZW压缩是默认值。
IMWRITE_JPEG2000_COMPRESSION_X1000 Python:cv.IMWRITE_JPEG2000_COMPRESSION_X1000 对于JPEG2000,用于指定目标压缩率(乘以1000)。该值可以是0到1000.默认值是1000。

rectangle

功能:是在图像上绘制一个简单的矩形
函数原型:cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])

参数介绍

参数 说明
img 图片路径
pt1 和 pt2 分别代表矩形的左上角和右下角两个点,而且 x 坐标轴是水平方向的,y 坐标轴是垂直方向的。(当pt1坐标的x或者y 大于pt2坐标的x或者y, pt1 和 pt2 参数分别代表矩形的左下角和右上角两个点,pt1,pt2都必须是整型数)
color 矩形边框的颜色 需要注意的是这里的 (0, 0, 255) 三个分别对应 B G R
thickness 矩形边框的厚度 如果为负值,如 CV_FILLED,则表示填充整个矩形
lineType 算法的通道吧
shift 点坐标中的小数位数

cv2.FONT_HERSHEY_SIMPLEX

哈哈,这个主要是显示当前捕捉到了多少人脸图片了,这样站在那里被拍摄时心里有个数,不用两眼一抹黑傻等着。

cv2.putText

功能:在图片上添加文字
函数原型:cputText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None):

参数介绍

参数 说明
image 图片
text 要添加的文字
org 文字添加到图片上的位置
fontFace 字体的类型
fontScale 字体大小
color 字体颜色
thickness字体粗细

ord()

功能:返回一个字符的ascii值。在这里用于输入q主动结束。

代码

# coding: utf-8

import cv2
import sys

def catch_usb_video(window_name, camera_idx):
    '''使用cv2.imshow()的时候,如果图片太大,会显示不全并且无法调整。
    因此在cv2.imshow()的前面加上这样的一个语句:cv2.namedWindow('image', 0),
    得到的图像框就可以自行调整大小,可以拉伸进行自由调整。'''
    cv2.namedWindow(window_name, 0)

    # 视频来源,可以来自一段已存好的视频,也可以直接来自USB摄像头
    cap = cv2.VideoCapture(camera_idx)

    # 告诉OpenCV使用人脸识别分类器  级联分类器
    '''
    Haar特征是一种反映图像的灰度变化的,像素分模块求差值的一种特征。它分为三类:边缘特征、线性特征、中心特征和对角线特征。
    '''
    classfier = cv2.CascadeClassifier("./model/haarcascade_frontalface_alt2.xml")
    # 识别出人脸后要画的边框的颜色,RGB格式
    color = (0, 0, 255)
    num = 0
    while cap.isOpened():
        ok, frame = cap.read()  # 读取一帧数据
        if not ok:
            break
            # 将当前帧转换成灰度图像
        grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 人脸检测,1.2和2分别为图片缩放比例和需要检测的有效点数
        faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
        #  faceRects = [405 237 222 222]
        if len(faceRects) > 0:  # 大于0则检测到人脸
            for faceRect in faceRects:  # 单独框出每一张人脸
                # 在原图上框出需要保存的图
                x, y, w, h = faceRect
                cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)
                # 将当前帧保存为图片
                # frame 是原图,(x - 10, y - 10) 是图片的左上角的那个点,(x + w + 10, y + h + 10)是图片右下角的点
                # color, 2 颜色和线的宽度
                img_name = '%s/%d.jpg' % ('./deep_learning/zhangmeng', num)
                image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
                cv2.imwrite(img_name, image)
                num += 1
                if num > (500):  # 如果超过指定最大保存数量退出循环
                    break
            # 画出矩形框
            cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)
            # 显示当前捕捉到了多少人脸图片了,这样站在那里被拍摄时心里有个数,不用两眼一抹黑傻等着
            font = cv2.FONT_HERSHEY_SIMPLEX
            cv2.putText(frame, 'num:%d' % (num), (x + 30, y + 30), font, 1, (255, 0, 255), 4)
            # 超过指定最大保存数量结束程序
        if num > (500):
            break
        # 显示图像
        cv2.imshow(window_name, frame)
        c = cv2.waitKey(1)
        if c & 0xFF == ord('q'):
            break
    # 释放摄像头并销毁所有窗口
    cap.release()
    cv2.destroyAllWindows()


if __name__ == '__main__':
    catch_usb_video("face", 0)

运行结果

我一伙计友情出演 进行识别测试
【深度学习】基于卷积神经网络(tensorflow)的人脸识别项目(一)

这里也可以看到图片都正常保存了。
【深度学习】基于卷积神经网络(tensorflow)的人脸识别项目(一)

总结

那么第一步到这里就完成了,目前来说我感觉最大的难度就是了解OpenCV相关的部分API函数。并没有设计其他过多的技术。文章来源地址https://www.toymoban.com/news/detail-439553.html

到了这里,关于【深度学习】基于卷积神经网络(tensorflow)的人脸识别项目(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于 Python中的深度学习:神经网络与卷积神经网络

    当下,深度学习已经成为人工智能研究和应用领域的关键技术之一。作为一个开源的高级编程语言,Python提供了丰富的工具和库,为深度学习的研究和开发提供了便利。本文将深入探究Python中的深度学习,重点聚焦于神经网络与卷积神经网络的原理和应用。 深度学习是机器学

    2024年02月07日
    浏览(53)
  • ubuntu深度学习使用TensorFlow卷积神经网络——图片数据集的制作以及制作好的数据集的使用

    首先我事先准备好五分类的图片放在对应的文件夹,图片资源在我的gitee文件夹中链接如下: 文件管理: 用于存各种数据 https://gitee.com/xiaoxiaotai/file-management.git  里面有imgs目录和npy目录,imgs就是存放5分类的图片的目录,里面有桂花、枫叶、五味子、银杏、竹叶5种植物,npy目

    2024年02月05日
    浏览(64)
  • 【深度学习】基于卷积神经网络的铁路信号灯识别方法

    目前中国货运铁路和既有线铁路采用的仍是司机通过瞭望铁路沿线信号灯来指导行驶。本文介绍了一种基于卷积神经网络(CNN)的铁路信号“三显示”通过信号机识别方法,为司机二次甄别信号灯颜色。本文制作“三显示”信号灯数据集,在 TensorFlow 平台搭建卷积神经网络,

    2024年02月09日
    浏览(55)
  • 文本分类系统Python,基于深度学习CNN卷积神经网络

    文本分类系统,使用Python作为主要开发语言,通过TensorFlow搭建CNN卷积神经网络对十余种不同种类的文本数据集进行训练,最后得到一个h5格式的本地模型文件,然后采用Django开发网页界面,实现用户在界面中输入一段文字,识别其所属的文本种类。 在我们的日常生活和工作中

    2024年02月08日
    浏览(50)
  • 车牌识别系统Python,基于深度学习CNN卷积神经网络算法

    车牌识别系统,基于Python实现,通过TensorFlow搭建CNN卷积神经网络模型,对车牌数据集图片进行训练最后得到模型,并基于Django框架搭建网页端平台,实现用户在网页端输入一张图片识别其结果,并基于Pyqt5搭建桌面端可视化界面。 在智能交通和车辆监控领域,车牌识别技术扮

    2024年02月07日
    浏览(67)
  • 项目实战解析:基于深度学习搭建卷积神经网络模型算法,实现图像识别分类

    随着人工智能的不断发展,深度学习这门技术也越来越重要,很多人都开启了学习机器学习,本文将通过项目开发实例,带领大家从零开始设计实现一款基于深度学习的图像识别算法。 学习本章内容, 你需要掌握以下基础知识: Python 基础语法 计算机视觉库(OpenCV) 深度学习

    2024年02月03日
    浏览(61)
  • 计算机竞赛 基于深度学习的动物识别 - 卷积神经网络 机器视觉 图像识别

    🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的动物识别算法研究与实现 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 目前,由于计算机能力和相关理论的发展获得了重大突破,基于深度学

    2024年02月09日
    浏览(78)
  • Python深度学习实例--基于卷积神经网络的小型数据处理(猫狗分类)

    卷积神经网络,也叫 CNN ,它是计算机视觉应用几乎都在使用的一种深度学习模型。我们都知道,成功提取显著相关的特征是保障任何机器学习的算法成功的保障,传统的机器学习模型依赖领域专家的输入特征,或者基于计算特征的提取技术。神经网络能够自动地从原始数据

    2024年02月03日
    浏览(58)
  • 计算机竞赛 基于卷积神经网络的乳腺癌分类 深度学习 医学图像

    🔥 优质竞赛项目系列,今天要分享的是 基于卷积神经网络的乳腺癌分类 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 乳腺癌是全球第二常见的女性癌症。2012年,它占所有新癌症病例的12%,占所有女

    2024年02月11日
    浏览(51)
  • 基于深度学习,机器学习,卷积神经网络,OpenCV的交通标志识别交通标志检测

    在本文中,使用Python编程语言和库Keras和OpenCV建立CNN模型,成功地对交通标志分类器进行分类,准确率达96%。开发了一款交通标志识别应用程序,该应用程序具有图片识别和网络摄像头实时识别两种工作方式。 设计项目案例演示地址: 链接 毕业设计代做一对一指导项目方向涵

    2024年02月02日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包