详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用


Posted in Python onJanuary 21, 2021

人脸识别技术已经相当成熟,面对满大街的人脸识别应用,像单位门禁、刷脸打卡、App解锁、刷脸支付、口罩检测........

作为一个图像处理的爱好者,怎能放过人脸识别这一环呢!调研开搞,发现了超实用的Facecognition!现在和大家分享下~~

详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用

Facecognition人脸识别原理大体可分为:

1、通过hog算子定位人脸,也可以用cnn模型,但本文没试过;

2、Dlib有专门的函数和模型,实现人脸68个特征点的定位。通过图像的几何变换(仿射、旋转、缩放),使各个特征点对齐(将眼睛、嘴等部位移到相同位置);

3、训练一个神经网络,将输入的脸部图像生成为128维的预测值。训练的大致过程为:将同一人的两张不同照片和另一人的照片一起喂入神经网络,不断迭代训练,使同一人的两张照片编码后的预测值接近,不同人的照片预测值拉远;

4、将陌生人脸预测为128维的向量,与人脸库中的数据进行比对,找出阈值范围内欧氏距离最小的人脸,完成识别。

1 开发环境

PyCharm: PyCharm Community Edition 2020.3.2 x64

Python:Python 3.8.7 

Opencv:opencv-python 4.5.1.48

Facecognition:1.3.0

Dlb:dlb 0.5.0

2 环境搭建

本文不做PyCharm和Python安装,这个自己搞不定,就别玩了~

pip install opencv-python
pip install face-recognition
pip install face-recognition-models
pip install dlb

3 打造自己的人脸库

通过opencv、facecogniton定位人脸并保存人脸头像,生成人脸数据集,代码如下:

import face_recognition
import cv2
import os
 
def builddataset():
  Video_face = cv2.VideoCapture(0)
  num=0
  while True:
    flag, frame = Video_face.read();
    if flag:
      cv2.imshow('frame', frame)
      cv2.waitKey(2)
    else:
      break
    face_locations = face_recognition.face_locations(frame)
    if face_locations:
      x_face = frame[face_locations[0][0]-50:face_locations[0][2]+50, face_locations[0][3]-50:face_locations[0][1]+50];
      #x_face = cv2.resize(x_face, dsize=(200, 200));
      bo_photo = cv2.imwrite("%s\%d.jpg" % ("traindataset/ylb", num), x_face);
      print("保存成功:%d" % num)
      num=num+1
    else:
      print("****未检查到头像****")
 
  Video_face.release()
 
if __name__ == '__main__':
  builddataset();
  pass

4、模型训练与保存

通过数据集进行训练,得到人脸识别码,以numpy数据形式保存(人脸识别码)模型

def __init__(self, trainpath,labelname,modelpath, predictpath):
    self.trainpath = trainpath
    self.labelname = labelname
    self.modelpath = modelpath
    self.predictpath = predictpath
 
  # no doc
  def train(self, trainpath, modelpath):
    encodings = []
    dirs = os.listdir(trainpath)
    for k,dir in enumerate(dirs):
      filelist = os.listdir(trainpath+'/'+dir)
      for i in range(0, len(filelist)):
        imgname = trainpath + '/'+dir+'/%d.jpg' % (i)
        picture_of_me = face_recognition.load_image_file(imgname)
        face_locations = face_recognition.face_locations(picture_of_me)
        if face_locations:
          print(face_locations)
          my_face_encoding = face_recognition.face_encodings(picture_of_me,     
                    face_locations)[0]
          encodings.append(my_face_encoding)
    if encodings:
      numpy.save(modelpath, encodings)
      print(len(encodings))
      print("model train is sucess")
    else:
      print("model train is failed")

5、人脸识别及跟踪

通过opencv启动摄像头并获取视频,加载训练好模型完成识别及跟踪,为避免视频卡顿设置了隔帧处理。

def predicvideo(self,names,model):
    Video_face = cv2.VideoCapture(0)
    num=0
    recongnition=[]
    unknown_face_locations=[]
    while True:
      flag, frame = Video_face.read();
      frame = cv2.flip(frame, 1) # 镜像操作
      num=num+1
      if flag:
        self.predictpeople(num, recongnition,unknown_face_locations,frame, names, encodings)
      else:
        break
    Video_face.release()
 
  def predictpeople(self, condition,recongnition,unknown_face_locations,unknown_picture,labels,encodings):
    if condition%5==0:
      face_locations = face_recognition.face_locations(unknown_picture)
      unknown_face_encoding = face_recognition.face_encodings(unknown_picture,face_locations)
      unknown_face_locations.clear()
      recongnition.clear()
      for index, value in enumerate(unknown_face_encoding):
        unknown_face_locations.append(face_locations[index])
        results = face_recognition.compare_faces(encodings, value, 0.4)
        splitresult = numpy.array_split(results, len(labels))
        trueNum=[]
        a1 = ''
        for item in splitresult:
          number = numpy.sum(item)
          trueNum.append(number)
        if numpy.max(trueNum) > 0:
          id = numpy.argsort(trueNum)[-1]
          a1 = labels[id]
          cv2.rectangle(unknown_picture,
                 pt1=(unknown_face_locations[index][1], unknown_face_locations[index][0]),
                 pt2=(unknown_face_locations[index][3], unknown_face_locations[index][2]),
                 color=[0, 0, 255],
                 thickness=2);
          cv2.putText(unknown_picture, a1,
                (unknown_face_locations[index][1], unknown_face_locations[index][0]),
                cv2.FONT_ITALIC, 1, [0, 0, 255], 2);
        else:
          a1 = "unkown"
          cv2.rectangle(unknown_picture,
                 pt1=(unknown_face_locations[index][1], unknown_face_locations[index][0]),
                 pt2=(unknown_face_locations[index][3], unknown_face_locations[index][2]),
                 color=[0, 0, 255],
                 thickness=2);
          cv2.putText(unknown_picture, a1,
                (unknown_face_locations[index][1], unknown_face_locations[index][0]),
                cv2.FONT_ITALIC, 1, [0, 0, 255], 2);
        recongnition.append(a1)
    else:
      self.drawRect(unknown_picture,recongnition,unknown_face_locations)
    cv2.imshow('face', unknown_picture)
    cv2.waitKey(1)

6、结语

通过opencv启动摄像头并获取实时视频,为避免过度卡顿采取隔帧处理;利用Facecognition实现模型的训练、保存、识别,二者结合实现了实时视频人脸的多人识别及跟踪,希望对大家有所帮助~!

到此这篇关于详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用的文章就介绍到这了,更多相关Facecognition+Opencv人脸识别 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python计算文本文件行数的方法
Jul 06 Python
python实现mysql的单引号字符串过滤方法
Nov 14 Python
Flask框架的学习指南之用户登录管理
Nov 20 Python
使用python实现接口的方法
Jul 07 Python
Python正则表达式非贪婪、多行匹配功能示例
Aug 08 Python
python如何使用unittest测试接口
Apr 04 Python
pandas 将list切分后存入DataFrame中的实例
Jul 03 Python
python的pytest框架之命令行参数详解(上)
Jun 27 Python
django的csrf实现过程详解
Jul 26 Python
python要安装在哪个盘
Jun 15 Python
PyTorch安装与基本使用详解
Aug 31 Python
python map比for循环快在哪
Sep 21 Python
Python实现石头剪刀布游戏
Jan 20 #Python
python程序实现BTC(比特币)挖矿的完整代码
Jan 20 #Python
python3中celery异步框架简单使用+守护进程方式启动
Jan 20 #Python
Django+Django-Celery+Celery的整合实战
Jan 20 #Python
详解Python Celery和RabbitMQ实战教程
Jan 20 #Python
详解python3类型注释annotations实用案例
Jan 20 #Python
python-jwt用户认证食用教学的实现方法
Jan 19 #Python
You might like
环境会对咖啡种植有什么影响
2021/03/03 咖啡文化
最小化数据传输――在客户端存储数据
2006/10/09 PHP
zf框架的Filter过滤器使用示例
2014/03/13 PHP
PHP使用ob_start生成html页面的方法
2014/11/07 PHP
php实现基于微信公众平台开发SDK(demo)扩展的方法
2014/12/22 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
2016/05/17 PHP
php+layui数据表格实现数据分页渲染代码
2019/10/26 PHP
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
javascript的offset、client、scroll使用方法详解
2012/12/25 Javascript
jQuery动态添加、删除元素的方法
2014/01/09 Javascript
深入理解JavaScript系列(27):设计模式之建造者模式详解
2015/03/03 Javascript
JavaScript中逗号运算符介绍及使用示例
2015/03/13 Javascript
js实现点击向下展开的下拉菜单效果代码
2015/09/01 Javascript
javaScript事件机制兼容【详细整理】
2016/07/23 Javascript
在vue中使用jointjs的方法
2018/03/24 Javascript
JS实现将对象转化为数组的方法分析
2019/01/21 Javascript
JS canvas实现画板和签字板功能
2021/02/23 Javascript
利用python实现简单的循环购物车功能示例代码
2017/07/05 Python
对Python中的@classmethod用法详解
2018/04/21 Python
Python 中的range(),以及列表切片方法
2018/07/02 Python
解决python给列表里添加字典时被最后一个覆盖的问题
2019/01/21 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
2019/08/15 Python
Python pip 安装与使用(安装、更新、删除)
2019/10/06 Python
python调用Matplotlib绘制分布点图
2019/10/18 Python
详解Django CAS 解决方案
2019/10/30 Python
Python 私有化操作实例分析
2019/11/21 Python
Python实现将蓝底照片转化为白底照片功能完整实例
2019/12/13 Python
Python文件操作及内置函数flush原理解析
2020/10/13 Python
python中使用np.delete()的实例方法
2021/02/01 Python
CSS3 3D制作实战案例分析
2016/09/18 HTML / CSS
IE支持HTML5的解决方法
2009/10/20 HTML / CSS
困难补助申请报告
2015/05/19 职场文书
无房证明样本
2015/06/17 职场文书
浅谈mysql增加索引不生效的几种情况
2021/06/23 MySQL
Nginx的gzip相关介绍
2022/05/11 Servers