趁空闲时间,记录一下做过的一个实验室项目,主要分为4个部分:1)语音转文字;2)人脸识别;3)行人识别;4)检索。本人负责人脸识别和检索模块及整体项目的融合,在此介绍一下自己所做的两个模块。

背景

对于现今摄像录影众多的情况,想了解一个人是否在某个时间段内出现过以及出现的时间等信息,以往需要大量的人力去查找。针对于这个问题,我们开发了一个人脸检索系统,可以快速的定位到此人是否出现,出现在什么时候等信息,以此来解决需要耗费大量人力的问题。

大体流程

  1. 使用opencv读取视频,每隔25帧进行一次人脸特征提取(视频帧数为25,如果每帧都处理不是很合理,1是会出现很多重复的人脸,2是人脸识别算法fps速度不够,会产生卡顿)
  2. 使用人脸检测算法对视频帧进行检测及提取人脸特征
  3. 使用Faiss索引库构对提取到的人脸特征加入索引构建特征数据库
  4. 使用Flask框架实现前后端的交互传输

相关技术

1. 人脸识别算法

项目中尝试了Opencv、Dlib、Mtcnn+FaceNet的算法,最后选定了Mtcnn+FaceNet算法,优势是在小脸和侧脸方面检测更优。

Mtcnn【输入:图片帧;输出:检测到的人脸框、置信分数、5个关键点位置】
FaceNet【输入:160x160大小的人脸图片(按Mtcnn检测到的人脸框裁剪,根据关键点进行人脸对齐,再resize成160x160大小);
输出:人脸特征(128维)】

1.1 Mtcnn算法

参考:Mtcnn详解

mtcnn网络主要分为4个阶段:图像金字塔、PNet、RNet、ONet

  1. 图像金字塔:

输入一张图片,将图片resize到500,然后按照factor = 0.709依次缩小裁剪至图片大小为12,将所有图片保存

  1. PNet:

针对每一张图片,依次输入PNet,输出很多个粗略的候选框(每个框有位置信息还有置信分数),将每个图片的候选框合并,然后进行NMS算法,得到一些粗略的proposal

  1. RNet:

将PNet得到的proposal裁剪并resize成24x24大小,输入Rnet,然后进行NMS,得到较准确的rois(位置和分数)【RNet的NMS阈值设置为0.3,只剩下少了的rois了】

  1. ONet:

将RNet得到的较准Rois裁剪并resize成48x48大小,输入ONet,然后进行NMS,得到最终的rois,即rectangles。
【len(rectangles) 的个数为检测到的人脸数,len(rectangles[0])为15,4:框的位置坐标,1:置信分数,10:5个关键点的坐标】

1.2 FaceNet算法

根据Mtcnn的输出结果,在原图片上进行裁剪人脸,并进行人脸对齐矫正,随后使用FaceNet算法的backbone对裁剪后的人脸进行特征提取(128维),其网络模型就是InceptionResNetV1,比较容易,这里就不详细讲了
FaceNet的triple loss:Facenet介绍
【注,常见的对齐方法:通过双眼坐标进行旋正、通过矩阵运算求解仿射矩阵进行旋正】

2. Faiss

使用faiss索引库对提取到的人脸特征加入索引构建数据库

  1. 代码实现(faiss快速入门)
def index_build(self, indexfilename):"""将特征构建索引库:param indedxfilename: 索引所保存的位置:return:"""if self.featureType == "face": d = 128if self.featureType == "person": d = 256file = open(self.featurePath)json_data = json.load(file)features = []if d == 128:  # 表示读入的为人脸特征for i in range(len(json_data)):features.append(json_data[i]['feature'])index = faiss.IndexFlatL2(d)if d == 256:  # 表示读入的为行人特征,保存格式与人脸不同,遂用两段代码分别处理for person in json_data[0].keys():features.append(json_data[0][person]['feature'])index = faiss.IndexFlatIP(d)features = np.asarray(features).astype(np.float32)index.add(features)faiss.write_index(index, indexfilename)
  1. faiss构建数据库的优点(参考)
  • faiss专门提供向量存储搜索等相关服务,支持索引的动态增删
  • 良好的搜索效率和内存占用:128/100万/0.024ms/1.552GB;128/500万/0.047ms/5.504GB
  • 支持多种相似度索引方式

3. Flask

使用Flask进行前后端的交互功能

  1. 代码实现(入门教程很多,就不贴了…)
#服务器端
"""
传输模块
"""
app = Flask(__name__)@app.route('/register', methods=['POST'])
def register():all_video_inf = []res = json.loads(request.data)if ('key words' in res.keys()) and (res['key words'] != ''):print('输入关键字成功')wordInformation = Information("word", res['key words'])video_time_words = wordInformation.word_search()    #检索关键字all_video_inf.append(video_time_words['result'])if ('face' in res.keys()) and (res['face'] != ''):print('输入人脸图片成功')faceInformation = Information("face", res['face'])video_time_face = faceInformation.face_search_in_many_videos(faceFeature2IndexPath, faceFeature2TimeListPath)   #检索人脸all_video_inf.append(video_time_face['result'])if ('person' in res.keys()) and (res['person'] != ''):print('输入人体图片成功')personInformation = Information("person", res['person'])video_time_person = personInformation.person_search_in_many_videos(personFeature2IndexPath, personFeature2TimeListPath)     #检索行人all_video_inf.append(video_time_person['result'])else:return str('status:Error')#合并重复的检索结果allOfTime = Time(all_video_inf)result = allOfTime.merge()return str(result)#客户端
import requests
import cv2
import json
import numpy as np#输入查询数据(文本、人脸、行人)
face_name = 'face1.jpg'
person_name = 'person2.jpg'
test_data = [1,2,3,4,5]inquire_data = {'key words':'word3','face':(cv2.imread('./save_img/'+face_name)).tolist(),'person':(cv2.imread('./save_img/'+person_name)).tolist()}# requests发送数据给服务器端并接收返回数据
response = requests.post("http://127.0.0.1:9000/register", data=json.dumps(inquire_data))
output = eval(response.text)
print(output)

另,有对这个项目感兴趣的或者想要代码的小伙伴可以留下邮箱~

人脸识别+检索项目记录相关推荐

  1. TensorFlow框架做实时人脸识别小项目

    人脸识别是深度学习最有价值也是最成熟的的应用之一.在研究环境下,人脸识别已经赶上甚至超过了人工识别的精度.一般来说,一个完整的人脸识别项目会包括两大部分:人脸检测与人脸识别.下面就我近期自己练习写的一 ...

  2. 人脸识别完整项目实战(3):项目系统架构设计

    一.前言 本文是<人脸识别完整项目实战>系列博文第1部分,第2节<项目系统架构设计>,本章内容系统介绍:人脸系统系统的项目架构设计,包括:业务架构.技术架构.应用架构和数据架构 ...

  3. 基于人脸识别的考勤记录项目

    写在前面,通过小项目来驱动学习和实践是一种进步很快的方法,本文就是介绍一个基于人脸识别的考勤小项目(Python). 项目学习自一位Youtuber. 1.前期知识 1)了解face_recognit ...

  4. 【人脸识别】旷世的好用的人脸识别 insightface 使用记录和搭建服务注意点和坑,手把手教你从0到1,太好用了,可以直接运行项目,跟进更新+ffmpeg拉流抽帧

    文章目录 前言 1.开始 1.1 前置 1.2 再次运行,人脸检测跑通 1.3 人脸特征抽取 1.3.1 模型下载 1.3.2 重新跑一下检测和识别 1.3.3 人脸监测返回值分析 1.3.4 计算相 ...

  5. 人脸识别系统设计 -- 项目任务指导书

    一.项目名称 例:关于性别和年龄的人脸识别系统设计 二.目的 用有监督学习机制设计并实现模式识别方法,用于进行人脸面部特征识别,如性别(男性.女性).年龄(儿童.青少年.成年.老年).种族(白.黑). ...

  6. 实战:人脸识别实战项目(源码共享)

    首先我想问个问题:现在什么工程师最值钱? 毫无疑问,我想超 90% 的都会说:人工智能工程师.也难怪,随着近几年人工智能的发展,已经逐渐渗透到了各个领域,比如:医疗.教育.机械自动化.个性化推荐.信息 ...

  7. AI实战:人脸识别实战项目(源码共享)

    首先我想问个问题:现在什么工程师最值钱? 毫无疑问,我想超 90% 的都会说:人工智能工程师.也难怪,随着近几年人工智能的发展,已经逐渐渗透到了各个领域,比如:医疗.教育.机械自动化.个性化推荐.信息 ...

  8. Qt5.7+Opencv2.4.9人脸识别(一)项目介绍

    [注意]本博文的档次适合Opencv初学者,和要做本科生毕业设计这类档次. 昨天晚上刚刚参加了某s*i*p的答辩,发现就是走个流程,与Q群里面其他学生的学校比起来,我们学校编程与其他学校差距较大,在此 ...

  9. 人脸识别开源项目--insightface

    目录 1 insightface简介 2 安装insightface 3 使用insightface 4 结合Flask框架 1 insightface简介 最近人脸识别等机器学习的项目很火,偶然间发 ...

最新文章

  1. Keras快速上手:基于Python的深度学习
  2. HTTP中Accept与Content-Type区别
  3. Word2013、2016中页码总页数设置为当前节总页数
  4. Mysql中字段类型之时间戳大坑
  5. RouteOS的DHCP服务器配置
  6. WebRTC 的版本号与代码分支
  7. 深度学习 图像分类_深度学习时代您应该阅读的10篇文章了解图像分类
  8. java jsp校验提示信息_java Jquery表单校验代码jsp页面
  9. 用nohup重定向python输出到文件不成功的解决办法
  10. oracle imp命令参数,oracle exp和imp命令参数详解
  11. IR2110栅极驱动密勒效应解决电路
  12. word中安装Zotero插件
  13. gt240m x86 android,国产平板福音!INTEL ATOM x86_64位Xposed框架,Android5.1(lolipop)适用...
  14. 路由器 OSPF 动态路由配置
  15. 【JavaSE】JDK新特性(二)————接口新特性,函数式接口(Suppier,Comsumer,Predicate,Function)
  16. java基本微信小程序的琴房预约管理系统 uniapp 小程序
  17. Flutter 打包iOS包出现 ld: bitcode bundle could not be generated because
  18. 集合框架及ArrayList、LinkedList源码的个人理解
  19. iptables端口映射详解
  20. 西交计算机科学与技术学院,2021年“工科大学”专业排名,哈工大、西安交大、华科进入前20名...

热门文章

  1. laravel 环境自编译过程
  2. SpringMVC4 实例
  3. ipad 开发常用问题
  4. 【Java 强化】单元测试(JUnit3、JUnit4)、XML(语法、约束、文档结构)、DOM、DOM4J
  5. 【恋上数据结构】图代码实现、最小生成树(Prim、Kruskal)、最短路径(Dijkstra、Bellman-Ford、Floyd)
  6. Linux操作Oracle(4)——查看oracle后台进程的方法【windows系统/Linux系统】
  7. 如何在shell中执行 字符串拼接起来的命令 cmd = ls / 执行方法:$cmd
  8. 30岁,没有月入过万算失败吗?用可视化分析30岁的人收入真相
  9. 当我们写Controller时,VisitRefer注解是干什么的。
  10. w25q64 linux,W25Q64Flash芯片STM32操作