结合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 相关文章推荐
利用打码兔和超人打码自封装的打码类分享
Mar 16 Python
Python中__call__用法实例
Aug 29 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
Jul 13 Python
Win10下python 2.7.13 安装配置方法图文教程
Sep 18 Python
python用post访问restful服务接口的方法
Dec 07 Python
DRF跨域后端解决之django-cors-headers的使用
Jan 27 Python
django admin后台添加导出excel功能示例代码
May 15 Python
python实现超市商品销售管理系统
Oct 25 Python
学会python自动收发邮件 代替你问候女友
May 20 Python
浅谈优化Django ORM中的性能问题
Jul 09 Python
解决Python字典查找报Keyerror的问题
May 26 Python
OpenCV-Python模板匹配人眼的实例
Jun 08 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
第1次亲密接触PHP5(1)
2006/10/09 PHP
PHP中的MYSQL常用函数(php下操作数据库必备)
2010/09/12 PHP
thinkphp普通查询与表达式查询实例分析
2014/11/24 PHP
PHP 爬取网页的主要方法
2018/07/13 PHP
php提取微信账单的有效信息
2018/10/01 PHP
Thinkphp5.0框架视图view的循环标签用法示例
2019/10/12 PHP
关于IFRAME 自适应高度的研究
2006/07/20 Javascript
javascript基本语法分析说明
2008/06/15 Javascript
prototype Element学习笔记(篇二)
2008/10/26 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
Node.js编写爬虫的基本思路及抓取百度图片的实例分享
2016/03/12 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
2016/10/24 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
ES6新特性之字符串的扩展实例分析
2017/04/01 Javascript
记一次vue-webpack项目优化实践详解
2019/02/17 Javascript
教你搭建按需加载的Vue组件库(小结)
2019/07/29 Javascript
JS防抖和节流实例解析
2019/09/24 Javascript
vue常用高阶函数及综合实例
2021/02/25 Vue.js
利用python修改json文件的value方法
2018/12/31 Python
Python 实现微信防撤回功能
2019/04/29 Python
浅谈Python大神都是这样处理XML文件的
2019/05/31 Python
python 实现交换两个列表元素的位置示例
2019/06/26 Python
python基于FTP实现文件传输相关功能代码实例
2019/09/28 Python
pytorch梯度剪裁方式
2020/02/04 Python
Python matplotlib模块及柱状图用法解析
2020/08/10 Python
CSS实现雨滴动画效果的实例代码
2019/10/08 HTML / CSS
施华洛世奇澳大利亚官网:SWAROVSKI澳大利亚
2017/01/06 全球购物
Shopee菲律宾:在线购买和出售
2019/11/25 全球购物
统计每一学生的平均成绩
2014/06/06 面试题
下列程序在32位linux或unix中的结果是什么
2014/03/25 面试题
UNIX文件系统分类
2014/11/11 面试题
小学生自我评价范例
2013/09/24 职场文书
党员个人查摆剖析材料
2014/10/16 职场文书
高三化学教学反思
2016/02/22 职场文书
MySQL 数据类型详情
2021/11/11 MySQL