时间:2024-12-06 15:07
人气:
作者:admin
第四十二章 人脸口罩佩戴检测实验
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模块实现YOLO2的物体检测,本章将继续介绍利用maix.KPU模块实现的人脸口罩佩戴检测。通过本章的学习,读者将学习到人脸口罩佩戴检测应用在CanMV上的实现。
本章分为如下几个小节:
42.1 maix.KPU模块介绍
42.2 硬件设计
42.3 程序设计
42.4 运行验证
42.1 maix.KPU模块介绍
有关maix.KPU模块的介绍,请见第39.1小节《maix.KPU模块介绍》。
42.2 硬件设计
42.2.1 例程功能
42.2.2 硬件资源
本章实验内容,主要讲解maix.KPU模块的使用,无需关注硬件资源。
42.2.3 原理图
本章实验内容,主要讲解maix.KPU模块的使用,无需关注原理图。
42.3 程序设计
42.3.1 maix.KPU模块介绍
有关maix.KPU模块的介绍,请见第42.1小节《maix.KPU模块介绍》。
42.3.2 程序流程图

图42.3.2.1 人脸口罩佩戴检测实验流程图
42.3.3 main.py代码
main.py中的脚本代码如下所示:
import lcd
import sensor
import image
import gc
from maix import KPU
lcd.init()
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_hmirror(False)
resize_img = image.Image(size=(320, 256))
anchor = (0.156250, 0.222548, 0.361328, 0.489583, 0.781250, 0.983133, 1.621094, 1.964286, 3.574219, 3.94000)
names = ['without mask', 'with mask']
# 构造KPU对象
mask_detecter = KPU()
# 加载模型文件
mask_detecter.load_kmodel("/sd/KPU/detect_5.kmodel")
# 初始化YOLO2网络
mask_detecter.init_yolo2(anchor, anchor_num=len(anchor) // 2, img_w=320, img_h=240, net_w=320, net_h=256, layer_w=10,
layer_h=8, threshold=0.7, nms_value=0.4, classes=len(names))
while True:
img= sensor.snapshot()
resize_img.draw_image(img, 0, 0).pix_to_ai()
# 进行KPU运算
mask_detecter.run_with_output(resize_img)
# 进行YOLO2运算
maskes = mask_detecter.regionlayer_yolo2()
for mask in maskes:
img.draw_rectangle(mask[0], mask[1], mask[2], mask[3], color=(0, 255, 0))
img.draw_string(mask[0] + 2, mask[1] + 2, "%.2f" % (mask[5]), color=(0, 255, 0))
img.draw_string(mask[0] + 2, mask[1] + 10, names[mask[4]], color=(0, 255, 0))
lcd.display(img)
gc.collect()
可以看到一开始是先初始化了LCD和摄像头。
接着是构造一个KPU对象,并从文件系统中加载人脸口罩佩戴检测网络需要用到的网络模型,并初始化YOLO2网络。
然后便是在一个循环中不断地获取摄像头输出的图像,由于网络需要的图像尺寸与摄像头直接输出的图像尺寸不一致,因此将其复制到网络需要的图像尺寸的图像上,再并将其送入KPU中进行运算,然后再进行YOLO2网络运算,最后便得到网络检测出人脸口罩佩戴状态在输入图像上的一些信息,将这些信息绘制到图像上后,在LCD上显示图像。
42.4 运行验证
将DNK210开发板连接CanMV IDE,点击CanMV IDE上的“开始(运行脚本)”按钮后,将摄像头分别对准正确佩戴口罩和未正确佩戴口罩的图像,让其采集到图像,随后便能在LCD上看到摄像头输出的图像,同时图像中的人脸均被绿色的矩形框框出,并在矩形框内的左上角标出了人脸口罩的佩戴状态,如下图所示:

图42.4.1 LCD显示正确佩戴口罩结果

图42.4.2 LCD显示未正确佩戴口罩结果