首页 > 其他分享 >《DNK210使用指南 -CanMV版 V1.0》第四十四章 人脸68关键点检测实验

《DNK210使用指南 -CanMV版 V1.0》第四十四章 人脸68关键点检测实验

时间:2024-12-18 16:12:45浏览次数:4  
标签:KPU img maix face V1.0 人脸 68 使用指南

第四十四章 人脸68关键点检测实验

1)实验平台:正点原子DNK210开发板

2)章节摘自【正点原子】DNK210使用指南 - CanMV版 V1.0

3)购买链接:https://detail.tmall.com/item.htm?&id=782801398750

4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子K210技术交流企鹅群:605557868

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

44.1 maix.KPU模块介绍
有关maix.KPU模块的介绍,请见第39.1小节《maix.KPU模块介绍》。

44.2 硬件设计
44.2.1 例程功能

  1. 获取摄像头输出的图像,并送入KPU进行人脸检测,接着对检测到的人脸分别进行人脸68关键点检测,最后将所有的检测结果和原始图像一同在LCD上进行显示。

44.2.2 硬件资源
本章实验内容,主要讲解maix.KPU模块的使用,无需关注硬件资源。

44.2.3 原理图
本章实验内容,主要讲解maix.KPU模块的使用,无需关注原理图。

44.3 程序设计
44.3.1 maix.KPU模块介绍
有关maix.KPU模块的介绍,请见第44.1小节《maix.KPU模块介绍》。

44.3.2 程序流程图

图44.3.2.1 人脸68关键点检测实验流程图

44.3.3 main.py代码
main.py中的脚本代码如下所示:

import lcd
import sensor
import gc
from maix import KPU
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))
# 构造并初始化人脸68关键点检测KPU对象
lm68_kpu = KPU()
lm68_kpu.load_kmodel("/sd/KPU/landmark68.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 0
    x2 = x2 if x2 < (320 - 1) else (320 - 1)
    y1 = y1 if y1 > 0 else 0
    y2 = y2 if y2 < (240 - 1) else (240 - 1)
    return x1, y1, x2 - x1 + 1, y2 - y1 + 1
while 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))
       # 计算人脸68关键点
       face_img = img.cut(x, y, w, h)
       resize_img = face_img.resize(128, 128)
       resize_img.pix_to_ai()
       output = lm68_kpu.run_with_output(resize_img, getlist=True)
       for i in range(len(output) // 2):
           point_x = int(KPU.sigmoid(output[2 * i]) * w + x)
           point_y = int(KPU.sigmoid(output[2 * i + 1]) * h + y)
           img.draw_cross(point_x, point_y, size=5, color=(0, 0, 255))
       del face_img
       del resize_img
    lcd.display(img)
    gc.collect()

可以看到一开始是先初始化了LCD和摄像头,并分别构造并初始化了用于人脸检测和人脸68关键点检测的KPU对象。
然后便是在一个循环中不断地获取摄像头输出的图像,首先将图像进行人脸检测,检测图像中存在的人脸,接着对人脸图像进行68关键点检测,分析出人脸68关键点的位置,最后将以上所有的分析检测结果在图像上进行绘制,然后在LCD上显示图像。

44.4 运行验证
将DNK210开发板连接CanMV IDE,点击CanMV IDE上的“开始(运行脚本)”按钮后,将摄像头对准人脸,让其采集到人脸图像,随后便能在LCD上看到摄像头输出的图像,同时能看到图像上标注了人脸位置和人脸68关键点位置等信息,如下图所示:


图44.4.1 LCD显示人脸68关键点检测实验结果

标签:KPU,img,maix,face,V1.0,人脸,68,使用指南
From: https://www.cnblogs.com/zdyz/p/18602886

相关文章

  • 【蓝桥杯】43688-《Excel地址问题》
    Excel地址问题题目描述Excel单元格的地址表示很有趣,它可以使用字母来表示列号。比如,A表示第1列,B表示第2列,…Z表示第26列,AA表示第27列,AB表示第28列,…BA表示第53列,⋯⋯当然Excel的最大列号是有限度的,所以转换起来并不难。如果我们想把这种......
  • `['520', '888', '168', '66.6'].map(parseInt)`执行结果是多少?
    在JavaScript中,map函数会遍历数组中的每个元素,并对每个元素执行提供的函数,然后返回一个新数组,其中包含每次函数调用的结果。然而,parseInt函数的用法在这里有一些特殊之处,特别是当它与map函数一起使用时。parseInt函数通常有两个参数:要转换的字符串和基数(进制)。在map函数......
  • SUOEN:免费版海外仓系统代理商使用指南
    在跨境电商领域,海外仓系统的代理模式助力业务拓展。其使用步骤如下:1、被代理的海外仓先注册管理端,以此管理仓储、物流与库存等核心业务,构建稳定运营基础。2、随后代理商也注册自己的管理端账号,同样设定代理的仓库信息、物流信息等,并在此维护自己的客户信息。代理商和被代理商......
  • 图形变换使用指南
    鸿蒙Next图形变换使用指南鸿蒙Next为开发者提供了强大的图形变换功能,用于对组件进行旋转、平移、缩放和矩阵变换等操作,极大地丰富了应用的视觉效果和用户体验。以下是其详细使用方法:1.旋转(rotate)功能:使组件在以左上角为坐标原点的坐标系中旋转。参数说明RotateOptions......
  • P6803 [CEOI2020] 星际迷航 题解
    \(\text{P6803[CEOI2020]星际迷航题解}\)观察这个从第\(0\)棵树走向第\(D\)棵树的过程是困难的,我们难以判定走到下一棵树的情况。于是我们不妨从第\(D\)棵树向第\(0\)棵树来倒推。从第\(i\)层走向第\(i+1\)层的边为\(x\toy\)时,事实上此时\(y\)就是第\(i+1\)......
  • [HDU6807] Fake Photo
    思路考虑二分答案,那么对于每个时针分针都会生成一个合法指针区间,我们对时针和分针的限制区间分别取交集如果时针范围大于\(1h\),那么分针显然可以走到任何地方否则分针还会生成一个限制范围,我们再取交集即可实现讲真这比大模拟恶心多了,真不想写,以后拿来练马力......
  • 蜂鸣器 m68kspkr linux 驱动程序
    /*m68kbeeperdriverforLinuxCopyright©2002RichardZidlickyCopyright©2002VojtechPavlikCopyright©1992OrestZborowski*//*Thisprogramisfreesoftware;youcanredistributeitand/ormodifyitunderthetermsoftheGNUGeneralP......
  • ssm城市房屋租赁出售系统5m068程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景随着城市化进程的加速,城市人口流动性增强,房屋租赁与出售市场需求日益旺盛。然而,传统的房屋交易方式存在信息不透明、流程繁琐等问题,影......
  • Easysearch Java SDK 2.0.x 使用指南(一)
    各位Easysearch的小伙伴们,我们前一阵刚把easysearch-client更新到了2.0.2版本!借此详细介绍下新版客户端的使用。新版客户端和1.0版本相比,完全重构,抛弃了旧版客户端的一些历史包袱,从里到外都焕然一新!不管是刚入门的小白还是经验丰富的老司机,2.0.x客户端都能让你开发效率......
  • LeetCode题练习与总结:验证 IP 地址--468
    一、题目描述给定一个字符串 queryIP。如果是有效的IPv4地址,返回 "IPv4" ;如果是有效的IPv6地址,返回 "IPv6" ;如果不是上述类型的IP地址,返回 "Neither" 。有效的IPv4地址 是 “x1.x2.x3.x4” 形式的IP地址。其中 0<=xi <=255 且 xi 不能包含 前导零......