结合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 23 Python
使用Python保存网页上的图片或者保存页面为截图
Mar 05 Python
Python使用multiprocessing实现一个最简单的分布式作业调度系统
Mar 14 Python
实例解析Python的Twisted框架中Deferred对象的用法
May 25 Python
python Celery定时任务的示例
Mar 13 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
Apr 25 Python
Python找出微信上删除你好友的人脚本写法
Nov 01 Python
python 用opencv调用训练好的模型进行识别的方法
Dec 07 Python
Python中查看变量的类型内存地址所占字节的大小
Jun 26 Python
python 操作hive pyhs2方式
Dec 21 Python
Python类中的装饰器在当前类中的声明与调用详解
Apr 15 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
Dec 16 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连接access数据库方法
2013/11/11 PHP
php 生成自动创建文件夹并上传文件的示例代码
2014/03/07 PHP
PHP英文字母大小写转换函数小结
2014/05/03 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
2014/10/14 PHP
PHP7.1新功能之Nullable Type用法分析
2016/09/26 PHP
jQuery与其它库冲突的解决方法
2010/06/25 Javascript
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
js中巧用cssText属性批量操作样式
2011/03/13 Javascript
jquery获取下拉列表的值为null的解决方法
2011/03/18 Javascript
JS 实现导航栏悬停效果
2013/09/23 Javascript
javascript中的事件代理初探
2014/03/08 Javascript
JavaScript实现自动消除按钮功能的方法
2015/08/05 Javascript
AngularJS入门教程之迭代器过滤详解
2016/08/18 Javascript
JS中this上下文对象使用方式
2016/10/09 Javascript
输入框点击时边框变色效果的实现方法
2016/12/26 Javascript
解决Vue不能检测数组或对象变动的问题
2018/02/24 Javascript
详解nodejs通过响应回写的方式渲染页面资源
2018/04/07 NodeJs
详解vue项目打包步骤
2019/03/29 Javascript
javascript数组的定义及操作实例
2019/11/10 Javascript
微信小程序开发中var that =this的用法详解
2020/01/18 Javascript
vue-cli创建的项目中的gitHooks原理解析
2020/02/14 Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
2021/02/07 Javascript
Python中使用PIPE操作Linux管道
2015/02/04 Python
Python创建模块及模块导入的方法
2015/05/27 Python
Python 多核并行计算的示例代码
2017/11/07 Python
python实现寻找最长回文子序列的方法
2018/06/02 Python
python图像处理入门(一)
2019/04/04 Python
Python中顺序表原理与实现方法详解
2019/12/03 Python
keras tensorflow 实现在python下多进程运行
2020/02/06 Python
python3 logging日志封装实例
2020/04/08 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
2020/05/15 Python
使用 css3 实现圆形进度条的示例
2017/07/05 HTML / CSS
日本民宿预约平台:STAY JAPAN
2017/07/01 全球购物
公司薪酬管理制度
2014/01/31 职场文书
超市采购员岗位职责
2015/04/07 职场文书
2015年教师见习期工作总结
2015/05/20 职场文书