结合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二分法搜索算法实例分析
May 11 Python
编写自定义的Django模板加载器的简单示例
Jul 21 Python
Python模块文件结构代码详解
Feb 03 Python
Python3.6笔记之将程序运行结果输出到文件的方法
Apr 22 Python
python调用webservice接口的实现
Jul 12 Python
Django Python 获取请求头信息Content-Range的方法
Aug 06 Python
解决pytorch报错:AssertionError: Invalid device id的问题
Jan 10 Python
10个python爬虫入门实例(小结)
Nov 01 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
Nov 24 Python
如何理解及使用Python闭包
Jun 01 Python
opencv 分类白天与夜景视频的方法
Jun 05 Python
Python 的演示平台支持 WSGI 接口的应用
Apr 20 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
通过ODBC连接的SQL SERVER实例
2006/10/09 PHP
php 小乘法表实现代码
2009/07/16 PHP
php addslashes和mysql_real_escape_string
2010/01/24 PHP
Thinkphp中的volist标签用法简介
2014/06/18 PHP
php函数连续调用实例分析
2015/07/30 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
图片按比例缩放函数
2006/06/26 Javascript
JavaScript NaN和Infinity特殊值 [译]
2012/09/20 Javascript
js jquery获取随机生成id的服务器控件的三种方法
2013/07/11 Javascript
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
jQuery 三击事件实现代码
2013/09/11 Javascript
jQuery浏览器CSS3特写兼容实例
2015/01/19 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
2015/02/13 Javascript
JQuery实现动态添加删除评论的方法
2015/05/18 Javascript
基于ajax与msmq技术的消息推送功能实现代码
2016/12/26 Javascript
Nodejs 和Session 原理及实战技巧小结
2017/08/25 NodeJs
基于Require.js使用方法(总结)
2017/10/26 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
vue+Vue Router多级侧导航切换路由(页面)的实现代码
2018/12/20 Javascript
Vue.js watch监视属性知识点总结
2019/11/11 Javascript
如何基于layui的laytpl实现数据绑定的示例代码
2020/04/10 Javascript
pyqt和pyside开发图形化界面
2014/01/22 Python
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
2017/10/29 Python
Python实现的随机森林算法与简单总结
2018/01/30 Python
使用PyInstaller将python转成可执行文件exe笔记
2018/05/26 Python
python要安装在哪个盘
2020/06/15 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
2020/12/01 Python
next在python中返回迭代器的实例方法
2020/12/15 Python
基于css3的属性transition制作菜单导航效果
2015/09/01 HTML / CSS
html5通过postMessage进行跨域通信的方法
2017/12/04 HTML / CSS
黄色火烈鸟:De Gele Flamingo
2019/03/18 全球购物
2014年秘书工作总结
2014/11/25 职场文书
学习经验交流会演讲稿
2015/11/02 职场文书
在CSS中使用when/else的方法
2022/01/18 HTML / CSS