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

本文涉及的产品
视觉智能开放平台,视频资源包5000点
视觉智能开放平台,图像资源包5000点
视觉智能开放平台,分割抠图1万点
简介: 【深度学习】基于卷积神经网络(tensorflow)的人脸识别项目(一)

前言

经过前段时间研究,从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秒


运行结果:

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%;

1687251661467.png



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 表示为特定格式保存的参数编码。


编码参数:


1687251726151.png1687251733166.png


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都必须是整型数)

1687251770069.png

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)


运行结果

我一伙计友情出演 进行识别测试

这里也可以看到图片都正常保存了。

总结

那么第一步到这里就完成了,目前来说我感觉最大的难度就是了解OpenCV相关的部分API函数。并没有设计其他过多的技术。

目录
相关文章
|
6月前
|
机器学习/深度学习 TensorFlow API
基于CNN的图像识别(Tensorflow)
基于CNN的图像识别(Tensorflow)
|
6月前
|
机器学习/深度学习 算法 算法框架/工具
深度学习实战:基于TensorFlow与OpenCV的手语识别系统
深度学习实战:基于TensorFlow与OpenCV的手语识别系统
421 0
|
13天前
|
机器学习/深度学习 TensorFlow API
机器学习实战:TensorFlow在图像识别中的应用探索
【10月更文挑战第28天】随着深度学习技术的发展,图像识别取得了显著进步。TensorFlow作为Google开源的机器学习框架,凭借其强大的功能和灵活的API,在图像识别任务中广泛应用。本文通过实战案例,探讨TensorFlow在图像识别中的优势与挑战,展示如何使用TensorFlow构建和训练卷积神经网络(CNN),并评估模型的性能。尽管面临学习曲线和资源消耗等挑战,TensorFlow仍展现出广阔的应用前景。
38 5
|
5月前
|
机器学习/深度学习 人工智能 算法
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
乐器识别系统。使用Python为主要编程语言,基于人工智能框架库TensorFlow搭建ResNet50卷积神经网络算法,通过对30种乐器('迪吉里杜管', '铃鼓', '木琴', '手风琴', '阿尔卑斯号角', '风笛', '班卓琴', '邦戈鼓', '卡萨巴', '响板', '单簧管', '古钢琴', '手风琴(六角形)', '鼓', '扬琴', '长笛', '刮瓜', '吉他', '口琴', '竖琴', '沙槌', '陶笛', '钢琴', '萨克斯管', '锡塔尔琴', '钢鼓', '长号', '小号', '大号', '小提琴')的图像数据集进行训练,得到一个训练精度较高的模型,并将其
72 0
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
|
2月前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
108 12
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
3月前
|
机器学习/深度学习 数据采集 监控
使用TensorFlow进行图像识别的技术探索
【8月更文挑战第8天】使用TensorFlow进行图像识别是一项充满挑战但极具价值的工作。通过选择合适的数据集、构建有效的模型架构、进行充分的数据预处理和模型训练,可以构建出高性能的图像识别系统。随着技术的不断进步和应用的不断扩展,图像识别将在更多领域发挥重要作用。希望本文能够为您在TensorFlow框架下开展图像识别项目提供一定的参考和帮助。
|
5月前
|
机器学习/深度学习 人工智能 算法
【昆虫识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+机器学习+TensorFlow+ResNet50
昆虫识别系统,使用Python作为主要开发语言。通过TensorFlow搭建ResNet50卷积神经网络算法(CNN)模型。通过对10种常见的昆虫图片数据集('蜜蜂', '甲虫', '蝴蝶', '蝉', '蜻蜓', '蚱蜢', '蛾', '蝎子', '蜗牛', '蜘蛛')进行训练,得到一个识别精度较高的H5格式模型文件,然后使用Django搭建Web网页端可视化操作界面,实现用户上传一张昆虫图片识别其名称。
324 7
【昆虫识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+机器学习+TensorFlow+ResNet50
|
5月前
|
机器学习/深度学习 人工智能 算法
【球类识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+TensorFlow
球类识别系统,本系统使用Python作为主要编程语言,基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集 '美式足球', '棒球', '篮球', '台球', '保龄球', '板球', '足球', '高尔夫球', '曲棍球', '冰球', '橄榄球', '羽毛球', '乒乓球', '网球', '排球'等15种常见的球类图像作为数据集,然后进行训练,最终得到一个识别精度较高的模型文件。再使用Django开发Web网页端可视化界面平台,实现用户上传一张球类图片识别其名称。
175 7
【球类识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+TensorFlow
|
5月前
|
机器学习/深度学习 算法 TensorFlow
【图像识别】谷物识别系统Python+人工智能深度学习+TensorFlow+卷积算法网络模型+图像识别
谷物识别系统,本系统使用Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经算法网络模型,通过对11种谷物图片数据集('大米', '小米', '燕麦', '玉米渣', '红豆', '绿豆', '花生仁', '荞麦', '黄豆', '黑米', '黑豆')进行训练,得到一个进度较高的H5格式的模型文件。然后使用Django框架搭建了一个Web网页端可视化操作界面。实现用户上传一张图片识别其名称。
120 0
【图像识别】谷物识别系统Python+人工智能深度学习+TensorFlow+卷积算法网络模型+图像识别
|
6月前
|
机器学习/深度学习 人工智能 算法
中草药识别系统Python+深度学习人工智能+TensorFlow+卷积神经网络算法模型
中草药识别系统Python+深度学习人工智能+TensorFlow+卷积神经网络算法模型
119 0

热门文章

最新文章