【正点原子K210连载】第三十九章 YOLO2人脸检测实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第三十九章 YOLO2人脸检测实验

从本章开始,将通过几个实例介绍Kendryte K210上的KPU,以及CanMV下KPU的使用方法,本章将先介绍YOLO2网络的人脸检测应用在CanMV上的实现。通过本章的学习,读者将学习到YOLO2网络的人脸检测应用在CanMV上的实现。
本章分为如下几个小节:
39.1 maix.KPU模块介绍
39.2 硬件设计
39.3 程序设计
39.4 运行验证

39.1 maix.KPU模块介绍
Kendryte K210片上拥有一个KPU,KPU是通用的神经网络处理器,它可以在低功耗的情况下实现卷据神经网络的计算,实时获取被检测目标的大小、坐标和种类,对人脸或者物体进行检测和分类。
Kendryte K210片上KPU的主要特点如下所示:

  1. 支持计算多层卷积神经网络,每层卷积神经网络的控制参数可单独配置
  2. 支持中断模式,可配置加速器在每层卷积结束后是否产生中断信号
  3. 支持输入图像片上存储,存储容量大小为2M字节,卷积结果可由DMA读出
  4. 支持输入输出通道数目、输入输出图像行高列宽可配置,其中通道数目范围在1~1024之间,输出行高列宽与输入相同,或者是输入处于2或者4且向下取整
  5. 支持两种卷积内核,分别为11和33,卷积步长为1,十种池化方式,包括bypass、步长为1且大小为22的均值、步长为1且大小为22的最大值、步长为2且大小为22的均值、步长为2且大小为22的最大值、步长为2且大小为22的左上值、步长为2且大小为22的右上值、步长为4且大小为44的均值、步长为4且大小为44的最大值、步长为4且大小为4*4的左上值
  6. 支持两种padding方式,分别为任意填充和取最近值
  7. 支持在输入图像行高超过256时,自动对卷积结果进行抽样,仅保留奇数行奇数列结果
  8. 支持卷积参数、批归一化参数、激活参数配置,AI加速器主动读取,读取地址可配置
  9. 支持卷据参数片上存储,存储容量为72K字节,可以边卷积边读取卷据参数,每层网络最多可以读取64次
  10. 支持mobilenet-V1
  11. 实时工作时最大支持神经网络参数大小为5.5MiB到5.9MiB
  12. 非实时工作最大支持网络参数大小为Flash大小扣除软件占用大小
    在CanMV中可以使用CanMV提供的maix.KPU模块操作Kendryte K210上的KPU。maix.KPU模块对图像进行卷积运算,并提供了一些网络的支持,使得开发者能够很方便地在Kendryte K210上使用CanMV实现一些需要卷积神经网络计算的应用。
    maix.KPU模块提供了KPU构造函数,用于创建一个KPU对象,KPU构造函数如下所示:
    class KPU()
    通过KPU构造函数可以创建并初始化一个KPU对象。
    KPU构造函数的使用示例如下所示:
from maix import KPUkpu = KPU()

maix.KPU为KPU对象提供了load_kmodel()方法,用于从文件系统或Flash中加载网络模型,load_kmodel()方法如下所示:
load_kmodel(path, size)
load_kmodel()方法用于为KPU对象从文件系统或Flash中加载网路模型,网络模型加载后会被加载到内存中等待使用。
path指的是网络模型在文件系统中的路径或网络模型在Flash中的起始地址。
size指的是网络模型在Flash中的大小,当使用文件系统的方式加载网络模型时,该参数无效。
load_kmodel()方法的使用示例如下所示:

from maix import KPUkpu = KPU()
kpu.load_kmode("/sd/KPU/face_detect_320x240.kmodel")

maix.KPU模块为KPU对象提供了init_yolo2()方法,用于初始化yolo2网络模型,init_yolo2()方法如下所示:
KPU.init_yolo2(anchor=None, anchor_num=5, img_w=320, img_h=240, net_w=320, net_h=240, layer_w=10, layer_h=8, threshold=0.7, nms_value=0.4, classes=1)
init_yolo2()方法用于初始化yolo2网络模型,同时为yolo2网络传入一些必要的参数,只有在使用YOLO2网络模型时,才需要用到该方法。
anchor指的是锚点参数,锚点参数是网络在训练前就确定下来的一组数据,同一个网络模型的锚点参数是固定的,锚点参数与网络模型绑定。
anchor_num指的是锚点的数量,固定为len(anchor)//2,即锚点参数数据大小的一半。
img_w和img_h指的是输入图像的宽度和高度,这决定了画框的边界,如果输入图像是由一张小尺寸的图像扩充来的,可以将这两个参数设置为原图的宽度和高度。
net_w和net_h指的是模型需要的图像的宽度和高度,这是在网络模型训练前就确定好的,与网络模型绑定。
layer_w和layer_h指的是网络模型的层宽和层高,这是在网络模型训练前就确定号的,与网路模型绑定。
threshold指的是概率阈值,在网络识别到物体后,之后当被识别物体的可信度大于概率阈值,才会输出该结果,取值范围为[0, 1],默认为0.7。
nums_value指的是box_iou门限,为了防止同一个物体被框出多个框,当在同一个物体上框出两个框时,这两个框的交叉区域占两个框总占用面积的比例如果小于这个参数值,就取其中概率最大的一个框,默认为0.4。
classes指的是网络要分辨目标的类数,这是在网络模型训练前就确定好的,与网络模型绑定,默认为1。
init_yolo2()方法的使用示例如下所示:

from maix import KPU
import imageanchor = (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 = KPU()
kpu.load_kmode("/sd/KPU/face_detect_320x240.kmodel")
kpu.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))

maix.KPU模块为KPU对象提供了run_with_output()方法,用于将图像送入KPU进行运算,并获取运算结果,run_with_output()方法如下所示:
KPU.run_with_output(input, getlist, get_feature)
run_with_output()方法用于将图像送入KPU进行运算,并获取运算结果,且能够指定返回结果的数据类型。
input指的是输入的图像,需要是Image对象,因此可以是摄像头的输出图像,或是文件系统中的图像文件。
getlist指的是是否返回浮点数列表,当为True时,返回浮点数列表,默认为False。
get_feature指的是是否返回L2归一化后的浮点特征值(最大允许256),当为True时,返回L2归一化后的浮点特征值,默认为False。
run_with_output()方法的使用示例如下所示:

from maix import KPU
import imageimg = image.Image(size=(320, 240))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 = KPU()
kpu.load_kmode("/sd/KPU/face_detect_320x240.kmodel")
kpu.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))
kpu.run_with_output(input=img, getlist=False, get_feature=False)

maix.KPU模块为KPU对象提供了regionlayer_yolo2()方法,用于进行YOLO2运算,并获取其运算结果,regionlayer_yolo2()方法如下所示:
KPU.regionlayer_yolo2()
regionlayer_yolo2()方法用于进行YOLO2运算,并返回一个二维列表,每个子列表表示识别到的一个物体的信息,包含了物体在输入图像上左上角的X坐标、Y坐标、宽度、高度,以及class的类别序号,以及置信度。
regionlayer_yolo2()方法的使用示例如下所示:

from maix import KPU
import imageimg = image.Image(size=(320, 240))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 = KPU()
kpu.load_kmode("/sd/KPU/face_detect_320x240.kmodel")
kpu.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))
kpu.run_with_output(input=img, getlist=False, get_feature=False)
objs = kpu.regionlayer_yolo2()
for obj in objs:print("Rect: %d, %d, %d, %d" % (obj[0], obj[1], obj[2], obj[3]))print("Class number: %d" % (obj[4]))
print("Prob: %.2f" % (obj[5]))

maix.KPU模块为KPU对象提供了feature_compare()方法,用于进行特征比对,feature_compare()方法如下所示:
KPU.feature_compare(feature_0, feature_1)
feature_compare()方法用于对两组特征进行特征比对,比对两组特征数据并给出相似度得分,得分越高表示两组特征的相似度也就越高。
feature_0和feature_1指的是两组特征数据,浮点列表,最大值为256。
feature_compare()方法会返回两组比较特征的相似度得分值。
feature_compare()方法的使用示例如下所示:

feature = kpu.run_with_output(img, get_feature = True)
score = kpu.feature_compare(record_feature, feature)
print(score)

39.2 硬件设计
39.2.1 例程功能

  1. 获取摄像头输出的图像,并送入KPU进行YOLO2的人脸检测模型运算,后将运算结果和摄像头输出的图像一起显示在LCD上。
    39.2.2 硬件资源
    本章实验内容,主要讲解maix.KPU模块的使用,无需关注硬件资源。
    39.2.3 原理图
    本章实验内容,主要讲解maix.KPU模块的使用,无需关注原理图。
    39.3 程序设计
    39.3.1 maix.KPU模块介绍
    有关maix.KPU模块的介绍,请见第39.1小节《maix.KPU模块介绍》。
    39.3.2 程序流程图
    在这里插入图片描述

图39.3.2.1 YOLO2人脸检测实验流程图
39.3.3 main.py代码
main.py中的脚本代码如下所示:

import lcd
import sensor
import gc
from maix import KPUlcd.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”)

初始化YOLO2网络

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))while True:img = sensor.snapshot()# 进行KPU运算face_detecter.run_with_output(input=img, getlist=False, get_feature=False)# 进行YOLO2运算faces = face_detecter.regionlayer_yolo2()for face in faces:img.draw_rectangle(face[0], face[1], face[2], face[3], color=(0, 255, 0))img.draw_string(face[0] + 2, face[1] + 2, "%.2f" % (face[5]), color=(0, 255, 0))img.draw_string(face[0] + 2, face[1] + 10, names[face[4]], color=(0, 255, 0))lcd.display(img)gc.collect()

可以看到一开始是先初始化了LCD和摄像头。
接着是构造一个KPU对象,并从文件系统中加载YOLO2人脸检测网络需要用到的网络模型,并初始化YOLO2网络。
然后便是在一个循环中不断地获取摄像头输出的图像,并将其送入KPU中进行运算,然后再进行YOLO2网络运算,最后便得到网络识别出人脸在输入图像上的一些信息,将这些信息绘制到图像上后,在LCD上显示图像。
39.4 运行验证
将DNK210开发板连接CanMV IDE,点击CanMV IDE上的“开始(运行脚本)”按钮后,将摄像头对准人脸,让其采集到人脸图像,随后便能在LCD上看到摄像头输出的图像,同时图像中的人脸均被绿色的矩形框框出,并在矩形框内的左上角标出了人脸的置信度,如下图所示:
在这里插入图片描述

图39.4.1 LCD显示YOLO2人脸检测结果

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

数字人直播带货火了,只要有了这个工具,就可以打造数字人,建议新手小白赶紧尝试!

经济下行,普通人应该尽早认清一个事实,没有一技之长,没有核心竞争力,即便是打工皇帝,年入百万也只是浮云。 一定要保证主业的稳定,再探索新的机会,要多从”1-10",而不是反复”…

2024/9/21黑马头条跟学笔记(十)

1)今日内容 1.1)定时计算流程 1.不想用户看到的全是最新的,实时计算最火的推送 2.定时计算热度最高,存redis,推送到推荐页面 1.2)使用schedule 多个服务部署,多次执行 硬编码定时时间在cron…

群晖使用Docker部署WPS Office并实现异地使用浏览器制作办公文档

文章目录 前言1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制作固定公网访问链接 前言 想象一下这个场景:如果遇到周末紧急需要改方案,但团队成员都在各自家中,这个时候如果大家能够轻松访问这个…

海洋大地测量基准与水下导航系列之二国外海底大地测量基准和海底观测网络发展现状(上)

海底大地控制网建设构想最先由美国斯克里普斯海洋研究所(Scripps Institution of Oceanography,SIO)提出,目前仅有少数发达国家具备相应技术条件。美国、日本、俄罗斯和欧盟等发达国家通过布测先进的海底大地控制网,不断完善海洋大地测量基准基础设施&am…

SpringCloud Alibaba五大组件之——Sentinel

SpringCloud Alibaba五大组件之——Sentinel(文末附有完整项目GitHub链接) 前言一、什么是Sentinel二、Sentinel控制台1.下载jar包2.自己打包3.启动控制台4.浏览器访问 三、项目中引入Sentinel1.在api-service模块的pom文件引入依赖:2.applic…

一堆让你眼界大开的实用工具网站——搜嗖工具箱

和图书 https://www.hetushu.com/ 一个好用的免费看小说网站。和图书是一个提供各种热门电子书,书籍,小说免费在线阅读的网站,涵盖网游、玄幻、穿越、科幻、仙侠、都市、武侠、历史、竞技、军事灵异等多个种类的小说。在这个网站看小说最大的感触简单干净&#xff…

C++速通LeetCode中等第15题-搜索二维矩阵II(两种方法)

方法一&#xff1a;二分法按行遍历查找&#xff1a; class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {for (const auto& row: matrix) {auto it lower_bound(row.begin(), row.end(), target);if (it ! row.end()…

【C++掌中宝】在正式学习C++之前,你还应该了解哪些东西?

文章目录 前言1. C发展历史1.1 C版本更新1.2 关于C23的一个小故事 2. C参考文档3. C的重要性3.1 编程语言排行榜3.2 C在工作领域中的应用 4. C学习建议和书籍推荐4.1 C学习难度4.2 C学习建议4.3 学习书籍推荐 5. C第一个程序结语 前言 在正式学习C之前&#xff0c;我觉得应该先…

Linux:make,Makefile

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《Linux&#xff1a;make&#xff0c;Makefile》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 如果本篇文章对你有帮助&#xff0c;还请各位点点赞&…

Java面试篇-AOP专题(什么是AOP、AOP的几个核心概念、AOP的常用场景、使用AOP记录操作日志、Spring中的事务是如何实现的)

文章目录 1. 什么是AOP2. AOP的几个核心概念3. AOP的常用场景4. 使用AOP记录操作日志4.1 准备工作4.1.1 引入Maven依赖4.1.2 UserController.java4.1.3 User.java4.1.4 UserService.java 4.2 具体实现&#xff08;以根据id查询用户信息为例&#xff09;4.2.1 定义切面类&#x…

基于uni-app的计算机类面试宝设计与实现(毕业论文)

目 录 1 前言 1 1.1 研究目的与意义 1 1.2 研究现状 1 1.3 论文结构 2 2 可行性分析 3 2.1 经济可行性 3 2.2 法律可行性 3 2.3 技术可行性 4 2.4 市场可行性 4 2.5 可行性分析结论 4 3 系统需求分析 4 3.1 用户需求分析 4 3.2 系统功能分析 5 3.3 系统性能需求分析 6 4 概要设…

【网络安全 | 靶机搭建】修改镜像源、更新软件源、安装git、更改python版本等

文章目录 0x00、必要准备0x01、修改镜像源0x02、更新软件源并清除缓存0x03、安装git0x04、更改默认Python版本为python30x05、安装增强功能0x06、vmware虚拟机导出iso0x00、必要准备 安装虚拟机时必须保存用户名、密码,用于后续操作,可以截图保存: 以下内容按个人需要进行配…

重生奇迹MU 强化玩法套路多 极品装备由你打造

欢迎来到重生奇迹MU的强化玩法指南&#xff01;想要打造极品装备吗&#xff1f;不可错过这篇文章&#xff0c;我们将为您揭开最多套路的强化技巧和窍门&#xff0c;帮您节省时间和资源&#xff0c;并带来最高效的升级结果。无论您是新手还是老玩家&#xff0c;本文适合所有级别…

AI浪潮新崛起:借助AI+实景/视频直播创新魅力,开启无人自动直播新时代!

AI浪潮新崛起&#xff1a;借助AI实景/视频直播创新魅力&#xff0c;开启无人自动直播新时代&#xff01; 在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;已不再仅仅是科幻电影中的桥段&#xff0c;它正以不可阻挡之势渗透到我们生活的方方面面&#xff…

工业物联网的海量数据如何呈现,可视化设计来助力

工业物联网产生的海量数据需要通过可视化设计来呈现&#xff0c;以帮助用户更好地理解和分析数据。 数据汇总和聚合&#xff1a; 对于大量的数据&#xff0c;可以通过汇总和聚合的方式来减少数据的数量&#xff0c;同时保留关键的信息。例如&#xff0c;将时间序列数据按照小…

Excel 冻结多行多列

背景 版本&#xff1a;office 2021 专业版 无法像下图内某些版本一样&#xff0c;识别选中框选的多行多列。 如下选中后毫无反应&#xff0c;点击【视图】->【冻结窗口】->【冻结窗格】后自动设置为冻结第一列。 操作 如下&#xff0c;要把前两排冻结起来。 选择 C1&a…

2024华为杯研赛D题保姆级教程思路分析+教程

2024年中国研究生数学建模竞赛D题保姆级教程思路分析 D题&#xff1a;大数据驱动的地理综合问题&#xff08;数学分析&#xff0c;统计学&#xff09; 关键词&#xff1a;地理、气候、统计&#xff08;细致到此题&#xff1a;统计指标、统计模型、统计结果解释&#xff09; …

视频压缩篇:适用于 Windows 的 10 款最佳视频压缩器

视频压缩器现在对许多想要减小视频大小的视频编辑者来说非常有名。但是&#xff0c;并非所有可以在网上找到的视频压缩器都能产生最佳输出。因此&#xff0c;我们搜索了可以无损压缩视频的最出色的视频压缩器应用程序。本文列出了您可以在离线、在线和手机上使用的十大最佳视频…

FastAdmin列表用echats渲染,使用表格的templateView实现一个图表渲染的功能

前言 FastAdmin中Bootstrap-table表格参数templateView拥有强大的自定义功能&#xff0c;这里我们使用templateView来实现一个图表渲染的功能。 首先我们itemtpl模板中的数据需要填充为一个JSON数据&#xff0c;包含column和data两列 ,chartdata为我们服务器返回的行中的数据。…

力扣-1035不相交的线(Java详细题解)

题目链接&#xff1a;力扣-1035不相交的线 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 5.如果没有ac打印dp数组 利于debug。 每一…