结合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抓取模板之家的CSS模板
Mar 16 Python
Python实现小数转化为百分数的格式化输出方法示例
Sep 20 Python
为什么选择python编程语言入门黑客攻防 给你几个理由!
Feb 02 Python
Python读取properties配置文件操作示例
Mar 29 Python
python3 对list中每个元素进行处理的方法
Jun 29 Python
Python绘制的二项分布概率图示例
Aug 22 Python
python 将json数据提取转化为txt的方法
Oct 26 Python
Python小白垃圾回收机制入门
Jun 09 Python
keras的siamese(孪生网络)实现案例
Jun 12 Python
python实现KNN近邻算法
Dec 30 Python
python入门学习关于for else的特殊特性讲解
Nov 20 Python
梳理总结Python开发中需要摒弃的18个坏习惯
Jan 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
造就帕卡马拉的帕卡斯是怎么被发现的
2021/03/03 咖啡文化
cmd下运行php脚本
2008/11/25 PHP
php中对2个数组相加的函数
2011/06/24 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
php判断正常访问和外部访问的示例
2014/02/10 PHP
php导出csv格式数据并将数字转换成文本的思路以及代码分享
2014/06/05 PHP
PHP针对JSON操作实例分析
2015/01/12 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
2017/03/05 PHP
laravel 关联关系遍历数组的例子
2019/10/10 PHP
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
Zero Clipboard js+swf实现的复制功能使用方法
2010/03/07 Javascript
用jquery设置按钮的disabled属性的实现代码
2010/11/28 Javascript
用JavaScript实现动画效果的方法
2013/07/20 Javascript
js实现同一页面多个不同运动效果的方法
2015/04/10 Javascript
JavaScript运动减速效果实例分析
2015/08/04 Javascript
jquery.cookie.js用法实例详解
2015/12/25 Javascript
js基于setTimeout与setInterval实现多线程
2016/06/17 Javascript
老生常谈javascript的类型转换
2016/10/12 Javascript
javascript垃圾收集机制的原理分析
2016/12/08 Javascript
详解webpack的proxyTable无效的解决方案
2018/06/15 Javascript
Vue2实时监听表单变化的示例讲解
2018/08/30 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
javascript实现点亮灯泡特效示例
2019/10/15 Javascript
javascript实现简易计算器功能
2020/09/23 Javascript
Python守护进程(daemon)代码实例
2015/03/06 Python
仅用50行代码实现一个Python编写的计算器的教程
2015/04/17 Python
Python实现微信小程序支付功能
2019/07/25 Python
Html5 new XMLHttpRequest()监听附件上传进度
2021/01/14 HTML / CSS
英国乐购杂货:Tesco Groceries
2018/11/29 全球购物
反邪教标语
2014/06/23 职场文书
研究生求职自荐书
2014/06/23 职场文书
2014最新实习证明模板
2014/10/02 职场文书
小学教师个人工作总结2015
2015/04/20 职场文书
农业项目合作意向书
2015/05/08 职场文书
2016年万圣节活动个人总结
2016/04/05 职场文书
Go语言 go程释放操作(退出/销毁)
2021/04/30 Golang