结合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中操作列表之List.pop()方法的使用
May 21 Python
回调函数的意义以及python实现实例
Jun 20 Python
Python实现自动为照片添加日期并分类的方法
Sep 30 Python
深入理解Django的自定义过滤器
Oct 17 Python
python实现Decorator模式实例代码
Feb 09 Python
python 3.7.0 下pillow安装方法
Aug 27 Python
对python for 文件指定行读写操作详解
Dec 29 Python
Pandas的read_csv函数参数分析详解
Jul 02 Python
Python paramiko模块使用解析(实现ssh)
Aug 30 Python
使用python获取邮箱邮件的设置方法
Sep 20 Python
python计算Content-MD5并获取文件的Content-MD5值方式
Apr 03 Python
Python os库常用操作代码汇总
Nov 03 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中调用JAVA
2006/10/09 PHP
Symfony数据校验方法实例分析
2015/01/26 PHP
PHP编程实现计算抽奖概率算法完整实例
2017/08/09 PHP
php 二维数组快速排序算法的实现代码
2017/10/17 PHP
ie和firefox中img对象区别的困惑
2006/12/27 Javascript
一个关于jqGrid使用的小例子(行按钮)
2011/11/04 Javascript
c#和Javascript操作同一json对象的实现代码
2012/01/17 Javascript
20条学习javascript的编程规范的建议
2014/11/28 Javascript
JavaScript数组操作函数汇总
2016/08/05 Javascript
深入理解requestAnimationFrame的动画循环
2016/09/20 Javascript
React中使用collections时key的重要性详解
2017/08/07 Javascript
详解小程序退出页面时清除定时器
2019/04/28 Javascript
使用localStorage替代cookie做本地存储
2019/09/25 Javascript
Vue性能优化的方法
2020/07/30 Javascript
Python脚本判断 Linux 是否运行在虚拟机上
2015/04/25 Python
python实现数独算法实例
2015/06/09 Python
python压缩文件夹内所有文件为zip文件的方法
2015/06/20 Python
Python实现把数字转换成中文
2015/06/29 Python
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
2016/05/28 Python
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
Python中查看文件名和文件路径
2017/03/31 Python
用tensorflow构建线性回归模型的示例代码
2018/03/05 Python
在django模板中实现超链接配置
2019/08/21 Python
python 字符串常用方法汇总详解
2019/09/16 Python
opencv+python实现均值滤波
2020/02/19 Python
Django实现任意文件上传(最简单的方法)
2020/06/03 Python
cookies应对python反爬虫知识点详解
2020/11/25 Python
餐饮主管岗位职责
2013/12/10 职场文书
社区包粽子活动方案
2014/01/21 职场文书
《放飞蜻蜓》教学反思
2014/04/27 职场文书
竞赛口号大全
2014/06/16 职场文书
2014大学生职业生涯规划书最新范文
2014/09/13 职场文书
考博导师推荐信范文
2015/03/27 职场文书
公司年夜饭通知
2015/04/25 职场文书
运动会通讯稿100字
2015/07/20 职场文书
写好求职信的技巧解密
2019/05/14 职场文书