1.人脸特征持久化

输入数据集的人脸并得到特征向量之后,首先要持久化下来。

import numpy as np
'''
前面的忽略,就是加载模型,获取数据集,跑模型得到向量f
'''
'''关键代码'''
f = model.get_feature(img)
f.tofile('/myfeature/rep.bin')# 读取
f_ = np.fromfile('/myfeature/rep.bin', dtype=np.float32)
print(f_)

2.人脸识别

思路:

  1. 使用opencv读取视频流。
  2. 获取每一帧并进行人脸检测,进一步特征提取。
  3. 与特征库的特征进行比对。
  4. 设置阈值,求当前特征与特征库特征的距离,提取出最小的距离与阈值比对,如果小于阈值则返回特征所对应的姓名。
  5. 输出姓名到视频流中并用矩形框出识别出的人脸。
import face_model_v2 as face_model
import argparse
import cv2
import sys
import numpy as np
import pandas as pd
import os
parser = argparse.ArgumentParser(description='face model test')
# general
parser.add_argument('--image-size', default='112,112', help='')
parser.add_argument('--model', default='/models/model-r100-ii/model,0', help='path to load model.')
parser.add_argument('--ga-model', default='/models/gamodel-r50/model,0', help='path to load model.')
parser.add_argument('--gpu', default=0, type=int, help='gpu id')
parser.add_argument('--det', default=0, type=int, help='mtcnn option, 1 means using R+O, 0 means detect from begining')
parser.add_argument('--flip', default=0, type=int, help='whether do lr flip aug')
parser.add_argument('--threshold', default=1.24, type=float, help='ver dist threshold')
parser.add_argument('--videoPath', default=0)
parser.add_argument('--binPath', default=0)
args = parser.parse_args()
model = face_model.FaceModel(args)
# 获得持久化的特征库与对应的label
threshold = float(args.threshold)
#print(threshold)
videoPath = args.videoPath
binPath = args.binPath
feature = []
label = []
# 遍历目录获得目录中文件名字作为label,文件内容加入feature
for bin_ in os.listdir(binPath):# 注意要指定dtypefeature.append(np.fromfile(binPath+'/' + bin_, dtype=np.float32))label.append(bin_.split('.')[0])# 查找当前特征最接近的特征
def findNear(feature, f, threshold, label):dist_list = []# 遍历特征库for feature_unit in feature:# 距离的定义是(特征1-特征2)开根号并求和dist = np.sum(np.square(feature_unit - f))# dist_list作用是将所有距离都保存下来,以便获得最小距离dist_list.append(dist)# 寻找到最小距离minDist = np.min(dist_list)# 如果最小距离小于等于阈值if minDist <= threshold:# 求出最小距离对应的索引minIdx = np.argmin(dist_list)# 找到姓名return label[minIdx]else:# 如果没有满足条件的,就返回'none'return 'none'
print('*'*8, 'into video')
# read video
try:# 按路径读取视频cap = cv2.VideoCapture(videoPath)# 将视频缩小,目的是加快程序运行速度。cap.set(3, 240)cap.set(4, 180)print('get video')# 获得当前图像长宽width = int(cap.get(3))height = int(cap.get(4))# 不光读取图像,还要讲识别结果写入视频并返回,所以这一步是指定视频编码fourcc = cv2.VideoWriter_fourcc(*'XVID')# 指定视频输出对象,视频输出路径、编码、帧数、视频大小out = cv2.VideoWriter('./video/output.avi', fourcc, 25, (width,height))# 开始读取视频并做识别while True:# 读取视频,ret-是否读取成功, frame-图像ret, frame = cap.read()if ret:try:# 这里修改了一下face_model,使其返回的多个人脸和对应坐标imgs,bbox = model.get_input(frame)# 遍历人脸和坐标for img_unit,bbox_unit in zip(imgs, bbox):# 因为有可能没有人脸,所以如果img_unit有shape值,那就是有人脸if img_unit.shape:# 获得特征f = model.get_feature(img_unit)# 找到匹配信息res = findNear(feature, f, threshold, label)# 如果匹配到了姓名if res != 'none':# 用方框标注,bbox_unit中的值为(左,上,右,下)# 按照cv2.rectangle的参数写入cv2.rectangle(frame, (int(bbox_unit[0]), int(bbox_unit[1])),(int(bbox_unit[2]), int(bbox_unit[3])), (0,0,255))# 标记文字到图像中,参数:图像,文字,位置,字体,大小,颜色,宽度frame = cv2.putText(frame, res, (int(bbox_unit[2]), int(bbox_unit[3])+2), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255), 1)# 写出视频out.write(frame)except Exception as e:# 如果图像没有shape代表着没有人脸,img.shape就会报NoneType错误,捕获错误,并直接写出视频out.write(frame)# 每帧遍历if cv2.waitKey(1) & 0xff == ord('q'):break# 视频读取完毕,ret返回false那么退出循环else:break# 释放资源cap.release()out.release()cv2.destroyAllWindows()
# 程序就算报错也要正常释放资源,所以要捕获这个视频识别流程
except Exception as e:print(e)
# 最终释放资源
finally:cap.release()out.release()cv2.destroyAllWindows()
print('final')

3.源码改动

因为,源码指定了只检测一个人脸,所以需要更改源码以获得多个人脸进行识别。

进入insightface/deploy路径找到face_model.py,复制一份更名face_model_v2.py并编辑。

# 主要修改get_input方法
def get_input(self, face_img):#print('into face_model_v2')ret = self.detector.detect_face(face_img, det_type = self.args.det)if ret is None:return Nonebbox, points = ret# 存放所有检测的人脸图像aligned_list = []# 存放所有人脸坐标bbox_list = []    if bbox.shape[0]==0:return Nonefor i in range(bbox.shape[0]):# 获取每一个坐标bbox_ = bbox[i,0:4]# 存放坐标bbox_list.append(bbox_)# 获取每一个特征点points_ = points[i,:].reshape((2,5)).Tnimg = face_preprocess.preprocess(face_img, bbox_, points_, image_size='112,112')nimg = cv2.cvtColor(nimg, cv2.COLOR_BGR2RGB)aligned = np.transpose(nimg, (2,0,1))# 存放坐标aligned_list.append(aligned)
return aligned_list, bbox_list

4.接下来跑程序就行了,注意一下路径

2.使用insightface读取视频进行人脸识别相关推荐

  1. opencv对视频进行人脸识别--使用videoCapture类

    文章目录 前言 一.libfacedetection的配置及基本介绍: 二.VideoCapture类: 1.构造函数类型: 2.1.1.VideoCapture(); 2.1.2.VideoCapt ...

  2. haar分类器详解(Haar特征,积分图,adaboost算法,筛选式级联分类器),DCG介绍 --文献阅读报告《基于素描对视频的人脸识别研究》

    基于素描对视频的人脸识别--haar分类器详解,haar特征,adaboost,级联强分类器,积分图,DCG 背景 算法总体流程 1.预处理--识别出人脸并将人脸图像标准化 haar特征 积分图--加 ...

  3. python读取视频流做人脸识别_基于 Python + OpenCV 进行人脸识别,视频追踪代码全注释...

    1 #-*- coding: utf-8 -*- 2 from __future__ importunicode_literals3 #操作文件 4 importos5 #科学计算 6 importn ...

  4. python读取视频流做人脸识别_python实现图片,视频人脸识别(opencv版)

    图片人脸识别 import cv2 filepath = "img/xingye-1.png" img = cv2.imread(filepath) # 读取图片 gray = c ...

  5. python读取视频流做人脸识别_基于OpenCV和Keras实现人脸识别系列——二、使用OpenCV通过摄像头捕获实时视频并探测人脸、准备人脸数据...

    基于OpenCV和Keras实现人脸识别系列手记: 项目完整代码参见Github仓库. 本篇是上面这一系列手记的第二篇. 在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,而 ...

  6. QT Opencv 图像处理 视频处理 人脸识别

    前言 近期学习了OpenCV的一些函数 然后配合着函数跟QT的一些UI写一个图像跟视频处理跟摄像头处理的一些功能 但是这个主要的一个框架是学习一个视频的 当时主要讲的是一个OpenCV的视频处理的 U ...

  7. TSINGSEE青犀视频平台人脸识别比对控制比对时间间隔的代码设计

    随着人工智能进入快速发展的阶段,安防视频监控平台也过渡到以智能化应用为主流趋势的新赛道.TSINGSEE青犀视频基于多年在音视频领域的深耕与开拓,我们也积极以AI技术为核心进行产品的转型升级.当前阶段 ...

  8. 百度飞浆之PaddleHub视频移动人脸识别

    百度AI Studio原项目链接------点击此处前往 安装paddlehub 使用pip简单操作即可 pip install paddlehub paddlehub丰富的预训练模型链接:点击此处前 ...

  9. 麦子学院深度学习视频SVM人脸识别课程代码修改及实现

    1.麦子学院深度学习SVM人脸识别原代码对应修改 2.代码实现 1.麦子学院深度学习SVM人脸识别原代码对应修改 1.1 from sklearn.cross_validation import tr ...

最新文章

  1. Android开发工具——ADB(Android Debug Bridge) 三DalvikVM之jdwp线程
  2. flutter能开发游戏吗_游戏开发者都擅长“打自己的游戏”吗?
  3. PHP的工作原理和生命周期
  4. 最容易被盗的密码,你中了么?
  5. 太牛了,原来古人是这样铸造钱币的。。。
  6. protected访问权限_权限修饰符 /重写
  7. NLP复习资料(1)-绪论、数学基础
  8. 并发库之CountDownLatch
  9. Java 之 注释介绍
  10. python datetime 加一个月_Python日期的加减等操作的示例
  11. maya拓扑插件_3D角色模型,Maya、Zbrush人头建模
  12. Linux中特殊字符
  13. 宋宝华:谈一谈Linux写时拷贝(COW)的安全漏洞(1)
  14. Unity源码分享之 电视遥控器按钮事件控制
  15. 如何修改DOSBOX的窗口大小
  16. Kong API Gateway 管理API详解
  17. 借记来帐,借记往账,贷记来帐,贷记往账
  18. HTML免费在线文档批量翻译工具
  19. Swift CoreAnimation ---- CALayer的呈现层和模型层
  20. Java面试题基础系列

热门文章

  1. java中的aware_spring中的aware接口
  2. 子序列和子串问题算法的全面总结
  3. Mac火影忍者的房子高清动态壁纸
  4. linux运维上机题,Linux运维入门实战题
  5. 想提高计算机水平计划,强化对口单招计算机技能有效训练的体会
  6. 利用POI操作不同版本号word文档中的图片以及创建word文档
  7. 对VB注册全局热键的思考——是不是RegisterHotKey的1个ID可以注册多组热键?
  8. 容器化应用: 实验环境-安装配置Minishift
  9. 如何通过媒体营销来打造成功的产品?
  10. 偷偷学习Java,然后惊艳所有人 JavaSE总结 - thread多线程