结合OpenCV与TensorFlow进行人脸识别的实现

作为新手来说,这是一个最简单的人脸识别模型,难度不大,代码量也不算多,下面就逐一来讲解,数据集的准备就不多说了,因人而异。

一. 获取数据集的所有路径

利用os模块来生成一个包含所有数据路径的list

def my_face():
  path = os.listdir("./my_faces")
  image_path = [os.path.join("./my_faces/",img) for img in path]
  return image_path
def other_face():
  path = os.listdir("./other_faces")
  image_path = [os.path.join("./other_faces/",img) for img in path]
  return image_path
image_path = my_face().__add__(other_face())  #将两个list合并成为一个list

二. 构造标签

标签的构造较为简单,1表示本人,0表示其他人。

label_my= [1 for i in my_face()]
 label_other = [0 for i in other_face()]
 label = label_my.__add__(label_other)       #合并两个list

三.构造数据集

利用tf.data.Dataset.from_tensor_slices()构造数据集,

def preprocess(x,y):
  x = tf.io.read_file(x)  #读取数据
  x = tf.image.decode_jpeg(x,channels=3) #解码成jpg格式的数据
  x = tf.cast(x,tf.float32) / 255.0   #归一化
  y = tf.convert_to_tensor(y)				#转成tensor
  return x,y

data = tf.data.Dataset.from_tensor_slices((image_path,label))
data_loader = data.repeat().shuffle(5000).map(preprocess).batch(128).prefetch(1)

四.构造模型

class CNN_WORK(Model):
  def __init__(self):
    super(CNN_WORK,self).__init__()
    self.conv1 = layers.Conv2D(32,kernel_size=5,activation=tf.nn.relu)
    self.maxpool1 = layers.MaxPool2D(2,strides=2)

    self.conv2 = layers.Conv2D(64,kernel_size=3,activation=tf.nn.relu)
    self.maxpool2 = layers.MaxPool2D(2,strides=2)

    self.flatten = layers.Flatten()
    self.fc1 = layers.Dense(1024)
    self.dropout = layers.Dropout(rate=0.5)
    self.out = layers.Dense(2)

  def call(self,x,is_training=False):
    x = self.conv1(x)
    x = self.maxpool1(x)
    x = self.conv2(x)
    x = self.maxpool2(x)

    x = self.flatten(x)
    x = self.fc1(x)
    x = self.dropout(x,training=is_training)
    x = self.out(x)

    if not is_training:
      x = tf.nn.softmax(x)
    return x
model = CNN_WORK()

五.定义损失函数,精度函数,优化函数

def cross_entropy_loss(x,y):
  y = tf.cast(y,tf.int64)
  loss = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y,logits=x)
  return tf.reduce_mean(loss)

def accuracy(y_pred,y_true):
  correct_pred = tf.equal(tf.argmax(y_pred,1),tf.cast(y_true,tf.int64))
  return tf.reduce_mean(tf.cast(correct_pred,tf.float32),axis=-1)
optimizer = tf.optimizers.SGD(0.002)  

六.开始跑步我们的模型

def run_optimizer(x,y):
  with tf.GradientTape() as g:
    pred = model(x,is_training=True)
    loss = cross_entropy_loss(pred,y)
  training_variabel = model.trainable_variables
  gradient = g.gradient(loss,training_variabel)
  optimizer.apply_gradients(zip(gradient,training_variabel))
model.save_weights("face_weight") #保存模型  

最后跑的准确率还是挺高的。

七.openCV登场

最后利用OpenCV的人脸检测模块,将检测到的人脸送入到我们训练好了的模型中进行预测根据预测的结果进行标识。

cap = cv2.VideoCapture(0)

face_cascade = cv2.CascadeClassifier('C:\\Users\Wuhuipeng\AppData\Local\Programs\Python\Python36\Lib\site-packages\cv2\data/haarcascade_frontalface_alt.xml')

while True:
  ret,frame = cap.read()

  gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

  faces = face_cascade.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=5,minSize=(5,5))

  for (x,y,z,t) in faces:
    img = frame[x:x+z,y:y+t]
    try:
      img = cv2.resize(img,(64,64))
      img = tf.cast(img,tf.float32) / 255.0
      img = tf.reshape(img,[-1,64,64,3])

      pred = model(img)
      pred = tf.argmax(pred,axis=1).numpy()
    except:
      pass
    if(pred[0]==1):
      cv2.putText(frame,"wuhuipeng",(x-10,y-10),cv2.FONT_HERSHEY_SIMPLEX,1.2,(255,255,0),2)

    cv2.rectangle(frame,(x,y),(x+z,y+t),(0,255,0),2)
  cv2.imshow('find faces',frame)
  if cv2.waitKey(1)&0xff ==ord('q'):
    break
cap.release()
cv2.destroyAllWindows()

完整代码地址github.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • python opencv3实现人脸识别(windows)

    本文实例为大家分享了python人脸识别程序,大家可进行测试 #coding:utf-8 import cv2 import sys from PIL import Image def CatchUsbVideo(window_name, camera_idx): cv2.namedWindow(window_name) # 视频来源,可以来自一段已存好的视频,也可以直接来自USB摄像头 cap = cv2.VideoCapture(camera_idx) # 告诉OpenCV使用人脸识别分类器

  • python使用opencv进行人脸识别

    环境 ubuntu 12.04 LTS python 2.7.3 opencv 2.3.1-7 安装依赖 sudo apt-get install libopencv-* sudo apt-get install python-opencv sudo apt-get install python-numpy 示例代码 #!/usr/bin/env python #coding=utf-8 import os from PIL import Image, ImageDraw import cv d

  • python+opencv实现的简单人脸识别代码示例

    # 源码如下: #!/usr/bin/env python #coding=utf-8 import os from PIL import Image, ImageDraw import cv def detect_object(image): '''检测图片,获取人脸在图片中的坐标''' grayscale = cv.CreateImage((image.width, image.height), 8, 1) cv.CvtColor(image, grayscale, cv.CV_BGR2GR

  • python调用OpenCV实现人脸识别功能

    Python调用OpenCV实现人脸识别,供大家参考,具体内容如下 硬件环境: Win10 64位 软件环境: Python版本:2.7.3 IDE:JetBrains PyCharm 2016.3.2 Python库: 1.1) opencv-python(3.2.0.6) 搭建过程: OpenCV Python库: 1. PyCharm的插件源中选择opencv-python(3.2.0.6)库安装 题外话:Python入门Tips PS1:如何安装whl文件 1.先安装PIP 2.CMD命

  • Python基于Opencv来快速实现人脸识别过程详解(完整版)

    前言 随着人工智能的日益火热,计算机视觉领域发展迅速,尤其在人脸识别或物体检测方向更为广泛,今天就为大家带来最基础的人脸识别基础,从一个个函数开始走进这个奥妙的世界. 首先看一下本实验需要的数据集,为了简便我们只进行两个人的识别,选取了beyond乐队的主唱黄家驹和贝斯手黄家强,这哥俩长得有几分神似,这也是对人脸识别的一个考验: 两个文件夹,一个为训练数据集,一个为测试数据集,训练数据集中有两个文件夹0和1,之前看一些资料有说这里要遵循"slabel"命名规则,但后面处理起来比较麻烦,

  • Python opencv实现人眼/人脸识别以及实时打码处理

    利用Python+opencv实现从摄像头捕获图像,识别其中的人眼/人脸,并打上马赛克. 系统环境:Windows 7 + Python 3.6.3 + opencv 3.4.2 一.系统.资源准备 要想达成该目标,需要满足一下几个条件: 找一台带有摄像头的电脑,一般笔记本即可: 需配有Python3,并安装NumPy包.opencv: 需要有已经训练好的分类器,用于识别视频中的人脸.人眼等,如无分类器,可以点击这里下载:haarcascades分类器 二.动手做 1.导入相关包.设置视频格式.

  • OpenCV实现人脸识别

    主要有以下步骤: 1.人脸检测 2.人脸预处理 3.从收集的人脸训练机器学习算法 4.人脸识别 5.收尾工作 人脸检测算法: 基于Haar的脸部检测器的基本思想是,对于面部正面大部分区域而言,会有眼睛所在区域应该比前额和脸颊更暗,嘴巴应该比脸颊更暗等情形.它通常执行大约20个这样的比较来决定所检测的对象是否为人脸,实际上经常会做上千次. 基于LBP的人脸检测器基本思想与基于Haar的人脸检测器类似,但它比较的是像素亮度直方图,例如,边缘.角落和平坦区域的直方图. 这两种人脸检测器可通过训练大的图

  • OpenCV实现人脸识别简单程序

    本文实例为大家分享了OpenCV实现人脸识别程序的具体代码,供大家参考,具体内容如下 //Haar特征检测,人脸识别算法,是用xml作为训练后的分类器做的 #include<opencv2\opencv.hpp> #include<cstdio> #include<cstdlib> #include<Windows.h> using namespace std; int main() { //加载Haar特征检测分类器 // haarcascade_fron

  • 基于python3 OpenCV3实现静态图片人脸识别

    本文采用OpenCV3和Python3 来实现静态图片的人脸识别,采用的是Haar文件级联. 首先需要将OpenCV3源代码中找到data文件夹下面的haarcascades文件夹里面包含了所有的OpenCV的人脸检测的XML文件,这些文件可以用于检测静态,视频文件,摄像头视频流中的人脸,找到haarcascades文件夹后,复制里面的XML文件,在你新建的Python脚本文件目录里面建一个名为cascades的文件夹,并把复制的XML文件粘贴到新建的文件夹中一些有人脸的的图片,这个大家可以自行

  • opencv 做人脸识别 opencv 人脸匹配分析

    机器学习 机器学习的目的是把数据转换成信息. 机器学习通过从数据里提取规则或模式来把数据转成信息. 人脸识别 人脸识别通过级联分类器对特征的分级筛选来确定是否是人脸. 每个节点的正确识别率很高,但正确拒绝率很低. 任一节点判断没有人脸特征则结束运算,宣布不是人脸. 全部节点通过,则宣布是人脸. 工业上,常用人脸识别技术来识别物体. 对图片进行识别 复制代码 代码如下: #include "opencv2/core/core.hpp" #include "opencv2/obj

随机推荐