IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 【动手教你学人脸识别:Python实现OpenCv+CNN深度学习网络人脸识别(含完整代码)】 -> 正文阅读

[人工智能]【动手教你学人脸识别:Python实现OpenCv+CNN深度学习网络人脸识别(含完整代码)】

项目名称

动手教你学人脸识别:OpenCv+CNN深度学习网络实现人脸识别(含完整代码)

项目介绍

背景

最近在进行视觉方面的研究,发现人脸识别方向是一个非常火的方向。于是在网络上找了一些Demo来进行实现,但是找了很多Demo发现要么环境版本给的不全,导致到处都是错误,要么效果很差。因此想将自己成功实现的Demo整个环境以及代码的相关讲解记录下来,帮助大家快速实现人脸识别。如果大家没有最基础的相关知识,需要帮助,也可以私信或者评论,我看到了就会回复。

项目概览

该项目主要是使用Opencv完成人脸检测以及识别,Opencv是计算机视觉领域非常优秀的集成库,在Python中我们可以直接调用相关函数就可以完成读取图片,灰度转换以及图像显示等相关功能。

项目功能展示

功能名称

基本环境介绍

  1. Python3.6 + Win系统
  2. Opencv(使用pip install opencv-python安装即可)
  3. scipy (使用pip install scipy==1.2.1安装即可)
  4. tensorflow (pip install tensorflow==1.7.1 安装即可)
  5. keras (pip install keras 安装即可)
  6. sklearn (pip install sklearn 安装即可)
  7. h5py (pip install h5py==2.10.0 安装即可 注意该版本如果不对,则可能导致使用识别函数时无法读取模型文件)
  8. 摄像头一枚

数据集

每个人只要使用摄像头收集200张图片即可,在采集图片时会打开摄像头,一定要保持一个比较好的正面形象,不然后续训练出来的模型识别效果会比较差。文件名为get_face.py,代码如下:

def CatchPICFromVideo(window_name, camera_idx, catch_pic_num, path_name):
    cv2.namedWindow(window_name)
    # 调用摄像头
    cap = cv2.VideoCapture(camera_idx)
    data_path = "haarcascade_frontalface_default.xml"
    classfier = cv2.CascadeClassifier(data_path)
    # 识别出人脸后要画的边框的颜色,RGB格式
    color = (0, 255, 0)

    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))
        if len(faceRects) > 0:  # 大于0则检测到人脸
            for faceRect in faceRects:  # 单独框出每一张人脸
                x, y, w, h = faceRect
                # 将当前帧保存为图片
                img_name = '%s/%d.jpg ' %(path_name, num)
                image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
                cv2.imwrite(img_name, image)
                num += 1
                if num > catch_pic_num:  # 如果超过指定最大保存数量退出循环
                    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 > catch_pic_num:
            break

        # 显示图像
        cv2.imshow(window_name, frame)
        c = cv2.waitKey(10)
        if c & 0xFF == ord('q'):
            break
    # 释放摄像头并销毁所有窗口
    cap.release()
    cv2.destroyAllWindows()

该代码需要修改一处保存的文件路径,如下:

# 将下面的路径改为你自己要存储的路径,注意此处的your_name要与下文一致
save_path = ".\Face_data\your_name"
CatchPICFromVideo("Cut Face", 0, 199, save_path)

训练模型

该模型使用三个卷积和一个全连接层实现,该部分文件为train.py。具体概念大家可以自行搜索,构建网络的代码如下:

def build_model(self, dataset, nb_classes=2):
        self.model = Sequential()
        # 以下代码将顺序添加CNN网络需要的各层,一个add就是一个网络层
        self.model.add(Convolution2D(32, 3, 3, border_mode='same',
                                     input_shape=dataset.input_shape))  # 1 2维卷积层
        self.model.add(Activation('relu'))  # 2 激活函数层

        self.model.add(MaxPooling2D(pool_size=(2, 2)))  # 5 池化层
        self.model.add(Dropout(0.25))  # 6 Dropout层

        self.model.add(Convolution2D(64, 3, 3, border_mode='same'))  # 7  2维卷积层
        self.model.add(Activation('relu'))  # 8  激活函数层

        self.model.add(MaxPooling2D(pool_size=(2, 2)))  # 11 池化层
        self.model.add(Dropout(0.25))  # 12 Dropout层

        self.model.add(Flatten())  # 13 Flatten层
        self.model.add(Dense(512))  # 14 Dense层,又被称作全连接层
        self.model.add(Activation('relu'))  # 15 激活函数层
        self.model.add(Dropout(0.5))  # 16 Dropout层
        self.model.add(Dense(nb_classes))  # 17 Dense层
        self.model.add(Activation('softmax'))  # 18 分类层,输出最终结果
        # 输出模型概况
        self.model.summary()

训练模型的函数如下:

sgd = SGD(lr=0.01, decay=1e-6,
                  momentum=0.9, nesterov=True)  # 采用SGD+momentum的优化器进行训练,首先生成一个优化器对象
        self.model.compile(loss='categorical_crossentropy',
                           optimizer=sgd,
                           metrics=['accuracy'])  # 完成实际的模型配置工作

我们在训练分类的深度网络模型时,会给数据一个标签,如0为A,1为B。这样我们的模型才能知道识别的是什么。该处程序也有需要修改的位置,如下:

# 将your_name改为你的名字
labels = np.array([0 if label.endswith('your_name') else 1 for label in labels])

接下来我们需要修改训练文件的主函数部分,需要指明数据集地址以及训练好的模型的保存地址:

# 此处文件地址是你收集的图片的文件夹地址,刚才拍摄的照片主文件夹
    dataset = Dataset('D:\PyCharm-Community\Workplace\Face_Recognition\\face_data')
    dataset.load()
    model = Model()
    model.build_model(dataset)
    model.train(dataset)
# 此处地址是你保存训练好模型的地址
    model.save_model(file_path='D:\PyCharm-Community\Workplace\Face_Recognition\\face_data\model\your_name_face_model.h5')
    model.evaluate(dataset)

人脸识别

模型训练好之后,我们就可以调用训练好的模型进行测试了。文件名为:Face_recognition.py,代码如下,下面的模型地址以及人脸分类器地址都需要改为我们自己的模型地址:

if __name__ == '__main__':
    # 加载模型
    model = Model()
    # 该处一定要改为我们自己的模型地址
    model.load_model(file_path='D:\PyCharm-Community\Workplace\Face_Recognition\model\jianxin_face_model.h5')

    # 框住人脸的矩形边框颜色
    color = (0, 255, 0)

    # 捕获指定摄像头的实时视频流
    cap = cv2.VideoCapture(0)
    # 人脸识别分类器本地存储路径,该处也要改为我们自己的xml地址
    cascade_path = "D:\opencv\\build\etc\haarcascades\haarcascade_frontalface_default.xml"

    # 循环检测识别人脸
    while True:
        ret, frame = cap.read()  # 读取一帧视频
        if ret is True:
            # 图像灰化,降低计算复杂度
            frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        else:
            continue
        # 使用人脸识别分类器,读入分类器
        cascade = cv2.CascadeClassifier(cascade_path)

        # 利用分类器识别出哪个区域为人脸
        faceRects = cascade.detectMultiScale(frame_gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
        if len(faceRects) > 0:
            for faceRect in faceRects:
                x, y, w, h = faceRect
                # 截取脸部图像提交给模型识别这是谁
                image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
                faceID = model.face_predict(image)
                print("faceID", faceID)
                # 如果是“我”
                if faceID == 0:
                    cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, thickness=2)
                    # 文字提示是谁,改为你的名字
                    cv2.putText(frame, 'your_name',
                                (x + 30, y + 30),  # 坐标
                                cv2.FONT_HERSHEY_SIMPLEX,  # 字体
                                1,  # 字号
                                (255, 0, 255),  # 颜色
                                2)  # 字的线宽
                else:
                    cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, thickness=2)
                    cv2.putText(frame, 'Nobody',
                                (x + 30, y + 30),  # 坐标
                                cv2.FONT_HERSHEY_SIMPLEX,  # 字体
                                2,  # 字号
                                (255, 0, 0),  # 颜色
                                2)  # 字的线宽
                    pass
        cv2.imshow("Face Recognition", frame)
        # 等待10毫秒看是否有按键输入
        k = cv2.waitKey(10)
        # 如果输入q则退出循环
        if k & 0xFF == ord('q'):
            break
    # 释放摄像头并销毁所有窗口
    cap.release()
    cv2.destroyAllWindows()

该代码有三处需要修改,第一处是加载模型地址:

# 加载模型
model = Model()
model.load_model(file_path='D:\PyCharm-Community\Workplace\Face_Recognition\model\jianxin_face_model.h5')

第二处是xml文件地址,改为你自己的地址:

# 人脸识别分类器本地存储路径
cascade_path = "D:\opencv\\build\etc\haarcascades\haarcascade_frontalface_default.xml"

第三处是识别显示的名称,将your_name改为你想显示的名称即可:

if faceID == 0:
   cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, thickness=2)
   # 文字提示是谁
   cv2.putText(frame, 'your_name',
                     (x + 30, y + 30),  # 坐标
                     cv2.FONT_HERSHEY_SIMPLEX,  # 字体
                     1,  # 字号
                     (255, 0, 255),  # 颜色
                     2)  # 字的线宽

运行效果如下:
运行效果图

源码下载地址

完整代码下载地址

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-06-14 22:35:35  更:2022-06-14 22:38:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:22:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码