结合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的Zato发送AMQP消息的教程
Apr 16 Python
Python中处理字符串的相关的len()方法的使用简介
May 19 Python
遗传算法之Python实现代码
Oct 10 Python
django使用html模板减少代码代码解析
Dec 12 Python
python监测当前联网状态并连接的实例
Dec 18 Python
Python中捕获键盘的方式详解
Mar 28 Python
Django models.py应用实现过程详解
Jul 29 Python
Django结合ajax进行页面实时更新的例子
Aug 12 Python
python多进程并行代码实例
Sep 30 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
Mar 06 Python
PyTorch加载自己的数据集实例详解
Mar 18 Python
一文搞懂如何实现Go 超时控制
Mar 30 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数据缓存技术
2007/02/14 PHP
简化php模板页面中分页代码的解析
2009/02/06 PHP
PHP 全角转半角实现代码
2010/05/16 PHP
php中通过curl检测页面是否被百度收录
2013/09/27 PHP
PHP动态输出JavaScript代码实例
2015/02/12 PHP
[原创]用javascript实现检测指定目录是否存在的方法
2008/01/12 Javascript
Extjs4 GridPanel 的几种样式使用介绍
2013/04/18 Javascript
浅析JQuery UI Dialog的样式设置问题
2013/12/18 Javascript
JavaScript中的跨浏览器事件操作的基本方法整理
2016/05/20 Javascript
jQuery Mobile中的button按钮组件基础使用教程
2016/05/23 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
jQuery获取Table某列的值(推荐)
2017/03/03 Javascript
基于vue 开发中出现警告问题去除方法
2018/01/25 Javascript
微信小程序实现即时通信聊天功能的实例代码
2018/08/17 Javascript
React+Redux实现简单的待办事项列表ToDoList
2019/09/29 Javascript
Angular8引入百度Echarts进行图表分析的实现代码
2019/11/27 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
[01:48:04]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第一场 2月7日
2021/03/11 DOTA
一键搞定python连接mysql驱动有关问题(windows版本)
2016/04/23 Python
python 多线程将大文件分开下载后在合并的实例
2018/11/09 Python
使用matlab或python将txt文件转为excel表格
2019/11/01 Python
TensorFlow绘制loss/accuracy曲线的实例
2020/01/21 Python
python模拟哔哩哔哩滑块登入验证的实现
2020/04/24 Python
html5的画布canvas——画出简单的矩形、三角形实例代码
2013/06/09 HTML / CSS
关于canvas.toDataURL 在iOS运行失败的问题解决
2020/09/16 HTML / CSS
古驰英国官网:GUCCI英国
2020/03/07 全球购物
标记环介质访问控制协议
2016/03/27 面试题
物理教育专业求职信
2014/06/25 职场文书
擅自离岗检讨书
2014/09/12 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
2014年采购员工作总结
2014/11/18 职场文书
世界文化遗产导游词
2015/02/13 职场文书
如何写一份具有法律效力的借款协议书?
2019/07/02 职场文书
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
2021/10/16 Python
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
2022/01/18 PostgreSQL
Ubuntu18.04下QT开发Android无法连接设备问题解决实现
2022/06/01 Java/Android