人脸识别流程,主要包括人脸数据建档与识别两大部分,其中人脸数据建档主要实现对采集人员的人脸数据进行收集入库的过程,人脸识别主要实现对待识别人脸的数据采集与判定的过程。

从具体实现过程来划分,人脸识别整个过程主要包括人脸图特征检测,特征描述,特征对齐,数据库的处理(建立索引以及数据入库)等几个模块。

本文主要以facenet算法为基准来实现人脸识别过程,face算法见如下连接。

https://github.com/davidsandberg/facenet

1、人脸检测

采用mtcnn算法实现对图片的人脸进行检测,load_and_align_data 返回图片中最大人脸的坐标(因为最终目的是实现人脸识别,所以在人脸检测时只需要关注最大人脸即可)

def load_and_align_data(image_paths, image_size=160, margin=44, gpu_memory_fraction=1.0):minsize = 20 # minimum size of facethreshold = [ 0.6, 0.7, 0.7 ] factor = 0.709 print("Creating networks and loading parameters")with tf.Graph().as_default():gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=gpu_memory_fraction)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_alone_pb(sess, "./mtcnn.pb")#for image in tmp_image_paths:try:img = misc.imread(image_paths, mode='RGB')except(OSError, IOError):print("OSError, Path")return []img_size = np.asarray(img.shape)[0:2]for k in range(4):img = ndimage.rotate(img, -90*k)try:bounding_boxes, _ = align.detect_face.detect_face(img, minsize, pnet, rnet, onet, threshold, factor)except Exception as e:print("MemoryError, Path")return []if len(bounding_boxes) > 0:breaksize = 0img_list = []#获取最大人脸for i in range(len(bounding_boxes)):det = np.squeeze(bounding_boxes[i,0:4])# x1,y1,x2,y2bb = np.zeros(4, dtype=np.int32)bb[0] = np.maximum(det[0]-margin/2, 0)bb[1] = np.maximum(det[1]-margin/2, 0)bb[2] = np.minimum(det[2]+margin/2, img_size[1])bb[3] = np.minimum(det[3]+margin/2, img_size[0])hight = bb[3] - bb[1]width = bb[2] - bb[0]if hight * width > size:size = hight * widthcropped = img[bb[1]:bb[3],bb[0]:bb[2],:]aligned = misc.imresize(cropped, (image_size, image_size), interp='bilinear')img_list = facenet.prewhiten(aligned)#img_list.append(prewhitened)images = np.stack(img_list)return images

2、人脸对齐

通过mtcnn算法获取人脸区域后,对该区域进行放射变换处理,依据眼睛与鼻子的点坐标来实现人脸区域的矫正对齐。

        img = cv2.imread(opic)faceKeyPoint = faceKeyPoint[0]#根据两个鼻子和眼睛进行3点对齐eye1 = faceKeyPoint[0]eye2 = faceKeyPoint[1]noise = faceKeyPoint[2]source_point = np.array([eye1, eye2, noise], dtype=np.float32)eye1_noraml= [int(x) for x in face_comm.get_conf('alignment','left_eye').split(',')]eye2_noraml=[int(x) for x in face_comm.get_conf('alignment','right_eye').split(',')]noise_normal=[int(x) for x in face_comm.get_conf('alignment','noise').split(',')]#设置的人脸标准模型dst_point = np.array([eye1_noraml,eye2_noraml,noise_normal],dtype=np.float32)tranform = cv2.getAffineTransform(source_point, dst_point)imagesize=tuple([int(x) for x in face_comm.get_conf('alignment','imgsize').split(',')])img_new = cv2.warpAffine(img, tranform, imagesize)

3、人脸特征描述

将上述步骤获取得到的人脸区域进行特征描述,最终获得128维的特征向量,这128维的特征向量为该人脸的代表

    facenet_model = facenet.load_model(model_path)config = tf.ConfigProto()# Get input and output tensorsgfacenet_persistent_session = tf.Session(graph=facenet_model, config=config)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")face=load_and_align_data(image)# Run forward pass to calculate embeddingsfeed_dict = {images_placeholder: [face], phase_train_placeholder: False}return gfacenet_persistent_session.run(embeddings, feed_dict=feed_dict)[0]

上述代码实现中,首先进行模型加载,任何配置相关参数(gpu环境等),最后导入人脸区域内容,执行模型,输入人脸的特征向量。

4、入库处理

将上述获得的人脸特征向量与人物名称一同进行保存。本文中保存的数据库为lmdb

    total_number = face_lmdb_operate.lmdb_search_total_number(env)image_info = {}image_info['name'] = nameindex = total_number + 1print(image_path)embedding = face_encoder_emdding.generate_embedding(image_path)image_info['info'] = embedding.tolist()face_lmdb_operate.lmdb_insert_path(env,index,image_info)

上述代码实现  人物名称 与 人脸特征向量的配对

def lmdb_insert_path(env, index, info):txn = env.begin(write=True)print(index)print(info)txn.put(str(index).encode(), str(info).encode())txn.commit()

上述代码才是实现 lmdb的插入动作。

5、建立索引

人脸识别时需要对待检测人脸的特征向量与数据库中的特征向量进行对比分析。如果一个个进行比较,效率有点低下,本文借鉴annoy算法来对数据库中的人脸 建立索引。

annoy索引算法假设每个人脸特征可以隐射成高维空间的一个点,如果两个人脸很相似,任何超平面都无法将他们分开。也就是说如果代表人脸的两个点很接接近,如果用超平面去做分割处理,相似的点一定会在同一个平面上。

        # 遍历lmdb_file = self.lmdb_fileif os.path.isdir(lmdb_file):evn = lmdb.open(lmdb_file)wfp = evn.begin()annoy = AnnoyIndex(self.f)for key, value in wfp.cursor():key = int(key)value = face_comm.str_to_embed(value)annoy.add_item(key,value)annoy.build(self.num_trees)annoy.save(self.annoy_index_path)

上述代码为通过lmdb数据库实现annoy索引的过程。

6、人脸识别(测试验证)

对待识别人脸进行特征提取,特征描述后,得到待识别人脸的特征向量,然后通过annoy,在索引中查询最近邻的几个点,如果距离小于阈值(0.6)则认为是同一个人,然后通过数据库查询该人员的相关信息即可。

number=int(face_comm.get_conf('annoy','num_nn_nearst'))
return annoy.get_nns_by_vector(face_vector,number,include_distances=True)

基于facenet的人脸识别相关推荐

  1. facenet训练自己的数据_基于SSD与Facenet的人脸识别

    小方哥-AI人工智能模式识别算法 系统介绍 随着深度学习的日益发展,人脸识别的技术越来越趋于成熟.基于人脸识别的也伴随着众多的应用,比如说基于人脸识别的工厂打卡或者签到系统:基于人脸识别的五官定位以及 ...

  2. 聪明的人脸识别4——Pytorch 利用Retinaface+Facenet搭建人脸识别平台

    睿智的目标检测51--Pytorch 利用Retinaface+Facenet搭建人脸识别平台 学习前言 什么是Retinface和Facenet 1.Retinface 2.Facenet 整体实现 ...

  3. facenet 搭建人脸识别库

    转载自:https://www.cnblogs.com/gmhappy/p/9472387.html 选择的方式是从百度下载明星照片 照片下载,downloadImageByBaidu.py # co ...

  4. 如何在 Keras 中使用 FaceNet 开发人脸识别系统

    https://www.infoq.cn/article/4wT4mNvKlVvEQZR-JXmp Keras 是一个用 Python 编写的高级神经网络 API,能够以 TensorFlow.CNT ...

  5. python人脸识别毕业设计-Python基于Dlib的人脸识别系统的实现

    之前已经介绍过人脸识别的基础概念,以及基于opencv的实现方式,今天,我们使用dlib来提取128维的人脸嵌入,并使用k临近值方法来实现人脸识别. 人脸识别系统的实现流程与之前是一样的,只是这里我们 ...

  6. 基于matlab的人脸五官边缘检测方法,基于MATLAB的人脸识别系统的设计

    基于MATLAB的人脸识别系统的设计(论文12000字,外文翻译,参考程序) 摘要:本文基于MATLAB平台设计了一款简单的人脸识别系统,通过USB摄像头来采集图像,经过肤色方法进行人脸检测与定位,然 ...

  7. python人脸识别训练模型_开源 | 基于Python的人脸识别:识别准确率高达99.38%!

    原标题:开源 | 基于Python的人脸识别:识别准确率高达99.38%! 该库使用 dlib 顶尖的深度学习人脸识别技术构建,在户外脸部检测数据库基准(Labeled Faces in the Wi ...

  8. 【计算机视觉】基于OpenCV的人脸识别

    一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从 ...

  9. DeepMindVGG提出基于集合的人脸识别算法GhostVLAD,精度远超IJB-B数据集state-of-the-art...

    点击我爱计算机视觉标星,更快获取CVML新技术 在人脸识别应用中,很多场景能够获取某一个体的多幅人脸图像的集合(比如在监控视频中),使用人脸图像集来做识别,这个问题被称为基于模板的人脸识别(templ ...

  10. 基于OpenCV实现人脸识别--Python

    目录 前言 第一章 OpenCV介绍 第二章 功能描述 2.1 对已有的数据进行检测 2.2 陌生人检测并发出警告 2.3 保存陌生人的视频 2.4 输入图片进行检测 2.5 现场录用信息 第三章 功 ...

最新文章

  1. 在SpringBoot中使用SpringDataRedis
  2. python官网如何调中文-django的settings中设置中文支持的实现
  3. linux popd 命令,在Linux系统中的Pushd命令与Popd命令,教你这两个命令的基本用法...
  4. 什么样的事才是有意义的
  5. 2017.9.14 星际竞速 失败总结
  6. JavaScript学习(五十)—hasOwnProperty属性和in关键字
  7. 4年猎洞赚百万美金:谈谈我的入门和成功经验
  8. Unable to run mksdcard SDK tool
  9. PS2模拟器 PCSX2 新手向
  10. 腾讯云 DDNS 方案
  11. 足球相声:我现在真的火了
  12. 让我们自己来破解命运外挂999
  13. java strlen_字符串长度函数strlen和mb_strlen的区别示例介绍
  14. LOJ10144宠物收养所
  15. WordPress 前端投稿/编辑发表文章插件 DJD Site Post(支持游客和已注册用户)汉化版 免费下载...
  16. window系统区别
  17. 教您一招解决Word不能复制粘贴问题
  18. avformat_open_input返回-1094995529 “Invalid data found when processing input“
  19. Hadoop入门教程 详细的入门实战教程
  20. MySQL中 1305-FUNCTION liangshanhero2.getdate does not exit 问题解决

热门文章

  1. libmodbus 手册翻译
  2. python3 gzip解压_使用 Python 解压缩 gzip 数据流
  3. 小米com android phone,小米电视助手(com.xiaomi.mitv.phone.tvassistant) - 2.5.7 - 应用 - 酷安...
  4. STM32/STM32L151 RTC唤醒低功耗STOP(停机模式)
  5. 通信原理中的erf/erfc函数
  6. LNK2005 已经在*.obj中定义 排雷
  7. error LNK2005: public: virtual __thiscall CMemDC::~CMemDC(void) (??1CMemDC@@UAE@XZ) already de
  8. 简述商业模式、商业模式画布与商业模式个人画布
  9. html游戏网站设计报告,web前端课程设计以及报告,jquery+js+css+html
  10. 【gigabyte】开机循环进入技嘉主板界面、BIOS功能识别不出硬盘