如需完整源码,可以联系博主获取
技术路径:opencv+mtcnn+facenet+python+tensorflow ,实现局域网连接手机摄像头,对目标人员进行实时人脸识别
一、引言
随着信息技术的飞速发展,人脸识别技术已成为身份验证、安全监控等领域的核心技术之一。实时人脸识别系统,以其高效、准确的特点,受到了广泛的关注和应用。FaceNet,作为Google开发的一种先进的人脸识别系统,基于深度卷积神经网络和三元组损失函数,为实时人脸识别提供了强大的技术支持。本文综述了基于FaceNet的实时人脸识别系统的设计与实现,包括其原理、关键技术、系统设计以及应用前景,以期为相关研究和实践提供参考。
二、FaceNet原理与关键技术
FaceNet的核心在于其深度卷积神经网络结构和三元组损失函数。卷积神经网络(CNN)是专门用于处理图像的神经网络结构,通过多层卷积和池化操作,可以提取图像中的特征信息。在FaceNet中,CNN被设计用来将输入的人脸图像映射到一个高维向量空间中,这个向量被称为人脸嵌入(face embedding),它有效地表示了人脸的特征。
三元组损失函数是FaceNet的另一大创新。它基于人脸嵌入向量之间的距离来训练网络,通过最小化同一人脸嵌入向量之间的距离,同时最大化不同人脸嵌入向量之间的距离,从而实现人脸识别的准确性。这种损失函数的设计使得FaceNet在人脸识别任务中表现出色。
三、系统设计与实现
基于FaceNet的实时人脸识别系统主要包括人脸检测、特征提取、特征比对以及结果输出等模块。在人脸检测阶段,系统利用适当的算法(如Haar级联或dlib库)快速准确地定位图像中的人脸区域。在特征提取阶段,系统利用FaceNet预训练的模型对检测到的人脸进行特征编码,生成独特的人脸嵌入向量。在特征比对阶段,系统通过计算待识别人脸与数据库中人脸嵌入向量之间的距离,判断其是否属于同一人。最后,系统输出识别结果,并根据需要执行相应操作(如报警、记录等)。
此外,为了提高系统的实时性和准确性,还需要考虑一些关键技术问题。例如,优化算法以提高人脸检测和特征提取的速度;采用合适的距离度量方法以提高特征比对的准确性;设计有效的数据库管理策略以存储和检索人脸特征数据等。
四、应用前景与挑战
基于FaceNet的实时人脸识别系统具有广泛的应用前景,如安全监控、身份验证、人机交互等领域。然而,在实际应用中,该系统仍面临一些挑战和问题。例如,不同光照、角度和表情条件下的人脸识别准确性问题;复杂背景下的人脸检测与跟踪问题;以及隐私保护和安全性问题等。针对这些问题,未来的研究可以从算法优化、系统架构设计以及应用场景拓展等方面进行深入探讨。
五、结论与展望
本文综述了基于FaceNet的实时人脸识别系统的设计与实现,介绍了其原理、关键技术、系统设计以及应用前景。通过深入研究和实践,我们相信基于FaceNet的实时人脸识别系统将在未来得到更广泛的应用和发展。同时,我们也期待未来能够有更多的研究者和技术人员加入到这个领域中来,共同推动人脸识别技术的进步和创新。
部署及源码说明
align文件中包含三个mtcnn要用到的模型,以及搭建mtcnn网络的文件 detect_face.py,这里面的东西在facenet的项目中的都可以找到
models中存放的是训练好的knn模型,用于测试使用的简单模型,一会儿展示的效果也是由其完成
train_dir 顾名思义,就不解释了
facenet.py就是一直在谈的东西,其中包含了如何搭建facenet网络,以及计算的内容
test.py train_knn.py temp_test.py imageconvert.py这几个文件分别人脸识别测试 、 训练knn模型 、 遇到问题是精简代码调试使用 、 图像批量转化 用于准备数据集 其他的没有谈及的文件都没有使用到,应该是以前测试时候忘记删除的
运行环境和运行说明
推荐使用Anaconda配置tensorflow环境(因为本项目就是基于tensorflow框架的),是cpu版本(等新卡,其实就是穷…)网上教程很多,也很简单,本环境的python版本是3.6的,如果你的是2.7的话,那就要改很多东西了(跟着报错改就ok),但何不如再安装个3.6的呢,在anaconda下真的是超级方便
编辑器用的是vscode,从windows转来,习惯使用vscode,真的很好用,在安装anaconda的时候会提示你是否装个vscode的,当然使用其他的也很好
一些依赖库当然是必备的,提示少啥装啥吧,我也忘了,反正那些基本的是要装的,比如numpy maplotlib jupyter scikit-image librosa kersa 这些,安装也很简单,在anaconda里安装 使用conda命令 或者如果你的linux的默认python就是anaconda里的,直接使用pip安装就好了
本项目里的几个运行的代码,我都写好了参数,直接运行即可(当然制定文件要在指定位置) 运行顺序是
准备好自己的训练集 几十张自己照片即可(尺寸要小一点的,最好500*500以下,不然速度慢,精度低),放到train_dir/pic_me 文件夹下面,把我打包文件里的pic_others文件夹中的放到指定train_dir/pic_others下面(这部分数据也可以自己准备,我的数据是来自lfw中的前几百张图片)
运行train_knn.py 得到自己的knn模型
运行test.py (记得要把手机上的ip摄像头app打开,点击下面打开IP摄像头服务器 ,并检查下显示的局域网ip和test.py 中的是否相同,如不相同,改一下)
启动的时候会比较慢,30s到一分钟左右,取决于电脑性能。
部分源码:
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import cv2
from scipy import misc
import tensorflow as tf
import numpy as np
import sys
import os
import copy
import argparse
import facenet
import align.detect_face
import random
from os.path import join as pjoin
import matplotlib.pyplot as plt
import sklearn
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.externals import joblib
#face detection parameters
minsize = 20 # minimum size of face
threshold = [ 0.6, 0.7, 0.7 ] # three steps's threshold 三步的阈值
factor = 0.709 # scale factor 比例因子
# 模型位置
model_dir='./20170512-110547'#"Directory containing the graph definition and checkpoint files.")
def to_rgb(img):
w, h = img.shape
ret = np.empty((w, h, 3), dtype=np.uint8)
ret[:, :, 0] = ret[:, :, 1] = ret[:, :, 2] = img
return ret
def read_img(person_dir,f):
img=cv2.imread(pjoin(person_dir, f))
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 判断数组维度
if gray.ndim == 2:
img = to_rgb(gray)
return img
def load_data(data_dir):
data = {}
pics_ctr = 0
for guy in os.listdir(data_dir):
person_dir = pjoin(data_dir, guy)
curr_pics = [read_img(person_dir, f) for f in os.listdir(person_dir)]
# 存储每一类人的文件夹内所有图片
data[guy] = curr_pics
return data
minsize = 20 # minimum size of face
threshold = [ 0.6, 0.7, 0.7 ] # three steps's threshold
factor = 0.709 # scale factor
# 创建mtcnn网络,并加载参数
print('Creating networks and loading parameters')
with tf.Graph().as_default():
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=1.0)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options, log_device_placement=False))
with sess.as_default():
pnet, rnet, onet = align.detect_face.create_mtcnn(sess, None)
def load_and_align_data(image, image_size, margin, gpu_memory_fraction):
# 读取图片
img = image
# 获取图片的shape
img_size = np.asarray(img.shape)[0:2]
# 返回边界框数组 (参数分别是输入图片 脸部最小尺寸 三个网络 阈值 factor不清楚)
bounding_boxes, _ = align.detect_face.detect_face(img, minsize, pnet, rnet, onet, threshold, factor)
if len(bounding_boxes) < 1:
return 0,0,0
else:
crop=[]
det=bounding_boxes
det[:,0]=np.maximum(det[:,0], 0)
det[:,1]=np.maximum(det[:,1], 0)
det[:,2]=np.minimum(det[:,2], img_size[1])
det[:,3]=np.minimum(det[:,3], img_size[0])
# det[:,0]=np.maximum(det[:,0]-margin/2, 0)
# det[:,1]=np.maximum(det[:,1]-margin/2, 0)
# det[:,2]=np.minimum(det[:,2]+margin/2, img_size[1])
# det[:,3]=np.minimum(det[:,3]+margin/2, img_size[0])
det=det.astype(int)
for i in range(len(bounding_boxes)):
temp_crop=img[det[i,1]:det[i,3],det[i,0]:det[i,2],:]
aligned=misc.imresize(temp_crop, (image_size, image_size), interp='bilinear')
prewhitened = facenet.prewhiten(aligned)
crop.append(prewhitened)
crop_image=np.stack(crop)
return det,crop_image,1
with tf.Graph().as_default():
with tf.Session() as sess:
# 加载模型
facenet.load_model(model_dir)
print('建立facenet embedding模型')
# 返回给定名称的tensor
images_placeholder = tf.get_default_graph().get_tensor_by_name("input:0")
embeddings = tf.get_default_graph().get_tensor_by_name("embeddings:0")
phase_train_placeholder = tf.get_default_graph().get_tensor_by_name("phase_train:0")
model = joblib.load('./models/knn_classifier.model')
#开启ip摄像头
video="http://admin:[email protected]:8081/" #此处@后的ipv4 地址需要修改为自己的地址
# 参数为0表示打开内置摄像头,参数是视频文件路径则打开视频
capture =cv2.VideoCapture(video)
cv2.namedWindow("camera",1)
c=0
num = 0
frame_interval=3 # frame intervals
while True:
ret, frame = capture.read()
timeF = frame_interval
# print(shape(frame))
detect_face=[]
if(c%timeF == 0):
find_results=[]
# cv2.imshow("camera",frame)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
if gray.ndim == 2:
img = to_rgb(gray)
det,crop_image,j= load_and_align_data(img, 160, 44, 1.0)
if j:
feed_dict = { images_placeholder: crop_image, phase_train_placeholder:False }
emb = sess.run(embeddings, feed_dict=feed_dict)
for xx in range(len(emb)):
print(type(emb[xx,:]),emb[xx,:].shape)
detect_face.append(emb[xx,:])
detect_face=np.array(detect_face)
detect_face=detect_face.reshape(-1,128)
print('facenet embedding模型建立完毕')
predict = model.predict(detect_face)
print(predict)
result=[]
for i in range(len(predict)):
if predict[i]==0:
result.append('windzu')
elif predict[i]==100:
result.append('unknown')
# 绘制矩形框并标注文字
for rec_position in range(len(det)):
cv2.rectangle(frame,(det[rec_position,0],det[rec_position,1]),(det[rec_position,2],det[rec_position,3]),(0, 255, 0), 2, 8, 0)
cv2.putText(
frame,
result[rec_position],
(det[rec_position,0],det[rec_position,1]),
cv2.FONT_HERSHEY_COMPLEX_SMALL,
0.8,
(0, 0 ,255),
thickness = 2,
lineType = 2)
cv2.imshow('camera',frame)
c+=1
key = cv2.waitKey(3)
if key == 27:
#esc键退出
print("esc break...")
break
if key == ord(' '):
# 保存一张图像
num = num+1
filename = "frames_%s.jpg" % num
cv2.imwrite(filename,frame)
# When everything is done, release the capture
capture.release()
cv2.destroyWindow("camera")
标签:人脸识别,img,cv2,det,face,源码,毕业设计,import
From: https://blog.csdn.net/zy_dreamer/article/details/136889279