V831

文章目录

  • V831
  • 前言
  • 一、踩坑日记
  • 二、实现步骤
    • 1.人脸添加
    • 2.开发日记
  • 总结

人脸匹配

前言

前面提到过,那个人脸识别虽然可以保存,然后进行匹配,但是每次复位之后我需要重新指定人脸,致力于产品落地的原则,这样肯定是不行的,我必须做到手动加载人脸然后对保存的人脸进行识别。
你需要了解以下几个函数:
pickle序列化函数
append添加函数
maxIndex求最大值函数
你还需要人脸识别的一些知识

一、踩坑日记

还是先记录自己的踩坑日记,那套代码其实有些地方我原来也有不懂得地方,为了实现这个功能,我把不懂得函数一个一个查,序列化函数就看了一个中午,我原本在想是不是因为我反序列化的时候出来问题,并不是,中间我还想用列表解决这个问题

通过测列表的长度来解决数据读取不成功的问题,这是一张人脸的数据,这并不是最准确的数据,这是一张人脸的一些特征点,使用列表程序会一下爆掉。奇怪的现象就是读取一直不成功,反正是经历了很多,不过我也学了很多东西,完完全全把这套人脸识别的代码全都弄懂了。

二、实现步骤

1.人脸添加

from maix import camera, image, display
face_flage = 1
while face_flage:img = camera.capture()                       #获取224*224*3的图像数据AI_img = img.copy().resize(224, 224)faces = face_recognizer.face_recognizer.get_faces(AI_img.tobytes(),False)           #提取人脸特征信息if faces:for prob, box, landmarks, feature in faces:if len(face_recognizer.users) < len(face_recognizer.names):face_recognizer.users.append(feature)face_flage = 0else:print("user full")disp_str = "add face"bg_color = (0, 255, 0)font_color=(0, 0, 255)box,points = face_recognizer.map_face(box,landmarks)font_wh = img.get_string_size(disp_str)for p in points:img.draw_rectangle(p[0] - 1, p[1] -1, p[0] + 1, p[1] + 1, color=bg_color)img.draw_rectangle(box[0], box[1], box[0] + box[2], box[1] + box[3], color=bg_color, thickness=2)img.draw_rectangle(box[0], box[1] - font_wh[1], box[0] + font_wh[0], box[1], color=bg_color, thickness = -1)img.draw_string(box[0], box[1] - font_wh[1], disp_str, color=font_color)display.show(img)

这个spieed教程有,就不介绍了

2.开发日记

昨天我就已经将人脸识别出来了,就是做不到脱机保存数据,官网给了4行代码,就是一直报错,在我确定序列化函数没问题的时候,我开始啃代码,代码啃透了,我发现这些数据很多,不能直接使用load进行读取,就是这一行报的错误,但是我读取又可以打印,我就叠叠不休一直读取(好蠢)被自己蠢哭,几度崩溃,就是问谁谁不知道,只能靠自己。然后我进行了各种各样的手段,我发现代码的含义是,按下按键将人脸的特征值添加到列表里,作为一个对象去添加,我虽然打印了,但是运行的时候会爆掉,于是我这次不打印,我直接把读取的数据用append函数作为对象加到列表里,然后我去读取这段数据进行匹配。功夫不负有心人,他可以了,成功做到匹配。
直接附上源码:

from maix import nn, camera, image, display
from maix.nn.app.face import FaceRecognize
import time
from evdev import InputDevice
from select import select
import pickle
from maix import pwm
import time
import os
pwm6 = pwm.PWM(6)  #选择通道 这里接PH6
pwm6.export()  #设置出口
pwm6.period = 20000000  # 表示 pwm 的周期,单位 ns
pwm6.duty_cycle = 10000000  # 表示占空比,单位 ns
pwm6.enable = True        # 表示是否使能 pwm
score_threshold = 70                            #识别分数阈值
input_size = (224, 224, 3)                      #输入图片尺寸
input_size_fe = (128, 128, 3)                   #输入人脸数据
feature_len = 256                               #人脸数据宽度
steps = [8, 16, 32]                             #
channel_num = 0                                 #通道数量
users = []                                      #初始化用户列表
names = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]  #人脸标签定义
model = {"param": "/home/model/face_recognize/model_int8.param","bin": "/home/model/face_recognize/model_int8.bin"
}
model_fe = {"param": "/home/model/face_recognize/fe_res18_117.param","bin": "/home/model/face_recognize/fe_res18_117.bin"
}for i in range(len(steps)):channel_num += input_size[1] / steps[i] * (input_size[0] / steps[i]) * 2
channel_num = int(channel_num)     #统计通道数量
options = {                             #准备人脸输出参数"model_type":  "awnn","inputs": {"input0": input_size},"outputs": {"output0": (1, 4, channel_num) ,"431": (1, 2, channel_num) ,"output2": (1, 10, channel_num)},"mean": [127.5, 127.5, 127.5],"norm": [0.0078125, 0.0078125, 0.0078125],
}
options_fe = {                             #准备特征提取参数"model_type":  "awnn","inputs": {"inputs_blob": input_size_fe},"outputs": {"FC_blob": (1, 1, feature_len)},"mean": [127.5, 127.5, 127.5],"norm": [0.0078125, 0.0078125, 0.0078125],
}
keys = InputDevice('/dev/input/event0')threshold = 0.5                                         #人脸阈值
nms = 0.3
max_face_num = 1                                        #输出的画面中的人脸的最大个数
print("-- load model:", model)
m = nn.load(model, opt=options)
print("-- load ok")
print("-- load model:", model_fe)
m_fe = nn.load(model_fe, opt=options_fe)
print("-- load ok")
face_recognizer = FaceRecognize(m, m_fe, feature_len, input_size, threshold, nms, max_face_num)def get_key():                                      #按键检测函数r,w,x = select([keys], [], [],0)if r:for event in keys.read():if event.value == 1 and event.code == 0x02:     # 右键return 1elif event.value == 1 and event.code == 0x03:   # 左键return 2elif event.value == 2 and event.code == 0x03:   # 左键连按return 3return 0def map_face(box,points):                           #将224*224空间的位置转换到240*240空间内def tran(x):return int(x/224*240)box = list(map(tran, box))def tran_p(p):return list(map(tran, p))points = list(map(tran_p, points))return box,points
def darw_info(draw, box, points, disp_str, bg_color=(255, 0, 0), font_color=(255, 255, 255)):    #画框函数box,points = map_face(box,points)font_wh = draw.get_string_size(disp_str)for p in points:draw.draw_rectangle(p[0] - 1, p[1] -1, p[0] + 1, p[1] + 1, color=bg_color)draw.draw_rectangle(box[0], box[1], box[0] + box[2], box[1] + box[3], color=bg_color, thickness=2)draw.draw_rectangle(box[0], box[1] - font_wh[1], box[0] + font_wh[0], box[1], color=bg_color, thickness = -1)draw.draw_string(box[0], box[1] - font_wh[1], disp_str, color=font_color)
def recognize(feature):                                                                   #进行人脸匹配def _compare(user):                                                         #定义映射函数return face_recognizer.compare(user, feature)                      #推测匹配分数 score相关分数face_score_l = list(map(_compare,users))                               #映射特征数据在记录中的比对分数return max(enumerate(face_score_l), key=lambda x: x[-1])                #提取出人脸分数最大值和最大值所在的位置def run():img = camera.capture()                       #获取224*224*3的图像数据AI_img = img.copy().resize(224, 224)if not img:time.sleep(0.02)returnfaces = face_recognizer.get_faces(AI_img.tobytes(),False)           #提取人脸特征信息if faces:for prob, box, landmarks, feature in faces:key_val = get_key()if key_val == 1:                                # 右键添加人脸记录if len(users) < len(names):print("add user:", len(users))with open("/root/face_data.pickle",'wb') as f:pickle.dump(feature, f)else:print("user full")elif key_val == 2:                              # 左键删除人脸记录if len(users) > 0:print("remove user:", names[len(users) - 1])users.pop()else:print("user empty")maxIndex = recognize(feature)if maxIndex[1] > score_threshold:                                      #判断人脸识别阈值,当分数大于阈值时认为是同一张脸,当分数小于阈值时认为是相似脸pwm6.duty_cycle = 15000000darw_info(img, box, landmarks, "{}:{:.2f}".format(names[maxIndex[0]], maxIndex[1]), font_color=(0, 0, 255, 255), bg_color=(0, 255, 0, 255))print("user: {}, score: {:.2f}".format(names[maxIndex[0]], maxIndex[1]))else:pwm6.duty_cycle = 10000000darw_info(img, box, landmarks, "{}:{:.2f}".format(names[maxIndex[0]], maxIndex[1]), font_color=(255, 255, 255, 255), bg_color=(255, 0, 0, 255))print("maybe user: {}, score: {:.2f}".format(names[maxIndex[0]], maxIndex[1]))else:                                           #没有记录脸darw_info(img, box, landmarks, "error face", font_color=(255, 255, 255, 255), bg_color=(255, 0, 0, 255))display.show(img)if __name__ == "__main__":import signaldef handle_signal_z(signum,frame):print("APP OVER")exit(0)signal.signal(signal.SIGINT,handle_signal_z)while True:run()

总结

虽然弄好这个用了挺久的,但是也算是学到了很多的东西,最后也是把整套代码全都搞明白了。
进一寸有一寸的欢喜嘛

V831——识别指定的人脸相关推荐

  1. CV:基于face库利用cv2调用摄像头(或视频)根据人脸图片实现找人(先指定要识别已知人脸的文件夹转为numpy_array+输入新图片遍历已有numpy_array)

    CV:基于face库利用cv2调用摄像头(或视频)根据人脸图片实现找人(先指定要识别已知人脸的文件夹转为numpy_array+输入新图片遍历已有numpy_array) 目录 输出结果 设计思路 核 ...

  2. opencv实时识别指定物体

    一. 引入 opencv人脸识别大家应该都听说过,本篇目的是利用opencv从视频帧中识别指定的物体,并框出来,且可以保存截取到的物体图片,会将整个流程都讲一下,包括训练自己的分类器,使用训练好的分类 ...

  3. 人脸识别系统——Dlib人脸识别

    EduCoder平台:人脸识别系统--Dlib人脸识别 第1关:dlib人脸检测的基本原理 编程要求: 请在右侧编辑器中的BEGIN-END之间编写代码,使用Dlib识别人脸并输出识别结果: 计算已知 ...

  4. 人脸识别系统——Dlib人脸检测

    EduCoder平台:人脸识别系统--Dlib人脸检测 第1关:HOG特征描述方法 编程要求: 请在右侧编辑器中的BEGIN-END之间编写代码,完成如下要求: 声明OpenCV中的HOG特征描述方法 ...

  5. 10 OPENVINO 中级课程2 如何识别更多的人脸

    如何识别更多的人脸 1 说明 2 实验目的 3任务内容 4实验原理 1.读取模型 2.指定网络在CPU上运行 3.图像读入"frame"变量 4.对图像进行推理准备. 5.运行推理 ...

  6. Python | 人脸识别系统(人脸识别、活体检测、背景模糊、关键点检测)

    本博客为人脸识别系统项目简介 项目GitHub完整源代码地址:Su-Face-Recognition: A face recognition for user logining 一.运行环境 本系统能 ...

  7. python实现人脸识别抓取人脸并做成熊猫头表情包(2)之优化

    上次做完python实现人脸识别抓取人脸并做成熊猫头表情包之后就放了一下,因为还要好好学习Springboot毕竟这才是找工作的硬实力.但是优化这个代码心里面一直很想,借用<clean code ...

  8. 【人脸识别】初识人脸识别

    [人脸识别]初识人脸识别 /* Author:    cyh_24                                    */ /* Date:        2014.10.2    ...

  9. ML之SVM:调用(sklearn的lfw_people函数在线下载55个外国人图片文件夹数据集)来精确实现人脸识别并提取人脸特征向量

    ML之SVM:调用(sklearn的lfw_people函数在线下载55个外国人图片文件夹数据集)来精确实现人脸识别并提取人脸特征向量 目录 输出结果 代码设计 输出结果 代码设计 from __fu ...

  10. opencv 人脸识别_人工智能-OpenCV+Python实现人脸识别(视频人脸检测)

    上期文章我们分享了opencv识别图片中的人脸,OpenCV图片人脸检测,本期我们分享一下如何从视频中检测到人脸 视频人脸检测 OpenCV打开摄像头特别简单,只需要如下一句代码 capture = ...

最新文章

  1. 【BZOJ2245】[SDOI2011]工作安排 拆边费用流
  2. 计算机网络与通信的课程报告,计算机网络与通信课程设计报告.doc
  3. Python中表示自然底数与浮点数精度(等效于MATLAB中eps)
  4. linux信号及其含义
  5. ios visio流程图_微软visio绘图查看器ios版下载|Microsoft Visio Viewer iphone/ipad版下载 v1.17 - 跑跑车苹果网...
  6. 航模入门经典教材:航空模型教材
  7. 8086汇编语言程序设计
  8. 《Redis开发与运维》学习第一章
  9. 神经网络的起源和发展,神经网络的网络结构
  10. 淘宝带你走进——幽灵Crash迷踪案
  11. linux 如何删除gpt分区,Centos 7下如何删除GPT分区
  12. java查看内存信息
  13. 注册表功能大全(转)
  14. 实习生招聘收割阿里、腾讯等大厂Offer后,有些话想和应届生说
  15. 基于JavaWeb的计算机网络在线测评系统(源码+数据库+论文)
  16. 搭建环境,创建vue3+typescript+vuetify项目
  17. 会声会影2022VideoStudio中文旗舰版
  18. 日“隼鸟二号”首次降落“龙宫”取样
  19. 体验篇 - 部署以太坊私有链 (PoA)
  20. 安装VMware tools按钮是灰的

热门文章

  1. 问题 B: Bumped!
  2. 智能厨房监控系统设计
  3. POODLE SSLv3 安全漏洞 (CVE-2014-3566)
  4. java调用百度地图api,展示北京地铁路线
  5. 12306智能刷票,订票
  6. 【Github资源大汇总】 - 王朋
  7. 计算机软件高级职称有啥用,计算机软考高级职称有什么用
  8. Windows下运行Makefile
  9. 【Java】Feil类概述
  10. Get busy living--or get busy dying