Canmv K210开发板案例——人脸检测

学习目标:

  • 在Canmv IDE环境下使用K210学习人脸检测功能,将摄像头采集的画面分析比对模型,如果在摄像头区域有人脸则画矩形框出来并且打印相关信息

  • 使用人脸检测模型以及yolo2网络算法,通过通用神经网络处理器KPU来进行人脸检测


学习内容:

1、导入相关库,并初始化摄像头和LCD显示屏

import sensor, image, time, lcd
from maix import KPU #导入Maix类的KPU模块


lcd.init()  # 初始化LCD显示屏
sensor.reset()  # 复位并初始化摄像头
sensor.set_pixformat(sensor.RGB565)  # 设置摄像头输出格式为 RGB565
sensor.set_framesize(sensor.QVGA) # 设置摄像头输出大小为 QVGA (320x240)
sensor.skip_frames(time = 1000) # 等待摄像头稳定
clock = time.clock() # 创建一个clock对象,用来计算帧率

2、初始化KPU相关的参数,加载人脸检测模型以及使用yolo2网络算法,kpu需要加载kmodel文件

od_img = image.Image(size=(320,256)) # 设置图像尺寸 人脸检测模型需要320*256图输入

# 人脸检测锚点;锚点参数与模型参数一致,同一个模型这个参数是固定的(即训练模型时确定了)
anchor = (0.893, 1.463, 0.245, 0.389, 1.55, 2.58, 0.375, 0.594, 3.099, 5.038, 0.057, 0.090, 0.567, 0.904, 0.101, 0.160, 0.159, 0.255)
kpu = KPU() #创建一个KPU类,用于人脸检测

# 从文件系统中加载人脸检测模型(也可以flash地址加载方式),如 "/sd/xxx.kmodel"{(flash_offset, size)(偏移大小,模型大小)}
kpu.load_kmodel("/sd/KPU/yolo_face_detect/yolo_face_detect.kmodel")
# 为yolo2网络模型传入初始化参数, 只有使用yolo2时使用;锚点参数,anchor的锚点数,输入图像的宽,输入图像的高,模型需要的图的宽,模型需要的图的高,模型层宽,模型层高,概率阈值,box_iou门限,要分辨的目标类数量
kpu.init_yolo2(anchor, anchor_num=9, img_w=320, img_h=240, net_w=320, net_h=256, layer_w=10, layer_h=8, threshold=0.7, nms_value=0.3, classes=1)

3、使用while循环将图像传入KPU循环进行计算,使用yolo2神经网络算法解算,最终得到人脸的位置信息,画矩形框将人脸框出来

while True:
    clock.tick() # 更新计算帧率的clock
    img = sensor.snapshot() # 拍照,获取一张图像
    a = od_img.draw_image(img, 0,0) # 将img图像写到od_img图像的坐标(0,0)位置处
    od_img.pix_to_ai()  # 对rgb565的image生成ai运算需要的r8g8b8格式存储
    kpu.run_with_output(od_img) # 对输入图像进行kpu运算
    dect = kpu.regionlayer_yolo2() # yolo2后处理
    fps = clock.fps()  # 获取帧率
    if len(dect) > 0:
        print("dect:",dect)
        for l in dect :
            # 在图像上绘制一个矩形。 传递l[0],l[1],l[2],l[3]
            a = img.draw_rectangle(l[0],l[1],l[2],l[3], color=(0, 255, 0))
    a = img.draw_string(0, 0, "%2.1ffps" %(fps), color=(0, 60, 128), scale=2.0) # 显示屏显示FP
    lcd.display(img)

# 创建的kpu对象去初始化,释放模型内存
kpu.deinit()


实验分析:

Performing Face Detection:

在这里插入图片描述


Serial Terminal Printing:

在这里插入图片描述
等待摄像头稳定,在画面中检测到时,就会画矩形框住人脸,并在串行终端打印出人脸的数据包括:人脸目标框的左上角x,y坐标人脸框的宽w高h类别序号概率值([0, 1])


实验过程与总结:

实验过程:

  • 在Canmv IDE中进行人脸检测实验,首先设置开发环境,导入所需的sensor和kpu等库,初始化摄像头和显示屏。加载人脸检测的kmodel文件到KPU,进入一个循环实时从摄像头获取图像数据,通过KPU运行yolo2算法进行处理,检测到人脸后,立即在LCD上绘制边界框,并输出人脸的坐标信息,实现动态的人脸捕捉与识别功能。需要用到的模型 下载链接

总结:

  • 实验成功在K210板上实现人脸检测,利用yolo2模型实时识别并框显人脸,证明了KPU的神经网络推理能力,并展示了嵌入式设备上执行复杂机器学习任务的潜力。KPU参数调整和模型优化的经验对未来类似平台的深度学习部署具有指导意义。此处检测人脸的阈值:threshold=0.7,如果需要检测人脸更加准确,可以适当调整阈值。

完整代码展示:

# Yolo_face_detect - By: Jack - 周日 4月 21 2024

import sensor, image, time, lcd
from maix import KPU #导入Maix类的KPU模块


lcd.init()  # 初始化LCD显示屏
sensor.reset()  # 复位并初始化摄像头
sensor.set_pixformat(sensor.RGB565)  # 设置摄像头输出格式为 RGB565
sensor.set_framesize(sensor.QVGA) # 设置摄像头输出大小为 QVGA (320x240)
sensor.skip_frames(time = 1000) # 等待摄像头稳定
clock = time.clock() # 创建一个clock对象,用来计算帧率

od_img = image.Image(size=(320,256)) # 设置图像尺寸 人脸检测模型需要320*256图输入

# 人脸检测锚点;锚点参数与模型参数一致,同一个模型这个参数是固定的(即训练模型时确定了)
anchor = (0.893, 1.463, 0.245, 0.389, 1.55, 2.58, 0.375, 0.594, 3.099, 5.038, 0.057, 0.090, 0.567, 0.904, 0.101, 0.160, 0.159, 0.255)
kpu = KPU() #创建一个KPU类,用于人脸检测

# 从文件系统中加载人脸检测模型(也可以flash地址加载方式),如 "/sd/xxx.kmodel"{(flash_offset, size)(偏移大小,模型大小)}
kpu.load_kmodel("/sd/KPU/yolo_face_detect/yolo_face_detect.kmodel")
# 为yolo2网络模型传入初始化参数, 只有使用yolo2时使用;锚点参数,anchor的锚点数,输入图像的宽,输入图像的高,模型需要的图的宽,模型需要的图的高,模型层宽,模型层高,概率阈值,box_iou门限,要分辨的目标类数量
kpu.init_yolo2(anchor, anchor_num=9, img_w=320, img_h=240, net_w=320, net_h=256, layer_w=10, layer_h=8, threshold=0.7, nms_value=0.3, classes=1)

while True:
    clock.tick() # 更新计算帧率的clock
    img = sensor.snapshot() # 拍照,获取一张图像
    a = od_img.draw_image(img, 0,0) # 将img图像写到od_img图像的坐标(0,0)位置处
    od_img.pix_to_ai()  # 对rgb565的image生成ai运算需要的r8g8b8格式存储
    kpu.run_with_output(od_img) # 对输入图像进行kpu运算
    dect = kpu.regionlayer_yolo2() # yolo2后处理
    fps = clock.fps()  # 获取帧率
    if len(dect) > 0:
        print("dect:",dect)
        for l in dect :
            # 在图像上绘制一个矩形。 传递l[0],l[1],l[2],l[3]
            a = img.draw_rectangle(l[0],l[1],l[2],l[3], color=(0, 255, 0))
    a = img.draw_string(0, 0, "%2.1ffps" %(fps), color=(0, 60, 128), scale=2.0) # 显示屏显示FP
    lcd.display(img)

# 创建的kpu对象去初始化,释放模型内存
kpu.deinit()

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
很抱歉,我作为语言模型,无法直接提供您可运行的程序。不过我可以给您一些建议和指导: 1. 人脸检测:可以使用 OpenCV 库,通过 Haar 特征分类器进行人脸检测。在 K210 开发板中,可以使用 MaixPy 或者 Kendryte SDK 进行开发。以下是一个使用 MaixPy 的简单示例代码: ```python import sensor import image import lcd # 初始化摄像头和显示器 sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.set_hmirror(True) sensor.run(1) lcd.init() # 加载 Haar 特征分类器 face_cascade = image.HaarCascade("frontalface", stages=25) while True: # 获取图像 img = sensor.snapshot() # 检测人脸 objects = img.find_features(face_cascade, threshold=0.5, scale_factor=1.5) # 标记人脸并显示图像 for obj in objects: img.draw_rectangle(obj) lcd.display(img) ``` 2. 使用 mlx90614:可以使用 Python 的 smbus 库进行 I2C 通信。以下是一个使用 smbus 库的简单示例代码: ```python import smbus import time # 定义 I2C 地址和寄存器地址 i2c_address = 0x5a register_address = 0x07 # 初始化 I2C 总线 bus = smbus.SMBus(1) while True: # 读取温度值并打印 data = bus.read_i2c_block_data(i2c_address, register_address, 3) temperature = (data[1] << 8) | data[0] temperature = (temperature * 0.02) - 273.15 print("Temperature: {:.2f} C".format(temperature)) # 等待 2 秒 time.sleep(2) ``` 希望这些代码片段能够对您有所帮助。如果您在开发过程中遇到问题,欢迎提出具体的问题,我会尽力帮助您解决。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值