首页 > 其他分享 >facenet + fiass 实现人脸识别

facenet + fiass 实现人脸识别

时间:2023-08-16 16:33:31浏览次数:45  
标签:人脸识别 self facenet cv2 人脸 time fiass frame faiss

  1. 人脸检测
    1. 使用MTCNN模型的detech方法获取人脸坐标
  2. 人脸识别
    1. 使用MTNN模型获取人脸特征
    2. 使用InceptionResnetV1模型获取512个人脸特征向量
    3. 使用获取的人脸特征向量与已知人脸向量对比,已知人脸向量存储在fiass相似性搜索库中




      from facenet_pytorch import MTCNN, InceptionResnetV1
      from PIL import Image, ImageDraw
      import cv2
      import time
      import numpy as np
      import torch
      import faiss
      
      
      class FaissDB(object):
          def __init__(self, d=512):
              """创建相似性搜索库"""
              self.index = faiss.IndexFlatL2(d)  # build the index
      
          def add(self, data):
              """添加向量"""
              # index.add(1000004, xb)  # add vectors to the index
              self.index.add(data)
      
      
          def search(self, target, k=1):
              """
              查询faiss向量数据库获取欧氏距离最小的特征向量
              Args:
                  target: 目标向量
                  k: 返回最相近的特征向量数量
      
              Returns:
      
              """
              # 从索引中得到前K近个向量, search方法返回值D(欧氏距离值), I(索引值)
              D, I = self.index.search(target, k)  # sanity check
              # val = filter(lambda x: x < 0.6, D)
              return I
      
      
      class Video(object):
          def __init__(self, mtcnn, resnet):
              self.mtcnn = mtcnn
              self.resnet = resnet
      
          def detection_face(self):
              before_detection_time = 0
              # cv2.resizeWindow("cap", (480, 480))
              capture = cv2.VideoCapture(0)  # 0为电脑内置摄像头
      
              while (True):
                  my_faiss = FaissDB()
                  # 特征向量的尺寸
                  d = 512  # dimension
                  # 生成10万条随机特征向量
                  xb = torch.randn((100000, d), dtype=torch.float)
                  my_faiss.add(xb)
                  fcj = torch.tensor(np.load("/Users/wb-fcj414969/project/facenet-pytorch-master/test/img/fcj.npy"))
                  my_faiss.add(fcj)
      
                  ret, frame = capture.read()  # 摄像头读取,ret为是否成功打开摄像头,true,false。 frame为视频的每一帧图像
                  cur_time = time.time()
                  if cur_time - before_detection_time > 0.2:
                      # 格式转变,BGRtoRGB
                      frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                      frame = cv2.flip(frame, 1)  # 摄像头是和人对立的,将图像左右调换回来正常显示。
      
                      # 人脸检测,显示人脸框,显示特征点
                      boxes, probs, points = self.mtcnn.detect(frame, landmarks=True)
                      if boxes is not None:
                          max_boxe, amx_probs, max_point = self.mtcnn.select_boxes(boxes, probs, points, frame)
                          img = Image.fromarray(frame)  # ndarry类型转Image类型
                          draw = ImageDraw.Draw(img)
                          draw.rectangle((tuple(max_boxe[0][:2].tolist()), tuple(max_boxe[0][2:].tolist())), width=1)
                          for item in max_point[0]:
                              draw.point(tuple(item), fill=(255, 0, 0))
      
                          # 获取人脸张量信息, 并存储
                          img_cropped = self.mtcnn(frame)
                          # Calculate embedding (unsqueeze to add batch dimension)
                          img_embedding = torch.tensor(self.resnet(img_cropped).detach().numpy())
      
                          # 查询向量数据库
                          data = my_faiss.search(img_embedding)
      
                          if data:
                              # 此处通过检测到的人脸索引值获取人脸特征查询数据库获取人员信息,并显示在屏幕中
                              draw.text(tuple(max_boxe[0][:2].tolist()), "fjc")
      
                      # # Image类型转ndarry类型后,显示处理后的图片
                      frame = np.array(img)
                      # RGBtoBGR满足opencv显示格式
                      frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
                  cv2.imshow("video", frame)
      
                  # 判断是否点击了退出键
                  c = cv2.waitKey(50)
                  if c == 27:
                      break
              cv2.destroyAllWindows()
      
      
      if __name__ == "__main__":
          # 116.398663,39.919528
          # 116.408149,39.929599
      
          # a = [[(i, j) for j in range(39919528, 39929599)] for i in range(116398663, 116408149)]
          #
          # b = torch.tensor(a)
          # b = b.view([-1, 2])
          #
          # # 测试faiss速度
          # my_faiss = FaissDB(d=2)
          # my_faiss.add(b)
          # predict = torch.tensor([[116401754, 39925781]])
          # predict = predict.repeat(1000, 1)
          # time1 = time.time()
          # result = my_faiss.search(predict)
          # time2 = time.time()
          # print(time2-time1)
      
          image_size = 160
          mtcnn = MTCNN(image_size=160, margin=0, keep_all=True)
          mtcnn.eval()
          # Create an inception resnet (in eval mode):
          resnet = InceptionResnetV1(pretrained='vggface2')
          resnet.eval()
      
          video = Video(mtcnn, resnet)
          video.detection_face()
      

        




标签:人脸识别,self,facenet,cv2,人脸,time,fiass,frame,faiss
From: https://www.cnblogs.com/fuchenjie/p/17635447.html

相关文章

  • 通过人脸识别来解锁手机并不算什么新鲜事
    导读:在本文中,我们将会接触到一个既熟悉又陌生的概念——人脸识别。之所以熟悉,是因为人脸识别技术在我们日常生活中应用极其广泛,例如火车站刷脸验票进站、手机人脸解锁等;之所以陌生,是因为我们可能并不了解人脸识别的原理,不了解人脸识别的任务目标、发展历程与趋势。那么,在本文中,我......
  • 智慧工地平台的技术应用:无线传感器、人脸识别和云计算
    智慧工地云平台源码 智慧工地源码智慧工地是指通过信息化技术、物联网、人工智能技术等手段,对建筑工地进行数字化、智能化、网络化升级,实现对施工全过程的实时监控、数据分析、智能管理和优化调控。智慧工地的建设可以提高工地的安全性、效率性和质量,降低施工成本,是建筑行业数字化......
  • 百度人脸识别授权序列号-设备时间复原问题
    Q:为什么单设备授权序列号失效?A:以下情况都有可能导致序列号失效,请您进行一-排查1.测试序列号过期,请在百度智能云管理后台申请更多测试序列号2.CPU、网卡等硬件损坏导致硬件指纹变更3.已经激活的设备硬件变更4.SDK升级:安卓1.0&2.0版本升级至3.0&4.0&5.0版本会导......
  • 使用LabVIEW 实现物体识别、图像分割、文字识别、人脸识别等深度视觉
    前言哈喽,各位朋友们,这里是virobotics(仪酷智能),这两天有朋友私信问之前给大家介绍的工具包都可以实现什么功能,最新的一些模型能否使用工具包加载,今天就给大家介绍一下博主目前使用工具包已经实现的深度视觉模型及案例下表为前期写过的一些范例介绍,朋友们可以按需点击查看名字......
  • 天津、南京、杭州多地立法,严格限制人脸识别
    By超神经内容提要:人脸识别近日又屡上热搜,一次次相关事件的持续发酵,也引起当地政府部门的重视,相关立法接踵而至。关键词:人脸识别立法 近日,关于人脸识别的话题频频登上热搜,面对「刷脸」乱象,国内外多地已经开始推进相关立法。随着人脸识别技术相关法律法规的空白被填补,相关企业、机......
  • 基于Alexnet深度学习神经网络的人脸识别算法matlab仿真
    1.算法理论概述       人脸识别是计算机视觉领域中一个重要的研究方向,其目的是识别不同人的面部特征以实现自动身份识别。随着深度学习神经网络的发展,基于深度学习神经网络的人脸识别算法已经成为了当前最先进的人脸识别技术之一。本文将详细介绍基于AlexNet深度学习神经......
  • 人脸识别技术:拓展智能世界的大门
    导言:人脸识别技术是计算机视觉领域的一项重要技术,通过分析和识别人脸图像,将人脸信息与数据库中的信息进行匹配,实现身份认证、安防监控、智能支付等应用。随着人工智能技术的不断发展和应用,人脸识别技术正迅速走进我们的日常生活。本文将深入探讨人脸识别技术的原理、应用场景以及......
  • Android 人脸识别 MTCNN Kotlin实现
    前言看见网上有一个MTCNN的Java实现,闲来无事,把Java实现用Koltin重写了一下,主要是针对使用MTCNN来识别人脸。不想罗嗦看的,可以直接去我的github上下载已经写好的demo。https://github.com/ChineseLincoln/AndroidFaceNet文章目录前言人脸识别tensorflowAndroid依赖配置MTCNN......
  • Python采集主播照片,实现人脸识别, 进行颜值评分,制作颜值排行榜
    昨晚一回家,表弟就神神秘秘的跟我说,发现一个高颜值网站,非要拉着我研究一下她们的颜值高低。我心想,这还得要我一个个慢慢看,太麻烦了~于是反手用Python给他写了一个人脸识别代码,把她们的照片全部爬下来,自动检测颜值打分排名。这不比手动快多了?准备工作开发环境Py......
  • 人脸识别 注释
    #include<QCoreApplication>#include<opencv2\opencv.hpp>#include<opencv2\dnn.hpp>#include<iostream>#include<map>#include<string>#include<time.h>usingnamespacestd;usingnamespacecv;constsize_tinWidt......