结合OpenCV与TensorFlow进行人脸识别的实现
作者:奋斗小鹏 发布时间:2021-07-06 08:44:28
标签:OpenCV,TensorFlow,人脸识别
作为新手来说,这是一个最简单的人脸识别模型,难度不大,代码量也不算多,下面就逐一来讲解,数据集的准备就不多说了,因人而异。
一. 获取数据集的所有路径
利用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()
五.定义损失函数,精度函数,优化函数
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登场
最后利用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.
来源:https://blog.csdn.net/weixin_44678052/article/details/102286945
0
投稿
猜你喜欢
- 以前在网上看到的最简单的拖动对象的代码,忘记作者叫什么了。原始代码在IE下有些小问题,并且声明了文档类型为xhtml 1.0后,在FF等非I
- 什么是装饰器?装饰器(Decorator)相对简单,咱们先介绍它:“装饰器的功能是将被装饰的函数当作参数传递给与装饰器对应的函数(名称相同的
- 用asp程序进行网页设计,大多因为需要访问数据库,然后再将数据显示到页面,如果数据很多的话,页面的访问速度也就变慢了,为了解决这个问题,可以
- 本文实例讲述了Python实现向服务器请求压缩数据及解压缩数据的方法。分享给大家供大家参考,具体如下:向服务器请求压缩数据格式,并解压缩数据
- 1. 区分读锁定 和 写 锁定。 如果每次都使用 写锁定,那么连多个进程读取一个文件也要排队,这样的效率肯定不行。 2. 区分 阻塞 与 非
- 一、牛顿多项式拉格朗日多项式的公式不具备递推性,每个多项式需要单独构造。但很多时候我们需要从若干个逼近多项式选择一个。这个时候我们就需要一个
- css里关于浏览器的兼容问题一直困惑着我们初级的css用户(高手可直接绕过),这里想根据我前段时间拜读的李超的书籍《css网站布局实录》里学
- 综述:本文讨论了VBScript和 JScript之间的区别,以及它们的使用场合。推荐:Vbscript5.5中文语言参考手册chm格式下载
- 首先,自学Python是能够找到相关工作的。Python语言在近几年的上升趋势非常明显,语言生态也越来越健全,在Web开发、大数据开发、人工
- 本文实例讲述了python打开url并按指定块读取网页内容的方法。分享给大家供大家参考。具体实现方法如下:import urllibpage
- 最近,为了能在数据库服务器中运行其他应用程序,在保持数据库操作系统版本不变的前提下对数据库服务器进行了软、硬件上的升级。在软件上,将操作系统
- 终于下决心把python从2.7升到了3.7。懒人安装当然使用Anaconda。安装成功,编译成功。但是用pip 安装包的时候提示:pip
- 研究(2)中讨论了栅格系统的基础知识。这一篇将集中探讨栅格系统的粒度问题。(注:如非特别指明,栅格系统均指24列960栅格系统)淘宝的首页(
- 目录1. pgzeropgzero的安装2. 游戏设计的过程3. pgzero基础4. pgzero游戏例子5. 总结6. 参考资料1. p
- 你知道SQL Server这么庞大的企业级数据库服务器产品是如何build出来的吗?这有些相关的数据:每个build 的大小在300GB左右
- 昨天给公司服务器重做了一下系统,遇到Asp附件无法上传,之前服务器上使用好好的,怎么重做了就不正常了,于是一番google,baidu,下面
- 如果用户输入的是直接插入到一个SQL语句中的查询,应用程序会很容易受到SQL注入,例如下面的例子:$unsafe_variable = $_
- 将转储设备加入到SQL Server备份数据库的地方。在SEM中转储设备是可见性的,并且在设备上的信息被存储在主要数据库的sysdevice
- 我们都知道 vue 中可以使用 modal 来实现 input 内容数据的双向绑定。小程序好像没有提供相应的方法支持,就需要我们自己写了。原
- 点击顶部的“SQL”标签进入sql命令输入界面。输入以下命令:update mysql.user set password=PASSWORD