详解基于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 相关文章推荐
linux下python抓屏实现方法
May 22 Python
Python之列表的插入&替换修改方法
Jun 28 Python
Django框架自定义session处理操作示例
May 27 Python
python图形开发GUI库pyqt5的基本使用方法详解
Feb 14 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
Feb 26 Python
django model的update时auto_now不被更新的原因及解决方式
Apr 01 Python
通过python调用adb命令对App进行性能测试方式
Apr 23 Python
Python中的xlrd模块使用原理解析
May 21 Python
Python3合并两个有序数组代码实例
Aug 11 Python
Django一小时写出账号密码管理系统
Apr 29 Python
Python图片检索之以图搜图
May 31 Python
Python获取江苏疫情实时数据及爬虫分析
Aug 02 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
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
PHP实现 APP端微信支付功能
2018/06/22 PHP
thinkphp5 模型实例化获得数据对象的教程
2019/10/18 PHP
表单提交验证类
2006/07/14 Javascript
Dom 结点创建 基础知识
2011/10/01 Javascript
5分钟理解JavaScript中this用法分享
2013/11/09 Javascript
使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
2014/04/23 Javascript
node.js中的http.response.write方法使用说明
2014/12/14 Javascript
JS输入用户名自动显示邮箱后缀列表的方法
2015/01/27 Javascript
JavaScript获取表单enctype属性的方法
2015/04/02 Javascript
浅析四种常见的Javascript声明循环变量的书写方式
2015/10/14 Javascript
javascript实现dom元素可拖动
2016/03/21 Javascript
AngularJS实现textarea记录只能输入规定数量的字符并显示
2016/04/26 Javascript
jQuery控制div实现随滚动条滚动效果
2016/06/07 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
AngularJS 仿微信图片手势缩放的实例
2017/09/28 Javascript
vue.js实例对象+组件树的详细介绍
2017/10/20 Javascript
vue+Element-ui实现分页效果实例代码详解
2018/12/10 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
2019/04/01 Javascript
JS实现的雪花飘落特效示例
2019/12/03 Javascript
详解Webpack抽离第三方类库以及common解决方案
2020/03/30 Javascript
Python yield 小结和实例
2014/04/25 Python
基于Python实现通过微信搜索功能查看谁把你删除了
2016/01/27 Python
Python中标准模块importlib详解
2017/04/16 Python
Python中的单继承与多继承实例分析
2018/05/10 Python
详解numpy的argmax的具体使用
2019/05/27 Python
python实现一行输入多个值和一行输出多个值的例子
2019/07/16 Python
Python StringIO及BytesIO包使用方法解析
2020/06/15 Python
python中的时区问题
2021/01/14 Python
利用HTML5的新特点实现图片文件异步上传
2014/05/29 HTML / CSS
AHAVA美国官方网站:死海海泥护肤品牌
2016/10/18 全球购物
Feelunique中文官网:欧洲最大化妆品零售电商
2020/07/10 全球购物
大专毕业生自我鉴定
2013/11/21 职场文书
《穷人》教学反思
2014/04/08 职场文书
2016年村干部公开承诺书(公开承诺事项)
2016/03/25 职场文书
python实现A*寻路算法
2021/06/13 Python