【k210应用实例】检测口罩是否佩戴并控制舵机的运行

【k210应用实例】检测口罩是否佩戴并控制舵机的运行


文章目录

  • 【k210应用实例】检测口罩是否佩戴并控制舵机的运行
  • 一、需求分析
  • 二、开发板选型
  • 三、口罩检测
  • 四、控制舵机
  • 五、实验程序及效果


一、需求分析

需求:使用K210开发板,检测口罩是否佩戴并控制舵机的运行。
任务分解:

  1. 口罩检测
  2. 控制舵机

二、开发板选型

这里选用Maix Bit(K210),引脚资源如下图所示:

图片源自sipeed官网,开发板详情请见:https://wiki.sipeed.com/soft/maixpy/zh/develop_kit_board/maix_bit.html

三、口罩检测

进入maixhub官网

视觉模型中找到Mask_detect,点击下载
【k210应用实例】检测口罩是否佩戴并控制舵机的运行_第1张图片
接下来,需要输入32位的机器码,关于如何查看开发板的机器码,这篇文章已经讲得很清楚了:获取MaixPy系列开发板机器码——MaixHub 机器码获取,我就不重复造轮子了。
【k210应用实例】检测口罩是否佩戴并控制舵机的运行_第2张图片
最后获取的机器码大概是这样的:
【k210应用实例】检测口罩是否佩戴并控制舵机的运行_第3张图片
将上面得到的32位机器码输入即可下载模型文件。
接下来,便是模型在K210开发板上的部署了,参见口罩模型对应的部署教程:https://www.maixhub.com/modelInfo?modelId=12
对于部署的细节如下:
在这里插入图片描述
这两个kmodelv4 支持固件,其中第一个是支持IDE的,第二个是不支持IDE的。如果想要不借助PC端显示的话,建议烧录第二个固件。

这里有个坑,如果按照教程来,下载上图两个固件,部署完模型后,上电k210不能自动运行boot.py脚本,神奇的是,点击maixpy IDE中的连接后,boot.py又开始运行了,且IDE无法连上开发板。捣鼓良久,把固件换成下面这个,方可实现上电自动运行。
在这里插入图片描述
magic!归结下来是固件版本的问题

简单运行了下载模型时附带py脚本,效果还不错。但是如果环境光线较暗,效果可能不太理想。

四、控制舵机

关于舵机的控制可以参见我之前的博文:【K210+micropython】PWM信号控制舵机


五、实验程序及效果

总程序如下:

import sensor, image, lcd, time
from machine import Timer,PWM
import KPU as kpu

color_R = (255, 0, 0)
color_G = (0, 255, 0)
color_B = (0, 0, 255)


class_IDs = ['no_mask', 'mask']


def drawConfidenceText(image, rol, classid, value):
    text = ""
    _confidence = int(value * 100)

    if classid == 1:
        text = 'mask: ' + str(_confidence) + '%'
        color_text=color_G
    else:
        text = 'no_mask: ' + str(_confidence) + '%'
        color_text=color_R
    image.draw_string(rol[0], rol[1], text, color=color_text, scale=2.5)

def Servo(servo,angle):
    S1.duty((angle+90)/180*10+2.5)


#PWM通过定时器配置,接到IO17引脚
tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)
S1 = PWM(tim, freq=50, duty=0, pin=17)
#舵机初始化-0度
Servo(S1,0)
time.sleep(1)

lcd.init(freq=15000000)
lcd.rotation(2)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
# sensor.set_hmirror(0)


task = kpu.load(0x300000)
# task = kpu.load("/sd/mask.smodel")


anchor = (0.1606, 0.3562, 0.4712, 0.9568, 0.9877, 1.9108, 1.8761, 3.5310, 3.4423, 5.6823)
_ = kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)
img_lcd = image.Image()

clock = time.clock()
while (True):
    clock.tick()
    img = sensor.snapshot()
    code = kpu.run_yolo2(task, img)
    if code:
        totalRes = len(code)

        for item in code:
            confidence = float(item.value())
            itemROL = item.rect()
            classID = int(item.classid())

            if confidence < 0.52:
                _ = img.draw_rectangle(itemROL, color=color_B, tickness=5)
                continue

            if classID == 1 and confidence > 0.65:
                _ = img.draw_rectangle(itemROL, color_G, tickness=5)
                if totalRes == 1:# mask
                    drawConfidenceText(img, (0, 0), 1, confidence)
                    #70度
                    Servo(S1,70)

            else:
                _ = img.draw_rectangle(itemROL, color=color_R, tickness=5)
                if totalRes == 1:# no_mask
                    drawConfidenceText(img, (0, 0), 0, confidence)
                    #0度
                    Servo(S1,0)

    _ = lcd.display(img)

    print(clock.fps())

_ = kpu.deinit(task)

程序运行现象:程序开始,舵机初始化到零度。当摄像头拍到戴口罩的人时,旋转70度;当拍到未带口罩的人时,返回零度。

你可能感兴趣的:(python,嵌入式硬件)