这篇文章写于2021年10月,但是我使用这个开发板是在2020年8月到12月的期间用的,并且这块板子还是比较新的,也是最近一段时间资料才开始逐渐完善的。 当时我用的时候也是三天两头烧写固件,各种bug不断。但是现在也完善很多了,所以我下面依据的资料,尤其是我的示例代码,可能由于更新,一些方法有所变化。要根据需要查看官方的代码库,有很多示例代码。 但是有一点,我写之前也有用了一些时间查看了最新的WIKI文档,有了很多更新,但是思路是一样,毕竟不可能完全重构是吧。所以在看的时候要学会举一反三,万变不离其宗。有问题也还希望大家指正!
我这里不会再对这个板子的基础知识做讲解,已经模型的具体训练方式做过多的讲解,因为官方的文档比我讲的更加清楚,学习之前和操作之中,反复阅读文档,实在遇到解决不了的问题再去询问他人!
这是spieed自己的训练平台,只要是自己做比赛或者测试的少量数据集都可以丢上去训练。 我之前也用过,当时这平台也是三天两头崩溃,当时说是重做网站,那一个月都无法上传训练,后面才找到一个工具在本地训练,后面再细讲。 当时最近看群消息,基本这个网站现在还算是稳定可用了。 用这个就相当于傻瓜式操作,基本只要自己处理好数据集,按照规定的格式,打包上传即可。然后训练完成后的模型就会打包发送到你的邮箱。把里面的模型文件拷贝到SD卡里面就可以使用。同时还包括boot.py和main.py两个文件,一起放进去,最简单的识别程序就完成了。(这是我当时的使用的情况,至于现在,大家可以自行尝试!)
这是最新平台的使用,大家可以自行查看。
maixhub平台使用说明
这个就是当时平台训练发送过来的文件,kmodel是加密的模型文件,h5,tflite也是不同格式的模型文件。anchors.txt是锚点文件,主要是进行图像检测的时候用,class.txt,就是图像的类别了。(这个是图像检测,单纯的图像识别没这么多文件)
这个是后面弄出来的,我当时用的时候没有贴出这一块的教程,其实也简单,最重要的还是要配环境,配了环境也是按照要求准备好数据集,然后修改train.py文件修改参数,然后python train.py,运行后只需要等待训练即可。
这里我看了是用的tensorflow,主要是要配置tensorflow的相关环境和依赖,windows下记得使用anaconda虚拟环境暗转,这样好管理各种软件包,同样也不会影响其它环境的使用。 这里由于我当时没有暗转配置过,这里我就不做过多的讲解,一切按照WIKI文件操作。
我会在后面我使用Yolo v5算法训练的过程做比较详细的讲解和心得分享。
这个不是官方的工具,是一个作者自己写的一个工具,很强! 其实他和上面本地训练的本质是一样的。它只是把上面的环境安装做了一键安装,然后相关的参数配置和训练写了一个界面,不得不说还是很强,也方便我们小白的使用。
不知道现在有没有更新最新版,我当时用的时候用的是第一版和第二版,总体效果还不错。
刚去看了一眼,也没更新了,可以了解一下,下面是关于它的一个介绍。
mx-yolov3介绍
实在是时间过去有点久,所以找了一圈,我都没有在电脑上找到之前的代码。包括识别+通过串口发送+播放视频+文本显示的代码,十分可惜。那一版是第一版,所以包括比较多的功能,本来值得写一下学习的,但是可能我当时修改的时候直接烧进的板子,没有在电脑上保存,所以实在是没找到。
就简单贴一下识别+串口发送,和播放视频的代码吧(这里代码不知道最新的固件后烧录后还能不能跑,反正只是学习看一下,实操还是参考最新的官方历程!)
#这里是识别加串口发送的函数,没写注释,将就看看吧 import sensor import image import lcd import KPU as kpu from fpioa_manager import fm from board import board_info from machine import UART import time fm.register(5,fm.fpioa.UART1_TX) fm.register(4,fm.fpioa.UART1_RX) uart_A = UART(UART.UART1, 115200, 8, None, 1, timeout=1000, read_buf_len=4096) lcd.init() sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.set_windowing((224, 224)) sensor.set_hmirror(1) lcd.rotation(2) sensor.set_vflip(1) sensor.run(2) task = kpu.load("/sd/2020_11_14.kmodel") f=open("anchors.txt","r") anchor_txt=f.read() L=[] for i in anchor_txt.split(","): L.append(float(i)) anchor=tuple(L) f.close() a = kpu.init_yolo2(task, 0.6, 0.3, 5, anchor) f=open("classes.txt","r") labels_txt=f.read() labels = labels_txt.split(",") f.close() count = 0 while(True): img = sensor.snapshot() code = kpu.run_yolo2(task, img) if code: for i in code: a=img.draw_rectangle(i.rect(),(255,0,0),2) a = lcd.display(img) for i in code: lcd.draw_string(48, 224, labels[i.classid()]+" "+'%.2f'%i.value(), lcd.RED,lcd.WHITE) write_str = str(i.classid()) uart_A.write(write_str) else: a = lcd.display(img) if count == 3: count=0 continue count += 1 print('ok') a = kpu.deinit(task)
#这是当时的播放视频的例程 from Maix import GPIO, I2S from board import board_info from fpioa_manager import fm import lcd import video import time lcd.init() # AUDIO_PA_EN_PIN = None # Bit Dock and old MaixGo #AUDIO_PA_EN_PIN = 32 # Maix Go(version 2.20) AUDIO_PA_EN_PIN = 2 # Maixduino # init i2s(i2s0) i2s = I2S(I2S.DEVICE_0) # config i2s according to audio info i2s.channel_config(i2s.CHANNEL_1, I2S.TRANSMITTER, resolution=I2S.RESOLUTION_16_BIT, cycles=I2S.SCLK_CYCLES_32, align_mode=I2S.RIGHT_JUSTIFYING_MODE) # open audio PA if AUDIO_PA_EN_PIN: fm.register(AUDIO_PA_EN_PIN, fm.fpioa.GPIO1, force=True) wifi_en = GPIO(GPIO.GPIO1, GPIO.OUT) wifi_en.value(1) fm.register(34, fm.fpioa.I2S0_OUT_D1, force=True) fm.register(35, fm.fpioa.I2S0_SCLK, force=True) fm.register(33, fm.fpioa.I2S0_WS, force=True) fm.register(board_info.BOOT_KEY, fm.fpioa.GPIOHS1) key = GPIO(GPIO.GPIOHS1, GPIO.IN) def Video_Play(): v = video.open("/sd/badapple.avi") print(v) v.volume(50) while True: if v.play() == 0 or key.value() == 0: print("play end") break v.__del__() if __name__=='__main__': while(True): Video_Play()
maixpy的东西大概就这么多,剩下的就是还是看我提供的链接,看最新的资料就行学习。这里我就不对代码过多分享了。后面的树莓派和jetsonnano部分我会花更多的篇幅进行总结!