3.0 Maixpy(maixduino)的简单使用、训练的讲解,识别程序和视频播放的讲解(以垃圾分类为例)

注意!!!

这篇文章写于2021年10月,但是我使用这个开发板是在2020年8月到12月的期间用的,并且这块板子还是比较新的,也是最近一段时间资料才开始逐渐完善的。 当时我用的时候也是三天两头烧写固件,各种bug不断。但是现在也完善很多了,所以我下面依据的资料,尤其是我的示例代码,可能由于更新,一些方法有所变化。要根据需要查看官方的代码库,有很多示例代码。 但是有一点,我写之前也有用了一些时间查看了最新的WIKI文档,有了很多更新,但是思路是一样,毕竟不可能完全重构是吧。所以在看的时候要学会举一反三,万变不离其宗。有问题也还希望大家指正!

模型的训练

我这里不会再对这个板子的基础知识做讲解,已经模型的具体训练方式做过多的讲解,因为官方的文档比我讲的更加清楚,学习之前和操作之中,反复阅读文档,实在遇到解决不了的问题再去询问他人!

Maixhub训练平台

这是spieed自己的训练平台,只要是自己做比赛或者测试的少量数据集都可以丢上去训练。 我之前也用过,当时这平台也是三天两头崩溃,当时说是重做网站,那一个月都无法上传训练,后面才找到一个工具在本地训练,后面再细讲。 当时最近看群消息,基本这个网站现在还算是稳定可用了。 用这个就相当于傻瓜式操作,基本只要自己处理好数据集,按照规定的格式,打包上传即可。然后训练完成后的模型就会打包发送到你的邮箱。把里面的模型文件拷贝到SD卡里面就可以使用。同时还包括boot.py和main.py两个文件,一起放进去,最简单的识别程序就完成了。(这是我当时的使用的情况,至于现在,大家可以自行尝试!)
这是最新平台的使用,大家可以自行查看。
maixhub平台使用说明

这个就是当时平台训练发送过来的文件,kmodel是加密的模型文件,h5,tflite也是不同格式的模型文件。anchors.txt是锚点文件,主要是进行图像检测的时候用,class.txt,就是图像的类别了。(这个是图像检测,单纯的图像识别没这么多文件)
3.0 Maixpy(maixduino)的简单使用、训练的讲解,识别程序和视频播放的讲解(以垃圾分类为例)

本地训练 LINUX/WINDOWS

这个是后面弄出来的,我当时用的时候没有贴出这一块的教程,其实也简单,最重要的还是要配环境,配了环境也是按照要求准备好数据集,然后修改train.py文件修改参数,然后python train.py,运行后只需要等待训练即可。
这里我看了是用的tensorflow,主要是要配置tensorflow的相关环境和依赖,windows下记得使用anaconda虚拟环境暗转,这样好管理各种软件包,同样也不会影响其它环境的使用。 这里由于我当时没有暗转配置过,这里我就不做过多的讲解,一切按照WIKI文件操作。
我会在后面我使用Yolo v5算法训练的过程做比较详细的讲解和心得分享。

Mx-Yolo工具的使用

这个不是官方的工具,是一个作者自己写的一个工具,很强! 其实他和上面本地训练的本质是一样的。它只是把上面的环境安装做了一键安装,然后相关的参数配置和训练写了一个界面,不得不说还是很强,也方便我们小白的使用。
不知道现在有没有更新最新版,我当时用的时候用的是第一版和第二版,总体效果还不错。
刚去看了一眼,也没更新了,可以了解一下,下面是关于它的一个介绍。

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部分我会花更多的篇幅进行总结!

上一篇:springboot项目启动自动执行


下一篇:《技术的潜能:商业颠覆、创新与执行》一一2.9对安全项目的侧重