【k210应用实例】检测口罩是否佩戴并控制舵机的运行
一、需求分析
需求:使用K210开发板,检测口罩是否佩戴并控制舵机的运行。 任务分解:
- 口罩检测
- 控制舵机
二、开发板选型
这里选用Maix Bit(K210),引脚资源如下图所示:
图片源自sipeed官网,开发板详情请见:https://wiki.sipeed.com/soft/maixpy/zh/develop_kit_board/maix_bit.html
三、口罩检测
进入maixhub官网 在视觉 模型中找到Mask_detect ,点击下载 接下来,需要输入32位的机器码,关于如何查看开发板的机器码,这篇文章已经讲得很清楚了:获取MaixPy系列开发板机器码——MaixHub 机器码获取,我就不重复造轮子了。 最后获取的机器码大概是这样的: 将上面得到的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)
tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)
S1 = PWM(tim, freq=50, duty=0, pin=17)
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)
task = kpu.load(0x300000)
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:
drawConfidenceText(img, (0, 0), 1, confidence)
Servo(S1,70)
else:
_ = img.draw_rectangle(itemROL, color=color_R, tickness=5)
if totalRes == 1:
drawConfidenceText(img, (0, 0), 0, confidence)
Servo(S1,0)
_ = lcd.display(img)
print(clock.fps())
_ = kpu.deinit(task)
程序运行现象:程序开始,舵机初始化到零度。当摄像头拍到戴口罩的人时,旋转70度;当拍到未带口罩的人时,返回零度。
|