【正点原子K210连载】第四十五章 人脸识别实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第四十五章 人脸识别实验

在上一章节中,介绍了利用maix.KPU模块实现了人脸68关键点检测,本章将继续介绍利用maix.KPU模块实现的人脸识别。通过本章的学习,读者将学习到人脸识别应用在CanMV上的实现。
本章分为如下几个小节:
45.1 maix.KPU模块介绍
45.2 硬件设计
45.3 程序设计
45.4 运行验证

45.1 maix.KPU模块介绍
有关maix.KPU模块的介绍,请见第39.1小节《maix.KPU模块介绍》。
45.2 硬件设计
45.2.1 例程功能

  1. 获取摄像头输出的图像,并送入KPU进行人脸检测,接着对检测到的人脸分别进行人脸特征提取,然后将提取到的人脸特征与先前录入的人脸特征进行对比,如果得分高于阈值,则能成功识别人脸,最后将识别结果同原始图像在LCD上进行显示。
  2. 按下KEY0按键可以录入当前人脸的特征。
    45.2.2 硬件资源
    本章实验内容,主要讲解maix.KPU模块的使用,无需关注硬件资源。
    45.2.3 原理图
    本章实验内容,主要讲解maix.KPU模块的使用,无需关注原理图。
    45.3 程序设计
    45.3.1 maix.KPU模块介绍
    有关maix.KPU模块的介绍,请见第45.1小节《maix.KPU模块介绍》。
    45.3.2 程序流程图
    在这里插入图片描述

图45.3.2.1 人脸识别实验流程图
45.3.3 main.py代码
main.py中的脚本代码如下所示:

from board import board_info
from fpioa_manager import fm
from maix import GPIO
import time
import lcd
import sensor
import gc
from maix import KPUfm.register(board_info.KEY0, fm.fpioa.GPIOHS0)
key0 = GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_UP)
save_feature = False
def key_irq_handler(key):global key0global save_featuretime.sleep_ms(20)if key is key0 and key.value() == 0:save_feature = True
key0.irq(key_irq_handler, GPIO.IRQ_FALLING, GPIO.WAKEUP_NOT_SUPPORT, 7)lcd.init()
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_hmirror(False)anchor = (0.1075, 0.126875, 0.126875, 0.175, 0.1465625, 0.2246875, 0.1953125, 0.25375, 0.2440625, 0.351875, 0.341875, 0.4721875, 0.5078125, 0.6696875, 0.8984375, 1.099687, 2.129062, 2.425937)
names = ['face']# 构造并初始化人脸检测KPU对象
face_detecter = KPU()
face_detecter.load_kmodel("/sd/KPU/face_detect_320x240.kmodel")
face_detecter.init_yolo2(anchor, anchor_num=len(anchor) // 2, img_w=320, img_h=240, net_w=320, net_h=240, layer_w=10, layer_h=8, threshold=0.5, nms_value=0.2, classes=len(names))features = []
score_threshold = 80# 构造并初始化人脸特征提取KPU对象
feature_extractor = KPU()
feature_extractor.load_kmodel('/sd/KPU/feature_extraction.kmodel')# 按指定比例扩展矩形框
def extend_box(x, y, w, h, scale):x1 = int(x - scale * w)x2 = int(x + w - 1 + scale * w)y1 = int(y - scale * h)y2 = int(y + h - 1 + scale * h)x1 = x1 if x1 > 0 else 0x2 = x2 if x2 < (320 - 1) else (320 - 1)y1 = y1 if y1 > 0 else 0y2 = y2 if y2 < (240 - 1) else (240 - 1)return x1, y1, x2 - x1 + 1, y2 - y1 + 1while True:img = sensor.snapshot()face_detecter.run_with_output(img)faces = face_detecter.regionlayer_yolo2()for face in faces:# 框出人脸位置x, y, w, h = extend_box(face[0], face[1], face[2], face[3], 0.08)img.draw_rectangle(x, y, w, h, color=(0, 255, 0))# 计算人脸特征并于保存的人脸特征进行比对获取相似度得分scores = []max_score = 0face_img = img.cut(x, y, w, h)resize_img = face_img.resize(64, 64)resize_img.pix_to_ai()feature = feature_extractor.run_with_output(resize_img, get_feature=True)for i in range(len(features)):score = KPU.feature_compare(features[i], feature)scores.append(score)# 计算得分的最大值if len(scores) is not 0:max_score = max(scores)# 根据阈进行人脸识别if max_score > score_threshold:img.draw_rectangle(x, y, w, h, color=(0, 255, 0))img.draw_string(x + 2, y + 2, str(scores.index(max(scores))), color=(0, 255, 0), scale=1.5)# 根据中断按键进行人脸特征录入if save_feature is True:save_feature = Falsefeatures.append(feature)del scoresdel max_scoredel face_imgdel resize_imgdel featurelcd.display(img)gc.collect()

可以看到一开始是先初始化了LCD和摄像头,并分别构造并初始化了用于人脸检测和人脸特征提取的KPU对象。
然后便是在一个循环中不断地获取摄像头输出的图像,首先将图像进行人脸检测,检测图像中存在的人脸,接着对人脸图像进行人脸特征提取,然后将提取到的人脸特征与先前保存的人脸特征进行对比,若对比得到高于指定的阈值,则表示能够识别出人脸,通过在获取到人脸特征后可以根据需要进行人脸特征的录入,最后将以上所有的分析检测结果在图像上进行绘制,然后在LCD上显示图像。
45.4 运行验证
将DNK210开发板连接CanMV IDE,点击CanMV IDE上的“开始(运行脚本)”按钮后,将摄像头对准人脸,让其采集到人脸图像,接着按下KEY0按键来录入人脸的特征,录入多张人脸特征后,可以看到LCD上显示了人脸识别的结果,每张人脸根据其特征比对得分,得到一个ID号,ID号与人脸录入的顺序有关,如下图所示:
在这里插入图片描述

图45.4.1 LCD显示人脸识别实验结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/451343.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3使用element-plus手动更改url后is-active和菜单的focus颜色不同步问题

在实习&#xff0c;给了个需求做个新的ui界面&#xff0c;遇到了一个非常烦人的问题 如下&#xff0c;手动修改url时&#xff0c;is-active和focus颜色不同步 虽然可以直接让el-menu-item:focus为白色能解决这个问题&#xff0c;但是我就是想要有颜色哈哈哈&#xff0c;有些执…

车载实操:一对一实操学习、CANoe实操学习、推荐就业机会、就业技术支持、协助面试辅导

FOTA模块中OTA的知识点&#xff1a;1.测试过程中发现哪几类问题&#xff1f; 可能就是一个单键的ecu&#xff0c;比如升了一个门的ecu&#xff0c;他的升了之后就关不上&#xff0c;还有就是升级组合ecu的时候&#xff0c;c屏上不显示进度条。 2.在做ota测试的过程中&#xff…

【鸡翅Club】项目启动

一、项目背景 这是一个 C端的社区项目&#xff0c;有博客、交流&#xff0c;面试学习&#xff0c;练题等模块。 项目的背景主要是我们想要通过面试题的分类&#xff0c;难度&#xff0c;打标&#xff0c;来评估员工的技术能力。同时在我们公司招聘季的时候&#xff0c;极大的…

前端SSR框架(Next、Nuxt)利用宝塔面板部署

1、部署的本质 SSR服务端渲染的框架部署区别于常规的CSR项目的部署&#xff0c;并不是打包之后访问某个文件就行&#xff0c;而是需要在服务器中运行项目之后访问某个地址&#xff0c;无论是基于Vue的Nuxt.js框架还是基于React的Next.js框架道理都是一样的 因此区别于CSR我们…

Django学习-静态文件

注意&#xff1a;配置项是个元祖&#xff0c;如果只有一项&#xff0c;别忘了在元素后面加逗号 settings: STATICFILES_DIRS (os.path.join(BASE_DIR,static),)urls: path(test_static, views.test_static)views: def test_static(request):return render(request,test_stat…

中科星图(GVE)——过火面积识别(dNBR)和CART方法进行火灾识别

目录 简介 函数 sampleRegions(collection,properties,scale,projection,tileScale,geometries) gve.Classifier.Cart(maxNodes,minLeafPopulation,maxDepth) updateMask(mask) 代码 网址推荐 知识星球 机器学习 简介 过火面积识别&#xff08;dNBR&#xff09;和CART…

Jlink 直接读取单片机数据

1. 驱动版本 因人而异&#xff0c;这里我使用的是 “J-Flash V6.96” 本人驱动链接&#xff1a;夸克网盘 提取码&#xff1a;rgzk 2. 打开软件 3. 创建jlink工程 4. 选择芯片 此处本人使用芯片 “STM32F103VCT6” 5. 连接单片机 连接成功反馈 6. 读取单片机内部数据 …

WordPress监控用户行为回放插件

在数字营销的世界里&#xff0c;了解用户行为是提升用户体验和转化率的关键。nicen-replay 插件&#xff0c;它能够让您轻松回放用户在网站上的每一步操作&#xff0c;从点击到滚动&#xff0c;再到表单填写&#xff0c;每一个细节都清晰可见 nicen-replay&#xff0c;是一款可…

目标检测——Cascade R-CNN算法解读

论文&#xff1a; Cascade R-CNN: Delving into High Quality Object Detection (2017.12.3) 链接&#xff1a;https://arxiv.org/abs/1712.00726 Cascade R-CNN: High Quality Object Detection and Instance Segmentation (2019.6.24) 链接&#xff1a;https://arxiv.org/abs…

Miniconda管理虚拟环境【Python环境配置】

Miniconda管理虚拟环境【Python环境配置】 1. 下载并安装Miniconda2. 管理虚拟环境3. 管理虚拟环境中的包 1. 下载并安装Miniconda 1. 下载 从清华大学开源软件镜像站 | Tsinghua Open Source Mirror 下载Miniconda&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda…

基于YOLO11/v10/v8/v5深度学习的安检X光危险品检测与识别系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

技术分享:A-23OH型树脂在汽车涂装废溶剂回收中的应用

在当今汽车制造业竞争激烈的环境下&#xff0c;提高生产效率、降低成本的同时&#xff0c;满足环保要求已成为各制造商追求的核心目标。水性涂料因其环保、节能等多重优势&#xff0c;在汽车涂装领域的应用日益广泛。然而&#xff0c;随之而来的喷涂废溶剂处理问题也日益凸显。…

面试应该问什么?

在求职者面试的过程中&#xff0c;向面试官提问是一个展现自己积极态度、对职位和公司兴趣以及进一步了解工作环境和职业发展机会的重要环节。以下是一些求职者可以在面试中向面试官提问的问题&#xff0c;这些问题旨在帮助你更全面地了解未来的工作环境、团队文化、以及个人职…

【SSM详细教程】-04-Spring基于注解的组件扫描

精品专题&#xff1a; 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课…

HTML5教程(三)- 常用标签

1 文本标签-h 标题标签&#xff08;head&#xff09;&#xff1a; 自带加粗效果&#xff0c;从h1到h6字体大小逐级递减一个标题独占一行 语法 <h1>一级标题</h1><h2>二级标题</h2><h3>三级标题</h3><h4>四级标题</h4><h5…

CANoe_CDD_FaultMemory_显示<DTC is defined in the database>解决方法

1、显示<DTC is defined in the database> 2、问题原因 a、在Base Variant中的Fault Memory没有数据 b、新建数据&#xff08;参考导入或者新建方法&#xff09; c、复制数据过来 &#xff08;在Fault Memory中Diagnostic Trouble Codes的Avariable中全选复制到此处&am…

FFmpeg的简单使用【Windows】--- 指定视频的时长

目录 功能描述 效果展示 代码实现 前端代码 后端代码 routers 》users.js routers 》 index.js app.js 功能描述 此案例是在上一个案例【FFmpeg的简单使用【Windows】--- 视频混剪添加背景音乐-CSDN博客】的基础上的进一步完善&#xff0c;可以先去看上一个案例然后再…

Java基于SSM微信小程序物流仓库管理系统设计与实现(lw+数据库+讲解等)

选题背景 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

mysql的各种存储引擎

文章目录 前言1. InnoDB特点 2. MyISAM特点innodb与myisam引擎之间的区别 3. MEMORY特点 4. ARCHIVE特点 5. NDBCluster特点 6. FEDERATED特点 7. CSV特点 总结 前言 MySQL 支持多种存储引擎&#xff0c;每种引擎都有其独特的功能和适用场景。存储引擎是指数据库管理系统用来存…

[PHP]__callStatic

第一种&#xff1a;以下代码不会触发__callStatic&#xff0c;也不会报错 test是空方法 <?php class A {public function test(){}public static function __callStatic($method, $args){print_r(aaaaaaaaaaaaaaaaaaaaa);} }A::test();第二种&#xff1a;以下代码不会触发…