结合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启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
Apr 09 Python
用实例说明python的*args和**kwargs用法
Nov 01 Python
python实现上传样本到virustotal并查询扫描信息的方法
Oct 05 Python
python实现支持目录FTP上传下载文件的方法
Jun 03 Python
python中map()与zip()操作方法
Feb 27 Python
python字符串中的单双引
Feb 16 Python
基于python list对象中嵌套元组使用sort时的排序方法
Apr 18 Python
python opencv捕获摄像头并显示内容的实现
Jul 11 Python
Python编程中类与类的关系详解
Aug 08 Python
python多任务之协程的使用详解
Aug 26 Python
keras分类模型中的输入数据与标签的维度实例
Jul 03 Python
python 实现音频叠加的示例
Oct 29 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/03/19 PHP
ThinkPHP3.1基础知识快速入门
2014/06/19 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
Laravel推荐使用的十个辅助函数
2019/05/10 PHP
Jquery同辈元素选中/未选中效果的实例代码
2013/08/01 Javascript
JS分页效果示例
2013/10/11 Javascript
JS根据浏览器窗口大小实时动态改变网页文字大小的方法
2016/02/25 Javascript
jQuery过滤特殊字符及JS字符串转为数字
2016/05/26 Javascript
jQuery获取浏览器类型和版本号的方法
2016/07/05 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
2016/09/01 Javascript
JS实现预加载视频音频/视频获取截图(返回canvas截图)
2017/10/09 Javascript
JavaScript实现的超简单计算器功能示例
2017/12/23 Javascript
剖析Angular Component的源码示例
2018/03/23 Javascript
Vue中computed与methods的区别详解
2018/03/24 Javascript
MVVM框架下实现分页功能示例
2018/06/14 Javascript
在vue.js中使用JSZip实现在前端解压文件的方法
2018/09/05 Javascript
js实现unicode码字符串与utf8字节数据互转详解
2019/03/21 Javascript
基于JavaScript或jQuery实现网站夜间/高亮模式
2020/05/30 jQuery
[57:37]EG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python多重继承实例
2014/10/11 Python
在Python中使用HTMLParser解析HTML的教程
2015/04/29 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
2020/11/24 Python
日本运动品牌美津浓官方购物网站:MIZUNO SHOP
2016/08/21 全球购物
加拿大女装网上购物:Reitmans
2016/10/20 全球购物
经典优秀毕业生求职信范文分享
2013/12/18 职场文书
捐书寄语赠言
2014/01/18 职场文书
《和我们一样享受春天》教学反思
2014/02/07 职场文书
《千年梦圆在今朝》教学反思
2014/02/24 职场文书
保护环境倡议书
2014/04/14 职场文书
小学优秀教育工作者事迹材料
2014/05/09 职场文书
公共艺术专业自荐信
2014/09/01 职场文书
群众路线四风问题整改措施
2014/09/27 职场文书
检查机关党的群众路线个人整改措施
2014/10/04 职场文书
检讨书范文
2015/01/27 职场文书
python正则表达式re.search()的基本使用教程
2021/05/21 Python
如何给HttpServletRequest增加消息头
2021/06/30 Java/Android