hockel 发表于 2021-4-22 19:27:34

【MaixPy 教程】玩转1000种物体分类

## 前言

接触MaixPy 已经快一年了,k210芯片在视觉运算能力上是可圈可点的。经过一年多的发展,接触MaixPy的人也越来越多。本人是做少儿编程的老师,看了(https://wiki.sipeed.com/soft/maixpy/zh/index.html) 里面有些知识点对于一些初学者可能不太友好(有些人可能想看一下K210所实现的效果,奈何卡在了程序运行上面。果断放弃)。本次教程就针对官方教程中的1000物体分类进行详细的说明。

## 准备阶段

- 下载(https://github.com/sipeed/kflash_gui/releases) 刷入软件
!(https://bbs.sipeed.com/storage/attachments/2021/04/22/n8qtILdLBCBf2o0OtDuHNaEYndSVi4xTCp1r0K4k_thumb.jpg "520")
- 下载(https://dl.sipeed.com/shareURL/MAIX/MaixPy/release/master/maixpy_v0.6.2_46_geafab8cfd) 版本固件 * 我这里使用的是maixpy_v0.6.2_46_geafab8cfd_minimum.bin,不支持MiaxPy IDE,要用uPyLoader编辑上传
!(https://bbs.sipeed.com/storage/attachments/2021/04/22/7wY2woMWOveQXDTd5vbyE4E87Wluie4qLNDw4GFo_thumb.jpg "522")
- 下载(https://dl.sipeed.com/fileList/MAIX/MaixPy/model/mobilenet_0x300000.kfpkg)模型文件
- 下载(https://github.com/BetaRavener/uPyLoader/releases)
!(https://bbs.sipeed.com/storage/attachments/2021/04/22/VdIDL4sAeaifr5eLZ7ClZkAKTMMKWt0P1jpho3Sx_thumb.jpg "523")
- 下载(https://github.com/sipeed/MaixPy_scripts/tree/master/machine_vision/mobilenet_1000_class/labels.txt)文件(主要是用来显示识别到物体的名字)

**1、用 `kflash_gui`刷入 maixpy_v0.6.2_46_geafab8cfd_minimum.bin 固件**
!(https://bbs.sipeed.com/storage/attachments/2021/04/22/53cbkIypg5XSrcdrW0RRxerI9zownjkQUrnfPdzB_thumb.jpg "524")

**2、刷入mobilenet_0x300000.kfpkg模型文件**
!(https://bbs.sipeed.com/storage/attachments/2021/04/22/2zW87R7wYNLcafdgEBf1TOfUqsVqbWVs7X5mWo7d_thumb.jpg "525")

**3、用uPyLoader上传程序**

3.1 选择串口并点击 `Connect` 按钮来连接板子

!(https://bbs.sipeed.com/storage/attachments/2021/04/22/4JXzrgyZHEXAfav8hDVRiPqSCGFXOrK5qX4LL4Ul_thumb.jpg "527")

3.2 第一次运行该软件需要初始化, 点击 `File->Init transfer files` 来完成初始化,

!(https://bbs.sipeed.com/storage/attachments/2021/04/22/pGWFLJglb8d16oIgKWOzpcqVXpJkkU2pqR9wIqwS_thumb.jpg "528")

然后它在板子里创建两个文件,分别是 `__upload.py` 和 `__download.py`。

!(https://bbs.sipeed.com/storage/attachments/2021/04/22/b6BJK2tvuirEG2Xui7MDwYjofjpQ3z4MKwJVNaOR_thumb.jpg "529")

3.3 我们将main.py和labels.txt上传到板子上。

!(https://bbs.sipeed.com/storage/attachments/2021/04/22/vy5h0vc08YQTFffwOtayPn7qO2PAMQqyN2RTYqV7_thumb.jpg "530")

!(https://bbs.sipeed.com/storage/attachments/2021/04/22/5ZZcDWdDAbHZ1PCMPs9Q5avbmsq8dBYPwhcIROxV_thumb.jpg "531")

!(https://bbs.sipeed.com/storage/attachments/2021/04/22/yv1r4tZljGqRNSUSqLPPqAqZwfpzL47JOrhMLsiV_thumb.jpg "532")

## 程序设计

因为这个模型有4.2MiB,比较大,所以使用了minimum的固件,同时保证GC使用的内存不要太大,可以通过以下方式设置小一点,把内存留给模型使用

```
from Maix import utils
import machine

utils.gc_heap_size(256*1024)
machine.reset()

```

用uPyLoader对我们的main.py进行修改后保存,执行点击执行(Execute)即可.

!(https://bbs.sipeed.com/storage/attachments/2021/04/22/QzuhQQwlLMeb5rAfYWhTS4dnUDBEUF8NYJYjHdVH_thumb.jpg "534")

第二步:

```
# 导入相关库
import sensor, image, lcd, time
import KPU as kpu
# 液晶屏初始化
lcd.init()
#摄像头初始化
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_windowing((224, 224))
sensor.set_vflip(1)
sensor.set_hmirror(1)
sensor.run(1)
# 开机加载模型的labels
lcd.clear()
lcd.draw_string(100,96,"MobileNet Demo")
lcd.draw_string(100,112,"Loading labels...")
# 这里打开的是flash里的labels.txt,如果我们选择打开sd卡中的文件,路径为:“labels.txt”
f=open('labels.txt','r')
labels=f.readlines()
f.close()
# 加载1000中物体分类模型
task = kpu.load(0x300000)
clock = time.clock()

while(True):
    img = sensor.snapshot()
    clock.tick()
    fmap = kpu.forward(task, img)
    fps=clock.fps()
    # 这里把运行的结果转换成了一个list对象,然后找到了最大值的下标,
    plist=fmap[:]
    pmax=max(plist)
    max_index=plist.index(pmax)
    a = lcd.display(img, oft=(0,0))
    # 通过这个下标我们就知道标签名是什么了(labels)
    lcd.draw_string(0, 0, "%.2f:%s                            "%(pmax, labels.strip()))
    print(fps)
a = kpu.deinit(task)

```

!(https://bbs.sipeed.com/storage/attachments/2021/04/22/LCp7tj91Geqs9U97oQ6eeIlSgLbbUUrP8JAQASSQ_thumb.jpg "535")

## 实验效果:

![](data/attachment/album/202104/22/192543n1jjz1e09esgvs0v.gif)

## 总结

好了,这样子我们就可以轻松搞定1000种物体检测了。由于模型的种类太多:识别的效果没有20种好。上述的模型文件及程序代码我已经放置在附件中,供尝试练习。更多MaixPY教程欢迎浏览个人博客:(http://www.hockel.club/)


宣坝 发表于 2021-9-2 21:43:08

这个帖子真给力,不过我觉得还是很难怎么办
页: [1]
查看完整版本: 【MaixPy 教程】玩转1000种物体分类