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


Posted in Python onOctober 10, 2019

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

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

利用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()

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

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

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与TensorFlow进行人脸识别的实现

七.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.

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

Python 相关文章推荐
Python异常学习笔记
Feb 03 Python
解决Python传递中文参数的问题
Aug 04 Python
Python之os操作方法(详解)
Jun 15 Python
matplotlib savefig 保存图片大小的实例
May 24 Python
python爱心表白 每天都是浪漫七夕!
Aug 18 Python
Python判断对象是否为文件对象(file object)的三种方法示例
Apr 26 Python
wxPython之wx.DC绘制形状
Nov 19 Python
基于Python中isfile函数和isdir函数使用详解
Nov 29 Python
解决Python使用列表副本的问题
Dec 19 Python
详解python内置模块urllib
Sep 09 Python
python 制作网站小说下载器
Feb 20 Python
python实战之90行代码写个猜数字游戏
Apr 22 Python
树莓派安装OpenCV3完整过程的实现
Oct 10 #Python
树莓派极简安装OpenCv的方法步骤
Oct 10 #Python
python 利用jinja2模板生成html代码实例
Oct 10 #Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
Oct 10 #Python
利用pandas合并多个excel的方法示例
Oct 10 #Python
python匿名函数的使用方法解析
Oct 10 #Python
Python切图九宫格的实现方法
Oct 10 #Python
You might like
批量去除PHP文件中bom的PHP代码
2012/03/13 PHP
使用php转义输出HTML到JavaScript
2015/03/27 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
2016/09/19 PHP
微信开发之php表单微信中自动提交两次问题解决办法
2017/01/08 PHP
详解PHP队列的实现
2019/03/14 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
Firefox 无法获取cssRules 的解决办法
2006/10/11 Javascript
doctype后如何获得body.clientHeight的方法
2007/07/11 Javascript
Javascript Tab 导航插件 (23个)
2009/06/11 Javascript
JQuery SELECT单选模拟jQuery.select.js
2009/11/12 Javascript
JavaScript 页面坐标相关知识整理
2010/01/09 Javascript
深入理解javascript学习笔记(一) 编写高质量代码
2012/08/09 Javascript
基于JQuery的模拟苹果桌面Dock效果(稳定版)
2012/10/15 Javascript
js校验表单后提交表单的三种方法总结
2014/02/28 Javascript
搞定immutable.js详细说明
2016/05/02 Javascript
jQuery使用ajax跨域获取数据的简单实例
2016/05/18 Javascript
JS生成和下载二维码的代码
2016/12/07 Javascript
原生JS实现简单放大镜效果
2017/02/08 Javascript
AngularJS的$location使用方法详解
2017/10/19 Javascript
Python转换HTML到Text纯文本的方法
2015/01/15 Python
Python中的匿名函数使用简介
2015/04/27 Python
python通过get,post方式发送http请求和接收http响应的方法
2015/05/26 Python
使用python实现生成用户信息
2017/03/20 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
Python3合并两个有序数组代码实例
2020/08/11 Python
使用Html5 Stream开发实时监控系统
2020/06/02 HTML / CSS
Gap加拿大官网:Gap Canada
2017/08/24 全球购物
什么是事务?事务有哪些性质?
2012/03/11 面试题
计算机应用职专应届生求职信
2013/11/12 职场文书
大学生学习党课思想汇报
2014/01/03 职场文书
校园餐饮创业计划书
2014/01/10 职场文书
中层干部培训方案
2014/06/16 职场文书
高三英语复习计划
2015/01/19 职场文书
交通事故调解协议书
2015/05/20 职场文书
Rust 连接 PostgreSQL 数据库的详细过程
2022/01/22 PostgreSQL