K210 识别石头剪刀布 手势

其实我一直不是很看好openmv和k210,镜头垃圾,价格偏高,算力感人,有这个价格上个树莓派简直香爆了,但是还是有很多人尤其是学生在用,群里也是关于模型训练的问题问的最多,所以我硬逼着自己去研究了一下。
开始做了几次,全是惨败,原因主要是固件库前后不匹配,生成的模型乱识别等问题,今天从头捋了一下,记录一下思考的过程,大家可以参考一下。
模型训练过程:
1.找好分类,首先定位必须准狠,我接到的单子是做手势识别,开始采用的是1234的手势,差别小,老板提供了几百张训练图片,效果还是不好,所以改成了石头剪刀布的手势,外观差异更大一些,可以提高识别率;
2.做好训练集图片,这里我偷了个懒,直接去往上找了现成的项目,甩链接,大家有兴趣可以去看看:Rock Paper Scissors Dataset起码图片集有保障了,下载了别人做好的约每个140张的图片,这里注意一下,图片采用了纯白背景,提高识别度,大致如图所示:K210 识别石头剪刀布 手势_第1张图片
3.改格式,改成jpg缩小体积,并将分辨率改成224*224,工具有一堆,我用的WPS图片批量处理,不过要充会员的,其他免费的应该有很多;
4.训练,这里其实我推荐经常做训练的自己搭建一个本地训练环境,虚拟机加ubuntu即可,缺点是不能用GPU加速,不过也足够了,可以参考maixpy官方的教程:搭建本地环境 官方的网站实在是慢,经常排很长的队;
5.训练完了之后就是常规操作了,拷贝模型,运行py,不过我不是很喜欢新版自动生成的那个py文件,感觉简单的做复杂了,而且老板的要求是没有手势的时候不能识别出其他的,所以我加了个准确率>0.6才显示的筛选,这个精简的py大家可以参考下,只需要拷贝m.kmodel和boot.py两个文件即可,上代码:

#by jd3096     vx:jd3096
import sensor, image, lcd, time
import KPU as kpu
import gc, sys

sensor_window=(224, 224)
lcd_rotation=0
sensor_hmirror=False
sensor_vflip=False
model_addr="/sd/m.kmodel"
labels = ["paper", "rock", "scissors"]

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_windowing(sensor_window)
sensor.set_hmirror(sensor_hmirror)
sensor.set_vflip(sensor_vflip)
sensor.run(1)

lcd.init(type=1)
lcd.rotation(lcd_rotation)
lcd.clear(lcd.WHITE)

task = kpu.load(model_addr)

while(True):
    img = sensor.snapshot()
    fmap = kpu.forward(task, img)
    plist=fmap[:]
    pmax=max(plist)
    if pmax>0.6:          #识别率低于0.6的将不会显示
        max_index=plist.index(pmax)
        img.draw_string(0,0, "%.2f : %s" %(pmax, labels[max_index].strip()), scale=2)
    lcd.display(img)


6.上电运行,发现依然乱识别,后来去请教别人,发现可能是光线的问题,拉开窗帘,选择白床单作为背景,终于正常识别了,识别率基本在70%以上。

项目完毕,如果需要这个m.kmodel可联系我,VX:jd3096

你可能感兴趣的:(K210 识别石头剪刀布 手势)