进行到KPU的又一个应用咯,其实跟前一个人脸识别的应用没有太多的不同。物体识别这里可是分类二十个物体,而人脸识别只是一个简单的二分类问题。(理论上机器学习也能做但是效果咋样就不知道了)。
大概的程序思路跟上一个实验也是一致的,将该用的函数库导入之后(time,lcd,sensor,maix.KPU,image,gc)进行对应的初始化,初始化完成后就可以开始代码的编写。主要流程就是拍摄照片,导入模型就行识别,如果识别出存在对应物体,就框起来做标识。流程图如下:
代码如下啦:!!!!
import sensor, image, time,lcd
from maix import KPU
import gc
#初始化部分
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_vflip(1)#设置摄像头后置即所见即所得
sensor.skip_frames(20)#跳过二十帧等待摄像头初始化
clock=time.clock()#初始化定时器用来计算帧率
od_img=image.Image(size=(320,256))
#20种物体的名称
obj_name = ("aeroplane","bicycle", "bird","boat","bottle","bus","car","cat","chair","cow","diningtable", "dog","horse", "motorbike","person","pottedplant", "sheep","sofa", "train", "tvmonitor")
#初始化KPU对象,用来加速模型运行
kpu=KPU()
print("ready lode model")
#加载KPU模型
kpu.load_kmodel("/sd/voc20_detect.kmodel")
anchor = (1.3221, 1.73145, 3.19275, 4.00944, 5.05587, 8.09892, 9.47112, 4.84053, 11.2364, 10.0071)
kpu.init_yolo2(anchor,anchor_num=5,img_w=320,img_h=240,net_w=320,net_h=256,layer_w=10,layer_h=8,threshold=0.5,nms_value=0.2,classes=20)
i=0
while True:
i+=1
print("cnt",i)
clock.tick()
img=sensor.snapshot()#拍摄照片
a=od_img.draw_image(img,0,0)
od_img.pix_to_ai()
#将摄像头采集到的图片输送到KPU和yolo模型中运算
kpu.run_with_output(od_img)
dect=kpu.regionlayer_yolo2()
fps=clock.fps()
if len(dect)>0:#识别到物体
print("dect",dect)
for l in dect:#画矩形框
a=img.draw_rectangle(l[0],l[1],l[2],l[3],color=(0,255,0))
a=img.draw_string(l[0],l[1],obj_name[l[4]],color=(0,128,0),scale=1.5)
a=img.draw_string(0,0,"%2.1ffps"%(fps),color=(0,60,128),scale=1.0)#显示屏显示FPS
lcd.display(img)
gc.collect()#内存回收
kpu.deinit()
在这里有一个问题,就是一定一定一定要把1和L(小写)分开,真的真的太像了,真的真的都是泪啊都是泪,我搜了半小时啊,最后发现是打错了。
后续可能不会继续更新KPU系列了,或者就更新一下例程,然后我要研究一下yolo的本地训练以及模型转换的问题了。后续会更新stm32的学习笔记!!!!电赛!!备赛!!!stm32学习笔记会出现在电赛的备赛日记里!!!!当然电赛的备赛日记里还会出现我做的往年的电赛题(我会学习着做一部分)主要是控制类的,然后备赛日记里还会有K210的部分内容(这部分可能就不是简单的例程啦,我要开始写程序了),有EDA的部分内容(嘉立创的电赛活动太动人了),如果可以的话还会更一部分stc32(国产芯片!)嗯大概就是这样,有问题评论或者私信。K210学习笔记暂时告一段落啦(当然后续可能还是会更部分内容,主要是我真的不太想拿K210去驱动电机舵机啥的)
嵌入式开发/计算机视觉/QT界面设计相关技术指导可私聊加V