首页 > 编程语言 >毕业设计——基于facenet实时人脸识别系统的设计与实现+源码+综述

毕业设计——基于facenet实时人脸识别系统的设计与实现+源码+综述

时间:2024-03-21 09:32:26浏览次数:25  
标签:人脸识别 img cv2 det face 源码 毕业设计 import

如需完整源码,可以联系博主获取

技术路径: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

相关文章

  • 基于Java+Springboot技术仓库管理系统的实现+项目全套源码+完整文档源码说明+毕业论文
    摘 要现如今,许多企业存在的问题:信息化不足,计算机使用率不高,大量的日常工作皆是手工处理,因此工作效率低,企业内部沟通不良等等问题很难克服。要提升企业竞争力,企业内部信息化是不可缺少的一个步骤。所以要实施先进的自动化系统,实现企业内部信息管理、共享及交流,才能让企业在......
  • 工良出品,从零设计开发 .NET 开发框架:框架源码和教程电子书
    为什么要写这个教程在毕业之后,读者写过了大量的文章和开源项目,正是坚持一边学习一边输出,所以笔者最终从一个生菜鸡进化为一个熟菜鸡。在程序员的成长中,我们会在思路,如何学习、如何进步,比如要成长为一个架构师,需要具备什么样的能力。比如说技术能力,技术能力是最核心的基础,那么我......
  • 【OpenFeign】@FeignClient 注入过程源码分析
    1 前言微服务之间的调用,OpenFeign是一种选择,并且还提供了很多功能,比如我们有多个节点,它能负载均衡,当服务发生异常时,它还能提供熔断机制。所以它是怎么实现的,因为我们平时只需要写@FeignClient是个接口,所以它势必会走代理,所以是不是要从我们的@FeignClient 下手。那么这节......
  • 个人主页HTML5网站源码个性炫酷大气简洁唯美官网上线倒计时引导页HTML5源码
    源码介绍:个性化官宣个人主页,个人主页HTML5网站源码个性炫酷大气简洁唯美官网上线倒计时引导页HTML5源码,超好看的个人官网展示页面。源码下载:个性炫酷大气简洁唯美官网上线倒计时引导页HTML5源码下载界面预览:......
  • 基于springboot实现校园管理系统的设计与实现演示【附项目源码+论文说明】
    基于springboot实现校园管理系统的设计与实现演示摘要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,校园管理系统当然也不能排除在外。校园管理系统是以实际运用为开发背景,运用软件工程原理和开发方法,采用sp......
  • 基于SpringBoot实现旅游网站管理系统项目演示【附项目源码+论文说明】
    基于SpringBoot实现旅游网站管理系统项目演示摘要随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势,旅游网站当然也不能排除在外,随着旅游网站的不断成熟,它彻底改变了过去传统的旅游网站方式,不仅使旅游管理难度变低了,还提升了旅游网站......
  • Java如何修改框架源码(以ZooKeeper框架为例)
    1、缘由:在Zookeeper框架内部源码中,org.apache.zookeeper.ClientCnxn.SendThread#logStartConnect方法会打印客户端与服务器端的连接状态,如果在网络出现波动时会出现连接异常并在日志中打印出INFO级别信息【java.lang.IllegalArgumentException】,而这个关键词会触发运维告警。2......
  • java毕业设计基于微信小程序的中药调理系统
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义随着现代生活节奏的加快,人们对于健康问题越来越关注。在众多保健方式中,中药以其独特的调理作用和较少的副作用受到广泛欢迎。然而,中药的种类繁多,配方复杂,普通人往......
  • 高性能、可扩展、支持二次开发的企业电子招标采购系统源码
    在数字化时代,企业需要借助先进的数字化技术来提高工程管理效率和质量。招投标管理系统作为企业内部业务项目管理的重要应用平台,涵盖了门户管理、立项管理、采购项目管理、采购公告管理、考核管理、报表管理、评审管理、企业管理、采购管理和系统管理等多个方面。该系统以项目为......
  • 深入了解鸿鹄工程项目管理系统源码:功能清单与项目模块的深度解析
     工程项目管理软件是现代项目管理中不可或缺的工具,它能够帮助项目团队更高效地组织和协调工作。本文将介绍一款功能强大的工程项目管理软件,该软件采用先进的Vue、Uniapp、Layui等技术框架,涵盖了项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营等全过程。通过......