结合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单元测试unittest实例详解
May 11 Python
python批量提取word内信息
Aug 09 Python
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
Jul 11 Python
Python实现针对给定字符串寻找最长非重复子串的方法
Apr 21 Python
Python实现按中文排序的方法示例
Apr 25 Python
Python在图片中插入大量文字并且自动换行
Jan 02 Python
django与小程序实现登录验证功能的示例代码
Feb 19 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
Aug 27 Python
Keras 加载已经训练好的模型进行预测操作
Jun 17 Python
python制作一个简单的gui 数据库查询界面
Nov 19 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
Dec 03 Python
Python并发编程实例教程之线程的玩法
Jun 20 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
让你的网站首页自动选择语言转跳
2006/12/06 PHP
如何用C语言编写PHP扩展的详解
2013/06/13 PHP
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
2018/05/10 PHP
浅析PHP中json_encode与json_decode的区别
2020/07/15 PHP
JQuery Tips(2) 关于$()包装集你不知道的
2009/12/14 Javascript
常用Extjs工具:Extjs.util.Format使用方法
2012/03/22 Javascript
jquery模拟SELECT下拉框取值效果
2013/10/23 Javascript
jquery操作select大全
2014/04/25 Javascript
3种Jquery限制文本框只能输入数字字母的方法
2014/12/03 Javascript
JavaScript中5种调用函数的方法
2015/03/12 Javascript
javascript实现youku的视频代码自适应宽度
2015/05/25 Javascript
javascript中日期函数new Date()的浏览器兼容性问题
2015/09/05 Javascript
HTML中setCapture、releaseCapture 使用方法浅析
2016/09/25 Javascript
浅谈React 属性和状态的一些总结
2016/11/21 Javascript
详解NodeJS框架express的路径映射(路由)功能及控制
2017/03/24 NodeJs
ES6新特性七:数组的扩充详解
2017/04/21 Javascript
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
2017/09/18 Javascript
Vue.js 点击按钮显示/隐藏内容的实例代码
2018/02/08 Javascript
Node.js API详解之 repl模块用法实例分析
2020/05/25 Javascript
如何运行Python程序的方法
2013/04/21 Python
python实现根据窗口标题调用窗口的方法
2015/03/13 Python
Python基于pygame实现的弹力球效果(附源码)
2015/11/11 Python
python好玩的项目—色情图片识别代码分享
2017/11/07 Python
python解析含有重复key的json方法
2019/01/22 Python
python 通过类中一个方法获取另一个方法变量的实例
2019/01/22 Python
如何使用Python实现自动化水军评论
2019/06/26 Python
使用 Python 写一个简易的抽奖程序
2019/12/08 Python
Python实现企业微信机器人每天定时发消息实例
2020/02/25 Python
关于Theano和Tensorflow多GPU使用问题
2020/06/19 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
C语言如何决定使用那种整数类型
2016/11/26 面试题
企业项目策划书
2014/01/11 职场文书
检举信的格式及范文
2014/04/04 职场文书
预备党员转正思想汇报
2014/09/26 职场文书
Jackson 反序列化时实现大小写不敏感设置
2021/06/29 Java/Android