• 【MM32F5270开发板试用】单片机也能玩神经网络-TinyMaix实测开源


    本篇文章来自极术社区与灵动组织的MM32F5270开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:甴尐

    MM32F5270如何在单片机上跑通一个模型

    (完整代码在末尾百度网盘)
    问题点
    基本上集中在怎么量化,还有就是单片机前段推理框架。最重要的就是资源问题。
    先贴一下TinyMaix
    宝藏仓库

    TinyMaix是面向单片机的超轻量级的神经网络推理库,即TinyML推理库,可以让你在任意单片机上运行轻量级深度学习模型~
    我们的设计原则:易用性 > 移植性 > 速度 > 空间

    话不多说,开干~~~~

    keil版本

    定时器

    模型都需要统计时间

    /* Setup the timer. */
    void app_tim_init(void)
    {
        /* Set the counter counting step. */
        TIM_Init_Type tim_init;
        tim_init.ClockFreqHz = BOARD_TIM_FREQ;
        tim_init.StepFreqHz = APP_TIM_UPDATE_PERIOD; /* 1s. */
        tim_init.Period = 1u;
        tim_init.EnablePreloadPeriod = false;
        tim_init.PeriodMode = TIM_PeriodMode_Continuous;
        tim_init.CountMode = TIM_CountMode_Increasing;
        TIM_Init(BOARD_TIM_PORT, &tim_init);
    
        /* Enable interrupt. */
        NVIC_EnableIRQ(BOARD_TIM_IRQn);
        TIM_EnableInterrupts(BOARD_TIM_PORT, TIM_INT_UPDATE_PERIOD, true);
    
        /* Start the counter. */
        TIM_Start(BOARD_TIM_PORT);
    }
    
    tim_init.StepFreqHz = 1000000  
    tim_init.Period = 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    一个1us的定时器。觉得浪费资源,也可以用系统滴答时间。

    深度学习模型

    显卡

    conda tf pytorch 环境

    数据集采用 mnist 训练20 epochs 准确率 96%

    然后使用tflite中自带的量化策略,f32 转成int8.缩小模型。然后转成自定义的.h文件格式。

    TinyMaix 移植

    添加对应的文件

    适配MM32

    测试时间这边改成timer1 1us的tick
    使用加速 使用ARM M系列加速
    #define TM_ARCH TM_ARCH_ARM_SIMD
    使用纯CPU
    #define TM_ARCH TM_ARCH_CPU

    主函数

    void tinyMaix_test(void)
    {
            /* Begin TinyMaix */
            TM_DBGT_INIT();
            TM_PRINTF("mnist demo\n");
            tm_mdl_t mdl;
    
            for (int i = 0; i < 28 * 28; i++) {
                    TM_PRINTF("%3d,", pic[i]);
                    if (i % 28 == 27)
                            TM_PRINTF("\n");
            }
    
            tm_mat_t in_uint8 = {3,IMG_L,IMG_L,IMG_CH, (mtype_t*)pic};
            tm_mat_t in = {3,IMG_L,IMG_L,IMG_CH, NULL};
            tm_mat_t outs[1];
            tm_err_t res;
            tm_stat((tm_mdlbin_t*) mdl_data);
            TM_DBGT("tm_load");
            res = tm_load(&mdl, mdl_data, mdl_buf, layer_cb, &in);
            if (res != TM_OK) {
                    TM_PRINTF("tm model load err %d\n", res);
                    return;
            }
    
            TM_DBGT("tm_preprocess");
        #if (TM_MDL_TYPE == TM_MDL_INT8) || (TM_MDL_TYPE == TM_MDL_INT16)
            res = tm_preprocess(&mdl, TMPP_UINT2INT, &in_uint8, &in);
        #else
            res = tm_preprocess(&mdl, TMPP_UINT2FP01, &in_uint8, &in);
        #endif
    
            TM_DBGT("tm_run");
            TM_DBGT_START();
            res = tm_run(&mdl, &in, outs);
            TM_DBGT("tm_run");
            if (res == TM_OK)
            {
        #ifndef TEST_MBNET
                    parse_output(outs);
        #endif
            }
            else
                    TM_PRINTF("tm run error: %d\n", res);
            tm_unload(&mdl);
    }
    
    int main(void)
    {
        BOARD_Init();
        printf("\r\ntim_basic example.\r\n");
    
        /* Setup the timer. */
        app_tim_init();
            tinyMaix_test();
        while (1)
        {
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    效果测试

    TM_ARCH_ARM_SIMD

    ===tm_run use 2.808 ms

    在这里插入图片描述

    ===tm_run use 4.243 ms
    准确识别,加速后,运行速度翻倍。

    ps(mm32工程放百度网盘需要自取,也可以在下方附件下载)
    链接:https://pan.baidu.com/s/1Y17nchrzb0_t2IaGEd1QQQ
    提取码:fsno

  • 相关阅读:
    【仁川出差】记2022.10仁川出差
    【Kubernetes | Pod 系列】Pod 的基本管理(3)——对 Pod 的删除与修改
    【k8s连载系列】2. k8s整体架构
    【云原生系列】第四讲:Knative 之 Eventing
    面试官:说一说CyclicBarrier的妙用!我:这个没用过
    python3-python中的GUI,Tkinter的使用,抓取小米应用商店应用列表名称
    【负荷预测、电价预测】基于神经网络的负荷预测和价格预测附Matlab代码
    代码块详解
    关于C/C++指针星号 * 的写法问题
    Rust编程中的线程间通信
  • 原文地址:https://blog.csdn.net/weixin_47569031/article/details/127440970