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

news/2024/10/11 11:17:24/

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

在上一章节中,介绍了利用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 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")
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 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))# 计算人脸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_imgdel resize_imglcd.display(img)gc.collect()

可以看到一开始是先初始化了LCD和摄像头,并分别构造并初始化了用于人脸检测和人脸68关键点检测的KPU对象。
然后便是在一个循环中不断地获取摄像头输出的图像,首先将图像进行人脸检测,检测图像中存在的人脸,接着对人脸图像进行68关键点检测,分析出人脸68关键点的位置,最后将以上所有的分析检测结果在图像上进行绘制,然后在LCD上显示图像。
44.4 运行验证
将DNK210开发板连接CanMV IDE,点击CanMV IDE上的“开始(运行脚本)”按钮后,将摄像头对准人脸,让其采集到人脸图像,随后便能在LCD上看到摄像头输出的图像,同时能看到图像上标注了人脸位置和人脸68关键点位置等信息,如下图所示:
在这里插入图片描述

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


http://www.ppmy.cn/news/1537422.html

相关文章

蓝桥杯:求平均年龄

#include<stdio.h> int main() { int num 0; float age 0,sum0; printf("请输入总人数: "); scanf_s("%d" ,& num); for (int i1; i <num;i) { scanf_s("%f", &age); sum age…

Flutter渲染过程

The rendering process is what transforms your widget tree into the actual pixels that are displayed on the screen. It’s like the magic behind the scenes that brings your app’s UI to life! 呈现过程将小部件树转换为显示在屏幕上的实际像素。它就像幕后的魔法&…

数据结构【C语言】[

找工作&#xff1a;笔试面试 笔试&#xff1a;选择题编程题&#xff08;OJ onlin可能现场写一个算法 死磕代码注意多画图和思考 理解了写不出代码就是没有完全理解。 多画图多思考多写代码 好的命名&#xff1a;让人一眼看出是啥&#xff0c;方便维护 做好备注 慢就是快…

react卸载组件通常需要消除哪些副作用

在React中&#xff0c;卸载组件时需要处理的副作用主要与组件的生命周期和可能引发的性能问题有关。以下是一些常见的副作用及其处理方式&#xff1a; 1. 事件监听器 问题&#xff1a;如果组件注册了事件监听器&#xff08;如或的事件&#xff09;&#xff0c;在组件卸载时这…

查询数据库绘制历史曲线

<?php include ("jpgraph/jpgraph.php"); include ("jpgraph/jpgraph_line.php"); // // 假定数据库用户名&#xff1a;root&#xff0c;密码&#xff1a;123456&#xff0c;数据库&#xff1a;RUNOOB $conmysqli_connect("localhost",&qu…

MyBatis XML映射文件

XML映射文件 XML映射文件的名称与Mapper接口名称一致&#xff0c;并且将XML映射文件和Mapper接口放置在相同包下&#xff08;同包同名&#xff09;XML映射文件的namespace属性为Mapper接口全限定名一致XML映射文件中SQL语句的id与Mapper接口中的方法名一致&#xff0c;并保持返…

Mycat引领MySQL分布式部署新纪元:性能与扩展性的双重飞跃

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#…

微服务发展历程

服务架构演进 服务架构演进过程&#xff1a;抽取各个模块独立维护&#xff0c;独立部署的过程。 初创公司2 ~ 3个研发人员&#xff0c;ALL IN ONE 的框架开发效率最高。随着队伍的壮大&#xff0c;产品&#xff0c;用户&#xff0c;商品成立独立小组&#xff0c;拆出相应的模块…