V831

文章目录

  • V831
  • 前言
  • 一、读取模型文件
  • 二、识别人脸
    • 1.找人脸
    • 2.添加人脸
    • 3.识别人脸
  • 三、代码实现
  • 总结

人脸开锁

前言

前面做了关于人脸识别的项目,后续会发出来,下午顺便做了一个人脸识别开锁,通过录入人脸,然后进行识别,识别到正确的人脸进行开锁,错误人脸不开锁。不会驱动舵机的去看上一篇博客,这一篇博客只有人脸识别。

一、读取模型文件

class Face_recognize :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 = []                                      #初始化用户列表threshold = 0.5                                         #人脸阈值nms = 0.3                                               max_face_num = 3                                        #输出的画面中的人脸的最大个数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"}def __init__(self):from maix import nn, camera, image, displayfrom maix.nn.app.face import FaceRecognizefor i in range(len(self.steps)):self.channel_num += self.input_size[1] / self.steps[i] * (self.input_size[0] / self.steps[i]) * 2self.channel_num = int(self.channel_num)     #统计通道数量self.options = {                             #准备人脸输出参数"model_type":  "awnn","inputs": {"input0": self.input_size},"outputs": {"output0": (1, 4, self.channel_num) ,"431": (1, 2, self.channel_num) ,"output2": (1, 10, self.channel_num) },"mean": [127.5, 127.5, 127.5],"norm": [0.0078125, 0.0078125, 0.0078125],}self.options_fe = {                             #准备特征提取参数"model_type":  "awnn","inputs": {"inputs_blob": self.input_size_fe},"outputs": {"FC_blob": (1, 1, self.feature_len)},"mean": [127.5, 127.5, 127.5],"norm": [0.0078125, 0.0078125, 0.0078125],}print("-- load model:", self.model)self.m = nn.load(self.model, opt=self.options)print("-- load ok")print("-- load model:", self.model_fe)self.m_fe = nn.load(self.model_fe, opt=self.options_fe)print("-- load ok")self.face_recognizer = FaceRecognize(self.m, self.m_fe, self.feature_len, self.input_size, self.threshold, self.nms, self.max_face_num)def map_face(self, 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,pointsdef recognize(self, feature):                                                                   #进行人脸匹配def _compare(user):                                                         #定义映射函数return self.face_recognizer.compare(user, feature)                      #推测匹配分数 score相关分数face_score_l = list(map(_compare,self.users))                               #映射特征数据在记录中的比对分数return max(enumerate(face_score_l), key=lambda x: x[-1])                #提取出人脸分数最大值和最大值所在的位置def __del__(self):del self.face_recognizerdel self.m_fedel self.mglobal face_recognizer
face_recognizer = Face_recognize()

二、识别人脸

1.找人脸

from maix import camera, image, display
while True: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:disp_str = "Unmarked face"bg_color = (255, 0, 0)font_color=(255, 255, 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)

2.添加人脸

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)

3.识别人脸

from maix import camera, image, display
while True: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):                             #判断是否记录人脸maxIndex = face_recognizer.recognize(feature)if maxIndex[1] > face_recognizer.score_threshold:                                      #判断人脸识别阈值,当分数大于阈值时认为是同一张脸,当分数小于阈值时认为是相似脸disp_str = "{}".format(face_recognizer.names[maxIndex[0]])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)  else:disp_str = "error face"bg_color = (255, 0, 0)font_color=(255, 255, 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)  else:                                           #没有记录脸                disp_str = "error face"bg_color = (255, 0, 0)font_color=(255, 255, 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)

三、代码实现

通过右键录入人脸,左键删除人脸。

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
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))users.append(feature)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")if len(users):                             #判断是否记录人脸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. 基于树莓派实现人脸识别开锁

    人脸识别的环境搭建可以看一下https://blog.csdn.net/weixin_48856218/article/details/124407139?spm=1001.2014.3001.550 ...

  2. 200行代码如何实现人脸识别开锁应用?

    多种条件限制之下,如何完成真人实景游戏场景下的人脸识别开锁功能?云加社区邀请到腾讯科技产品经理-高树磊,分享他是如何用200行代码,从系统架构.硬件选型.到系统搭建,一步步地实现此精致小巧的人脸识别开 ...

  3. 小米一键上锁工具_小米新品人脸识别智能锁:3D识别加红外,开门只需看一眼...

    随着智能家居不断深入人心,更智慧更便捷的各种产品充盈着我们的生活:就拿最简单的锁门来说,从早些年的挂锁,到执手锁,再到防盗锁,后来经常有人忘记带钥匙,所以又出现了密码锁和指纹锁. 近日,小米有品又刚刚 ...

  4. 人脸扫描建模_人脸识别智能锁安全吗?

    人脸识别智能锁从诞生之日开始,社会大众对它的讨论就没有停止过,它的安全性如何?和指纹锁相比,哪个更靠谱?这是大家关注最多的两个问题.今天来系统分析一下人脸识别智能锁的优缺点和发展方向! 人脸识别技术已 ...

  5. servu用户信息如何导出_购买1条人脸信息只需5毛钱!人脸识别智能锁如何坚守用户信息安全高地?...

    近日,网上出现了一个与用户安全息息相关的事件.据新华视点记者调查发现,一些网络黑产从业者利用电商平台,批量倒卖非法获取的人脸等身份信息和"照片活化"网络工具及教程.一位卖家通过微信 ...

  6. 人脸识别智能锁的发展选择

    科技发展和时代进步带来了新商机,智能家居作为热度非常高的科技产品走入大众视野.而人脸识别智能锁作为智能家居的第一入口,承担起家居防护的重要职责.人脸识别智能锁需求量正在不断地增长,其市场发展空间也进入 ...

  7. 刷脸时代真的来了?R5人脸识别智能锁告诉你

    自人工智能.生物识别等新技术有了创新性的突破后,人脸识别技术也在迅速发展,并逐渐渗透到我们的工作与生活中."刷脸"一词出现在大众的视野,现在,可以刷脸开手机.刷脸支付,甚至刷脸开门 ...

  8. 人脸识别智能锁OTP语音芯片选型指南

    人脸识别智能锁是基于人脸识别技术制造的人脸识别技术是基于人的脸部特征,对输入的人脸图像或者视频流进行识别处理.与指纹识别相比,人脸识别锁的主要优点是人脸识别锁可以在不与用户接触的情况下主动获取用户信息 ...

  9. 人脸识别智能锁的未来发展及其安全问题处理

    受疫情影响,2020年后我国智能锁销量为1640万把,同比增长17%.这得益于产品的多样化.消费者接受度变高等因素影响 智能门锁市场的发展得益于通信和生物识别技术 智能门锁市场的发展离不开通信技术和生 ...

最新文章

  1. 数据中心内虚拟机迁移带来的网络技术难题
  2. 【深度学习入门到精通系列】对抗样本和对抗网络
  3. linux开发板蓝牙连接,开发板蓝牙通信问题,有这方面经验的请进
  4. 报错,o.h.engine.jdbc.spi.SqlExceptionHelper : Data truncation: Data too long for column ‘verify_msg‘
  5. linux 自动登录
  6. CAP以及分区容错性的含义
  7. DWM1000 定位操作流程--[蓝点无限]
  8. 别死写代码,这 25 条比涨工资都重要
  9. Golang 1.16 新特性-embed 包及其使用
  10. 【阿里Java技术进阶】官方钉群直播大全(持续更新)...
  11. Kibana:更有效地构建 Kibana 仪表板 - 7.12 发布
  12. 房子装修选择自装,物业办装修手续,需要哪些资料?
  13. Unity手游性能测评报告——MOBA篇
  14. “蔗里最甜”开展新型婚育文化宣传活动
  15. 手机串号和SIM卡串号
  16. Java学习笔记系列-入门篇-计算机基础
  17. 饥荒联机版MOD-杀生丸介绍
  18. 什么是绝对、相对定位
  19. web切图怎么做_ps如何切图?
  20. 引入css样式属于链接式的是,(5)css样式导入

热门文章

  1. 时势造英雄—读《浪潮之巅》有感
  2. 微软对联服务器关闭了吗,【第2编辑室】不知道你有没有玩过“微软对联”,现在他们又推出了“微软绝句”...
  3. 【报告分享】2020美好城市指数:短视频与城市繁荣关系白皮书(附下载)
  4. python画五星红旗
  5. 熵权法(客观赋权法)
  6. javadoc: 错误 - 非法的程序包名称: “UTF-8“ | javadoc: 警告 - 没有程序包encoding的源文件 | javadoc: 错误 - 不支持编码: utf8-charse
  7. 基金持仓数据分析,满仓干还是等风来?
  8. 使用Win32DiskImager写入U盘容量变小,提示格式化。恢复U盘原本容量方法
  9. 川大计算机学院夏之畅,菌菌帮推|后生可畏II-01:多才多艺小门神——廖乘枫
  10. Css选择器(上) 让样式无孔不入