python+opencv实现人脸识别笔记四(识别出人脸)
2019-06-13 07:37
1826 查看
我们需要调用保存的训练模型来识别人脸,话不多说直接上代码。
新建 识别出我.py
import tensorflow as tf import cv2 import numpy as np import os import random import sys from sklearn.model_selection import train_test_split my_faces_path = '/home/dong/PycharmProjects/untitled/人脸识别/data/me' other_faces_path = '/home/dong/PycharmProjects/untitled/人脸识别/data/zhang' size = 64 imgs = [] labs = [] def getPaddingSize(img): h, w, _ = img.shape top, bottom, left, right = (0, 0, 0, 0) longest = max(h, w) if w < longest: tmp = longest - w # //表示整除符号 left = tmp // 2 right = tmp - left elif h < longest: tmp = longest - h top = tmp // 2 bottom = tmp - top else: pass return top, bottom, left, right def readData(path , h=size, w=size): for filename in os.listdir(path): if filename.endswith('.jpg'): filename = path + '/' + filename img = cv2.imread(filename) top,bottom,left,right = getPaddingSize(img) # 将图片放大, 扩充图片边缘部分 img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=[0,0,0]) img = cv2.resize(img, (h, w)) imgs.append(img) labs.append(path) readData(my_faces_path) readData(other_faces_path) # 将图片数据与标签转换成数组 imgs = np.array(imgs) labs = np.array([[0,1] if lab == my_faces_path else [1,0] for lab in labs]) # 随机划分测试集与训练集 train_x,test_x,train_y,test_y = train_test_split(imgs, labs, test_size=0.05, random_state=random.randint(0,100)) # 参数:图片数据的总数,图片的高、宽、通道 train_x = train_x.reshape(train_x.shape[0], size, size, 3) test_x = test_x.reshape(test_x.shape[0], size, size, 3) # 将数据转换成小于1的数 train_x = train_x.astype('float32')/255.0 test_x = test_x.astype('float32')/255.0 print('train size:%s, test size:%s' % (len(train_x), len(test_x))) # 图片块,每次取128张图片 batch_size = 128 num_batch = len(train_x) // 128 x = tf.placeholder(tf.float32, [None, size, size, 3]) y_ = tf.placeholder(tf.float32, [None, 2]) keep_prob_5 = tf.placeholder(tf.float32) keep_prob_75 = tf.placeholder(tf.float32) def weightVariable(shape): init = tf.random_normal(shape, stddev=0.01) return tf.Variable(init) def biasVariable(shape): init = tf.random_normal(shape) return tf.Variable(init) def conv2d(x, W): return tf.nn.conv2d(x, W, strides=[1,1,1,1], padding='SAME') def maxPool(x): return tf.nn.max_pool(x, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME') def dropout(x, keep): return tf.nn.dropout(x, keep) def cnnLayer(): # 第一层 W1 = weightVariable([3,3,3,32]) # 卷积核大小(3,3), 输入通道(3), 输出通道(32) b1 = biasVariable([32]) # 卷积 conv1 = tf.nn.relu(conv2d(x, W1) + b1) # 池化 pool1 = maxPool(conv1) # 减少过拟合,随机让某些权重不更新 drop1 = dropout(pool1, keep_prob_5) # 第二层 W2 = weightVariable([3,3,32,64]) b2 = biasVariable([64]) conv2 = tf.nn.relu(conv2d(drop1, W2) + b2) pool2 = maxPool(conv2) drop2 = dropout(pool2, keep_prob_5) # 第三层 W3 = weightVariable([3,3,64,64]) b3 = biasVariable([64]) conv3 = tf.nn.relu(conv2d(drop2, W3) + b3) pool3 = maxPool(conv3) drop3 = dropout(pool3, keep_prob_5) # 全连接层 Wf = weightVariable([8*16*32, 512]) bf = biasVariable([512]) drop3_flat = tf.reshape(drop3, [-1, 8*16*32]) dense = tf.nn.relu(tf.matmul(drop3_flat, Wf) + bf) dropf = dropout(dense, keep_prob_75) # 输出层 Wout = weightVariable([512,2]) bout = biasVariable([2]) out = tf.add(tf.matmul(dropf, Wout), bout) return out output = cnnLayer() predict = tf.argmax(output, 1)
这些代码都和上一篇中的相同
最主要的是接下来的代码。
继续添加
saver = tf.train.Saver() sess = tf.Session() saver.restore(sess, tf.train.latest_checkpoint('/home/dong/PycharmProjects/untitled/FaceRecognition-tensorflow/模型')) def is_my_face(image): res = sess.run(predict, feed_dict={x: [image/255.0], keep_prob_5: 1.0, keep_prob_75: 1.0}) if res[0] == 1: return True else: return False cv2.namedWindow("识别") # 视频来源,可以来自一段已存好的视频,也可以直接来自USB摄像头 cap = cv2.VideoCapture("/home/dong/Videos/meimei/13.mp4") # 告诉OpenCV使用人脸识别分类器 classfier = cv2.CascadeClassifier( "/home/dong/PycharmProjects/untitled/venv/lib/python3.6/site-packages/cv2/data/haarcascade_frontalface_alt2.xml") # 识别出人脸后要画的边框的颜色,RGB格式 color = (0, 0, 0) while cap.isOpened(): ok, frame = cap.read() # 读取一帧数据 if not ok: break # 将当前帧转换成灰度图像 grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 人脸检测,1.2和2分别为图片缩放比例和需要检测的有效点数 faceRects = classfier.detectMultiScale(grey, 1.3, 5) if len(faceRects) > 0: # 大于0则检测到人脸 for faceRect in faceRects: # 单独框出每一张人脸 x1, y1, w1, h1 = faceRect face = frame[y1 - 10: y1 + h1 + 10, x1 - 10: x1 + w1 + 10] faces = cv2.resize(face, (size, size)) print(is_my_face(faces)) b = is_my_face(faces) cv2.rectangle(frame, (x1 - 10, y1 - 10), (x1 + w1 + 10, y1 + h1 + 10), color, 2) font = cv2.FONT_HERSHEY_SIMPLEX if b == True: cv2.putText(frame, "name:%s" % ("dong"), (x1 + 30, y1 + 30), font, 1, (255, 0, 255), 4) else: cv2.putText(frame, "name:%s" % ("tan"), (x1 + 30, y1 + 30), font, 1, (255, 0, 255), 4) # 显示图像 cv2.imshow("识别", frame) c = cv2.waitKey(10) if c & 0xFF == ord('q'): # 如果强制停止执行程序,结束视频放映 break # 释放摄像头并销毁所有窗口 cap.release() cv2.destroyAllWindows() print(faceRects) sess.close()
如果出现了TypeError: Cannot interpret feed_dict key as Tensor: Can not convert a float into a Tensor.
改错:
查看是否重用了y,x和keep_prob。。。有重用的地方,改另外的变量即可。。
现在给出我的识别结果
相关文章推荐
- Python+opencv实现调取摄像头识别人脸,并将人脸转化为灰度图并保存到本地
- OpenCV3计算机视觉Python语言实现人脸识别笔记
- 【人脸识别】人脸验证算法Joint Bayesian详解及实现(Python版)
- 人脸检测及识别python实现系列(3)——为模型训练准备人脸数据
- 深度学习(一)——deepNN模型实现摄像头实时识别人脸表情(C++和python3.6混合编程)
- gabor变换人脸识别的python实现,att_faces数据集平均识别率99%
- Python调用OpenCV实现人脸识别
- python调用OpenCV实现人脸识别功能
- 人脸检测及识别python实现系列(2)——识别出人脸
- 动手实操 | 如何用 Python 实现人脸识别,证明这个杨幂是那个杨幂?
- python+opencv实现的简单人脸识别代码示例
- 【基于百度AI的人脸识别Python实现】
- Python基于OpenCV库Adaboost实现人脸识别功能详解
- opencv-python 学习笔记2:实现目光跟随(又叫人脸跟随)
- Python scikit-learn 学习笔记—PCA+SVM人脸识别
- 人脸检测及识别python实现系列(6)——终篇:从实时视频流识别出“我”
- 25 行 Python 代码实现人脸识别——OpenCV
- 关于Python+Opencv实现人脸检测的实验笔记(调用图片文件篇)
- python借助腾讯云实现人脸识别的gui程序实例
- 手把手教你用1行代码实现人脸识别 -- Python Face_recognition