首页 > 其他分享 >Keras搭建CNN进行人脸识别系列(四)--为模型训练准备人脸数据

Keras搭建CNN进行人脸识别系列(四)--为模型训练准备人脸数据

时间:2022-10-26 21:37:48浏览次数:85  
标签:10 人脸识别 name Keras -- cv2 学习 num 人脸


       机器学习最本质的地方就是基于海量数据统计的学习,说白了,机器学习其实就是在模拟人类儿童的学习行为。举一个简单的例子,成年人并没有主动教孩子学习语言,但随着孩子慢慢长大,自然而然就学会了说话。那么孩子们是怎么学会的呢?很简单,在人类出生之前,有了听觉开始,就开始不断听到各种声音。人类的大脑会自动组织、分类这些不同的声音,形成自己的认识。随着时间的推移,大脑接收到的声音数据越来越多。最终,大脑利用一种我们目前尚未知晓的机制建立了一个成熟、可靠的声音分类模型,于是孩子们学会了说话。机器学习也是如此,要想识别出这张人脸属于谁,我们同样需要大量的本人和其他人的人脸数据,然后将这些数据输入Tensorflow这样的深度学习(深度学习指的是深度神经网络学习,乃机器学习分支之一)框架,利用深度学习框架建立属于我们自己的人脸分类模型。只要数据量足够,分类准确率就能提高到足以满足我们需求的级别。

        日本程序员提供的源码利用了keras这个深度学习库来训练自己的人脸识别模型。keras是一个上层的神经网络学习库,纯python编写,被集成进了Tensorflow和Theano这样的深度学习框架。其存在的目的就是简化开发复杂度,能够让你迅速出产品,更关键的是,keras有中文文档;),有兴趣的请点这里:​​keras中文文档​​。由于我的机器已经安装了Tensorflow,因此我直接使用了keras的Tensorflow版。同时,为了验证其它深度学习库的效率和准确率,当然也为了满足我的好奇心,我还使用了Theano,利用CNN——卷积神经网络来训练我的人脸识别模型。我会在接下来的几节讲述这些内容,本节专注把训练数据准备好。

        首先,我们需要大量自己的脸部图片,怎么获取呢?很简单,利用前两节讲到的知识就可以了,我们只是在前面代码的基础上增加脸部图像存储功能即可,先把完整代码贴出来:

# -*- coding: utf-8 -*-

import cv2
import sys

from PIL import Image


def CatchPICFromVideo(window_name, camera_idx, catch_pic_num, path_name):
cv2.namedWindow(window_name)

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

# 告诉OpenCV使用人脸识别分类器
classfier = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")

# 识别出人脸后要画的边框的颜色,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()


if __name__ == '__main__':
if len(sys.argv) != 4:
print("Usage:%s camera_id face_num_max path_name\r\n" % (sys.argv[0]))
else:
CatchPICFromVideo("截取人脸", int(sys.argv[1]), int(sys.argv[2]), sys.argv[3])

在shell上执行命令:

python3 SamplesCollection.py 0 500 'data\LJZ'

这里我们每一个数据集有500张图片,用人名来命名文件夹,并且利用文件夹的路径定为每张样本图片的label。

Keras搭建CNN进行人脸识别系列(四)--为模型训练准备人脸数据_深度学习

LJZ文件夹一共有500张图片,如上图所示!

Keras搭建CNN进行人脸识别系列(四)--为模型训练准备人脸数据_机器学习_02

这是data文件夹下面的三个子文件夹,各有500张图片。

标签:10,人脸识别,name,Keras,--,cv2,学习,num,人脸
From: https://blog.51cto.com/u_13121994/5798564

相关文章

  • 最长连续序列
    题目来源​​LongestConsecutiveSequence​​问题描述给定一个未排序的整数数组,找出最长连续序列的长度。例如,给出[100,4,200,1,3,2],这个最长的连续序列是[1,......
  • OpenCV-Python learning-9.图像阈值处理
    你也可以​​iframe外链​​查看。本节内容包括:常用阈值方法自适应阈值Otsu(大津法)自适应阈值​​github地址​​......
  • 从排序阵列中删除重复 II
    题目来源​​RemoveDuplicatesfromSortedArrayII​​问题描述“删除重复项目”的进阶:如果重复最多被允许两次,又该怎么办呢?例如:给定排序数列nums=[1,1,1,2,2,3]......
  • 从排序数组中删除重复项
    题目来源​​RemoveDuplicatesfromSortedArray​​题目描述给定一个有序数组,你需要原地删除其中的重复内容,使每个元素只出现一次,并返回新的长度。不要另外定义一个数......
  • OpenCV-Python learning-8.颜色空间
    你也可以​​iframe外链​​查看。本节内容包括:改变色彩空间:cvtColor使用HSV对象跟踪练习......
  • 单链表翻转
    使用语言:c++。#include<iostream>usingnamespacestd;//链表structListNode{intval;ListNode*next;ListNode(intval,ListNode*next=NULL):val(val),......
  • pandas笔记(二)
    你也可以​​链接​​查看。内容包括:基本选择方式loc,iloc方式使用布尔作为索引......
  • Anaconda Navigator启动闪退
    问题描述win10新装的AnacondaNavigator启动闪退,且JupyterNotebook启动dos也会有大量警告。解决方法通过软件升级,依次输入如下命令:condaupdatecondacondaupdateanacond......
  • windows使用nvidia-smi查看gpu信息
    需要在​​path​​添加如下路径才可以直接在cmd中使用nvidia-smi命令等。C:\ProgramFiles\NVIDIACorporation\NVSMIFan:显示风扇转速,数值在0到100%之间,是计算机的期望转......
  • tensorflow:OOM when allocating tensor with shape[225,256,256,36] and type float
    运行TensorFlow(GPU)报错如下:OOMwhenallocatingtensorwithshape[225,256,256,36]andtypefloaton/job:localhost/replica:0/tas原因是GPUOOM内存不够,因此可尝试改成......