K210学习笔记(九):深入探索KPU人脸识别技术

K210进入到这里总算是要进入这块板子的精髓部分了,超低功耗配备的超强算力,所谓的KPU可以理解成显卡,可以给模型的运算提提速。我们来简单介绍一下KPU部分(来源MicorPython从0到1):

KPU 是 K210 内部一个神经网络处理器, 它可以在低功耗的情况下实现卷积神经网络计算,实时获取被检测目标的大小、 坐标和种类,对人脸或者物体进行检测和分类。 KPU 具备以下几个特点: ➢ 支持主流训练框架按照特定限制规则训练出来的定点化模型 ➢ 对网络层数无直接限制,支持每层卷积神经网络参数单独配置,包括输 入输出通道数目、输入输出行宽列高 ➢ 支持两种卷积内核 1×1 和 3×3 ➢ 支持任意形式的激活函数 ➢ 实时工作时最大支持神经网络参数大小为 5.5MiB 到 5.9MiB ➢ 非实时工作时最大支持网络参数大小为(Flash 容量-软件体积) 目前我们主要在KPU上跑YOLO的框架目标算法。通过封装我们可以不考虑底层的问题,直接运用。下面我们来看一下相关的函数。

如果我们将模型下载进了sd卡中(利用读卡器将模型直接copy进来即可),如果没有sd卡,我们可以把模型烧录到flash中(不得不提着flash真大),但是在这里还是建议大家将模型下载进sd卡中(又不贵不是)。其余KPU相关函数在这里KPU相关函数

下面我们就可以利用KPU加速以及现有的YOLO模型进行人脸检测咯(YOLO的具体的训练生成模型在这里不是我们所考虑的,可以去自学一下相关的部分),下面我们就来实现一下关于人脸检测的相关功能吧,代码如下:

import sensor, image, time,lcd, gc
from maix import KPU
#lcd初始化

lcd.init()
#摄像头初始化
sensor.reset()
sensor.set_pixformat(sensor.RGB565)#设置摄像头显示格式为RGB565
sensor.set_framesize(sensor.QVGA)#设置摄像头分辨率大小为320*240
sensor.set_vflip(1)#设置摄像头后置
sensor.skip_frames(20)#跳过二十帧等摄像头稳定
clock=time.clock()#启动一个定时器计算帧率
od_img=image.Image(size=(320,256))
#构建KPU对象

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模型(提前将kpu模型置于sd卡根目录下)
kpu.load_kmodel("/sd/yolo_face_detect.kmodel")
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()#启动计算帧率
      img=sensor.snapshot()#拍摄照片
      a=od_img.draw_image(img,0,0)
      od_img.pix_to_ai()#将图片改变成AI运算需要的形式即RGB888格式
      #将摄像头采集的图片输送到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(0,0,"%2.1ffps" %(fps),color=(0,60,128),scale=2.0)#显示屏显示FPS
      lcd.display(img)
      gc.collect()#内存回收
kpu.deinit()

在这里其实我是遇到了一些问题的,比如关于函数image.draw_image这个函数,我的理解实际上就是将一个照片copy到新的照片路径中,而image.pix_to_ai()这个函数我确实费了点功夫,最终在spieed关于K210的API文件中找到了关于这个函数的介绍,就是把前面摄像头捕捉到的RGB565格式的彩色图片转成了RGB888格式。这里还有一个要注意的是auchor这个参数,是由训练模型得到的,这个参数里的值是不能进行修改的。(当然不同的模型这个参数是不同的,只是一个模型有一个固定的auchor值)

今天关于K210的KPU的第一次实战内容就进行到这里,后续会更新一些关于这个YOLO模型训练的问题,目前可知的是spieed公司有线上训练平台,但是到比赛的时候肯定是用不上的,本地如何训练的问题等我学会了会分享给大家。今天的分享就到这里吧

物联沃分享整理
物联沃-IOTWORD物联网 » K210学习笔记(九):深入探索KPU人脸识别技术

发表评论