开箱:得捷越做越好,现在从购买到收货速度越来越快啦!短短一周就收到货了。
UNITV M12板子非常小巧,正面是使用阳极氧化铝切割出来的外壳,背面是塑料壳。有颗大大的摄像头,摄像头背面,可以插入SD卡。底部有两个接口,一个是Type-C电源数据口,另外一个是2.0mm的4P的GLOVE接口,对应管脚G34、G35,可以做串口或I2C口使用。侧面各有一个按键,按键对应管脚G19、G18。
因为引出的管脚有限,在编程开发时,从Grove接口用杜邦线接了个串口转Usb模块,将G34、G35作为串口使用,输出数据,方便调试。
需求:大楼电机房需要定时巡检。电机房位置比较偏僻,巡检工作内容简单,但是要求巡检到位。为了保证值班人员巡检到位,通过AI摄像头,进行工作质量检查。
设计:通过摄像头进行人脸识别,当识别到人脸,就拍照记录到SD卡上。定期收集SD卡的文件,核验工作情况。
实现:首先附上代码。
import sensor
import image
import lcd
import time
import utime
from machine import UART
import KPU as kpu
from Maix import GPIO
from fpioa_manager import *
fm.register(34,fm.fpioa.UART1_TX)
fm.register(35,fm.fpioa.UART1_RX)
uart_out = UART(UART.UART1, 115200, 8, None, 1, timeout=1000, read_buf_len=4096)
lastsnaptime=""
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
while False:
uart_out.write('TEST\n')
utime.sleep_ms(100)
def getStrTime():
nowtime=time.localtime()
return "{:0>4d}{:0>2d}{:0>2d}{:0>2d}{:0>2d}{:0>2d}".format(nowtime[0],nowtime[1],nowtime[2],nowtime[3],nowtime[4],nowtime[5])
#task = kpu.load(0x300000) # 你需要把模型(face.kfpkg)在闪存地址0x300000
task = kpu.load("/sd/face.kmodel")#将模型放在 SD 卡中。
#模型描参数
anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025)
#初始化 yolo2 网络
a = kpu.init_yolo2(task, 0.8, 0.3, 5, anchor)
while(True):
img = sensor.snapshot()
code = kpu.run_yolo2(task, img)#运行 yolo2 网络
if code:
for i in code:
uart_out.write(getStrTime()+" "+str(i)+"\n")
if lastsnaptime!=getStrTime():
lastsnaptime=getStrTime()
img.save("/sd/img/"+lastsnaptime+".jpg?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzQwCg,t_20")
#sensor.snapshot().save("/sd/img/"+str(time.ticks_ms())+".jpg?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzQwCg,t_20")
a = img.draw_rectangle(i.rect())
a = lcd.display(img)
a = kpu.deinit(task)#反初始化
这里使用了maixpy作为编程工具,使用了官网提供的KPU人脸识别算法。从官网下载人脸识别算法模型文件(既可以保存在flash里,也可以保存在SD卡上)。在代码中使用kpu.load()方法加载模型文件。
#初始化 yolo2 网络
a = kpu.init_yolo2(task, 0.8, 0.3, 5, anchor)
为yolo2网络模型传入初始化参数, 留意第二个参数,是概率阈值, 只有是这个物体的概率大于这个值才会输出结果, 取值范围:[0, 1],我这里取了0.8的阈值,实测基本不会误记录了。当kpu模型检测到人脸时,就将获得到的图片保存到SD卡。最后将代码保持到boot.py就能够上电运行了。
问题:整个项目过程中遇到两个大问题。
问题1:原本计划着搞好人脸检测,再加上人脸识别的。Maixpy的人脸识别也提供了模型,但是模型是加了密的。 密码使用的是机器码。机器码是一机一码的一种加密方式,用于模型文件的加密。如果使用别的机器码去加密或者下载以 smodel 为文件后缀的模型文件,开发板是无法使用该模型文件的。通过官方的说明,下载了key_gen.bin这个固件,烧写后上电应该就能通过串口获得到机器码了。但是UNITV M12这个板子,没有复位键!没有复位键!没有复位键!烧写完固件后,只能通过插拔USB线,复位,但是插上USB线后,电脑要好一会才能认到这个USB串口,读不到机器码!最终放弃了这个思路。
问题2:这个模块的RTC感觉很奇怪,使用 time.localtime()去读取时间,按文档说明,应该读取到的是一个 年、月、日、时、分、秒……的元组。有时能读到正常的时间,有时读取到的数据又是乱的,找不到规律,还不清楚是什么引起的。
所以,这个UNITV M12很适合做一个图像的传感器,配合其它主控一起工作。