基于亚博K210开发板——物体分类测试

news2025/6/3 22:35:11

开发板

亚博K210开发板
在这里插入图片描述

实验目的

本次测试主要学习 K210 如何物体分类,然后通过 LCD 显示屏实时显示当前物体的分类名称。本节采用百度出的 PaddlePaddle 平台开发。

实验元件

OV2640 摄像头/OV9655 摄像头/GC2145 摄像头、LCD 显示屏
在这里插入图片描述

硬件连接

K210 开发板出厂默认已经安装好摄像头和显示器,只需要使用 type-C 数据线连接 K210 开发板与电脑即可。

实验原理

Kendryte K210 具备机器视觉能力,是零门槛机器视觉嵌入式解决方案。它可以在低功耗情况下进行卷积神经网络计算。相关介绍请看前面所述。

  • 百度大脑 AI Studio 是针对 AI 开发者的在线一体化开发平台。 该平台集成了 AI 教程, 深度学习样例工程, 各领域典数据集,强大的云端算力资源及存储资源, 从而解决开发者在 AI 学习过程中的一系列难题, 例如样例代码难以直接应用, 高质量的数据集不易获得,以及本地环境难以使用大体量数据集进行模型训练等等.
  • 百度 AI Studio 平台已经为使用者预置了 Python 语言环境, 以及百度PaddlePaddle 深度学习开发框架.
  • 同时该平台还提供了 PaddlePi-K210 开发套件官方项目,开发者只需要复制相应的项目,重新训练,即可获取模型。您也可以修改成自己的数据集,进行训练, 以适配您的应用场景。
    AI Studio 基本使用可以参考百度 AI 官网。
    这是官方其他用户的:
    https://aistudio.baidu.com/projectdetail/59854

亚博测试通过的项目:
https://aistudio.baidu.com/aistudio/projectdetail/403452?shared=1
在这里插入图片描述

  • 点击上图网址的“运行一下”。会弹出登录,大家自行注册百度账号或者 github账号登录。
  • 登录完成可以选择 fork 到自己项目中,或者直接运行,点击启动环境,可以选择 CPU 或者 GPU 版本,GPU
    是需要算力卡的,一般每天会有 12 个小时使用,一般不追加速度直接选择 CPU 即可。如下图:
    在这里插入图片描述
  • 启动环境需要一段时间,启动完成会提示环境启动成功,点击进入即可。
    为了简单起见,在此训练一个花的五分类模型。
1、fork 过来的项目已经带有 flower_photos.zip 数据集作为训练数据。
2、数据存储在 data/data2815/ 目录下,以压缩包的形式存在。
3、开发者只需要按顺序执行 cell 的代码,就能生成 paddle 模型,为了能在亚
博 K210 开发板上运行,cell8 开始是模型转换相关代码。
4、执行模型转换的相关代码后会在左边的根目录产生 mobilenet.kmodel 模型。
模型生成完成后,需要把模型运行到亚博 K210 开发板上。
5、下载 kmodel 到本机电脑上等待后续开发板调用。

在这里插入图片描述

实验步骤

  1. 代码流程
    系统内部初始化部分:
系统时钟初始化
串口初始化
硬件引脚初始化
IO 电压设置
系统中断初始化
Flash 初始化

外部硬件初始化

Lcd 初始化
Ov2640 初始化

物体分类初始化

在这里插入代码片

物体分类业务逻辑层

等待摄像头采集完成
传入摄像头采集的图像到 KPU 运行模型
等待 KPU 处理完成
获取 KPU 最终处理的结果
把 KPU 处理的结果带入区域层计算最终标记分类结果
  1. 核心代码如下
int main()
{
    /* Set CPU and dvp clk */
    sysctl_pll_set_freq(SYSCTL_PLL0, 800000000UL);
    sysctl_pll_set_freq(SYSCTL_PLL1, 400000000UL);
    sysctl_pll_set_freq(SYSCTL_PLL2, 45158400UL);
    sysctl_clock_enable(SYSCTL_CLOCK_AI);
    //uarths_init();
    plic_init();
    io_set_power();
    io_init();
    
    /* LCD init */
    printf("LCD init\n");
    lcd_init();
    lcd_set_direction(DIR_YX_LRUD);
    lcd_clear(BLACK);
    lcd_draw_picture_half(0, 0, 320, 240, logo);
    lcd_draw_string(70, 40, "Hello Yahboom!", RED);
    lcd_draw_string(70, 60, "5flower classification demo!", BLUE);
    sleep(1);

      /* DVP init */
    printf("DVP init\n");
    dvp_init(8);
    dvp_sccb_set_clk_rate(1000000);//为了兼容GC2145不能太高的速率
    dvp_set_xclk_rate(24000000);
    dvp_enable_burst();
    dvp_set_output_enable(0, 1);
    dvp_set_output_enable(1, 1);
    dvp_set_image_format(DVP_CFG_RGB_FORMAT);
    dvp_set_image_size(320, 240);

    int OV_type;
    OV_type=OVxxxx_read_id();
    /* 初始化摄像头 */
    if(OV_type == OV_9655)
    {
        ov9655_init();
    }   
    else if(OV_type == OV_2640) 
    {
        ov2640_init();
    }
    else //读取gc2145摄像头
    {
        uint16_t device_id;
        gc2145_read_id(&device_id);
        printf("device_id:0x%04x\n", device_id);
        if(device_id != GC2145_ID)
        {
            printf("Camera failure\n");
            return 0;//打不开摄像头,结束
        }
        printf("This is the GC2145 camera\n");
        gc2145_init();//初始化
    }

    kpu_image.pixel = 3;
    kpu_image.width = 320;
    kpu_image.height = 240;
    image_init(&kpu_image);
    
    display_image.pixel = 2; //2->3 LIUSEN
    display_image.width = 320;
    display_image.height = 240;
    image_init(&display_image);
    
    crop_image.pixel = 3;
    crop_image.width = 224;
    crop_image.height = 224;
    image_init(&crop_image);

    //存放AI图像的地址,供AI模块进行算法处理(红色、绿色、蓝色/分量地址)
    dvp_set_ai_addr((uint32_t)kpu_image.addr, (uint32_t)(kpu_image.addr + 320 * 240), (uint32_t)(kpu_image.addr + 320 * 240 * 2));
    //设置采集图像在内存中的存放地址,可以用来显示
    dvp_set_display_addr((uint32_t)display_image.addr);
    //图像开始采集中断| 图像结束采集中断
    dvp_config_interrupt(DVP_CFG_START_INT_ENABLE | DVP_CFG_FINISH_INT_ENABLE, 0);
    //禁用自动接收图像模式
    dvp_disable_auto();

    /* DVP interrupt config */
    printf("DVP interrupt config\n");


    plic_set_priority(IRQN_DVP_INTERRUPT, 1);               //设置中断优先级
    plic_irq_register(IRQN_DVP_INTERRUPT, dvp_irq, NULL);   //注册外部中断函数
    plic_irq_enable(IRQN_DVP_INTERRUPT);                    //使能外部中断
    /* init model */
    //加载 kmodel,需要与 nncase 配合使用
    if (kpu_load_kmodel(&task1, model_data) != 0)
    {
        printf("Cannot load kmodel.\n");
        exit(-1);
    }

    
    sysctl_enable_irq();
      
    /* system start */
    printf("System start\n");
    while (1)
    {
        g_dvp_finish_flag = 0;
        dvp_clear_interrupt(DVP_STS_FRAME_START | DVP_STS_FRAME_FINISH);
        dvp_config_interrupt(DVP_CFG_START_INT_ENABLE | DVP_CFG_FINISH_INT_ENABLE, 1);
        while (g_dvp_finish_flag == 0)
            ;
            
        image_crop(&kpu_image, &crop_image, 48, 8);

        g_ai_done_flag = 0;

        if (kpu_run_kmodel(&task1, crop_image.addr, DMAC_CHANNEL5, ai_done, NULL) != 0)
        {
            printf("Cannot run kmodel.\n");
            exit(-1);
        }
		while (!g_ai_done_flag);

        float *features;
        size_t output_size;
        // 获取 KPU 最终处理的结果  KPU任务句柄  结果的索引值  结果  大小(字节)
        kpu_get_output(&task1, 0, &features, &output_size);
        size_t cls = argmax(features, 5);

        const char *text = NULL;
        
        switch (cls)
        {
            case 0:
                text = "daisy";
                break;
            case 1:
                text = "dandelion";
                break;
            case 2:
                text = "roses";
                break;
            case 3:
                text = "sunflowers";
                break;
            case 4:
                text = "tulip";
                break;
        }
        
        /* display pic*/
        if (features[cls] > PROB_THRESH)
			ram_draw_string(display_image.addr, 150, 20, text, RED);
		lcd_draw_picture(0, 0, 320, 240, (uint32_t *)display_image.addr);
    }
    
}
  1. 编译调试,烧录运行
    进入自己项目 build目录,运行以下命令编译。
cmake .. -DPROJ=watchdog -G "MinGW Makefiles"
make

  1. 代码烧录方法
    打开 kflash 将 object_detection.bin 文件烧录到 K210 开发板上。
    如果想把代码和模型文件分开烧录,需要修改代码
#define  LOAD_KMODEL_FROM_FLASH  0

改为

#define  LOAD_KMODEL_FROM_FLASH  1

然后重新生成 bin 文件,这个时候我们需要把模型文件和 bin 文件打包成一个kfpkg 文件在烧录

实验现象

LCD 显示器先显示图片 logo 和文字,一秒后打开摄像头采集的画面,并且实时检测 20 种物体并标记位置和显示识别的结果。

实验总结

  • 物体分类使用的是百度人工智能 paddlepaddle 的平台。
  • 基于 paddlepaddle 平台可以比较轻松实现物体分类的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2395581.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是缺页中断(缺页中断详解)

文章目录 【操作系统】什么是缺页中断(缺页中断详解)一、缺页中断的本质与背景1. **虚拟内存与分页机制**2. **缺页中断的定义** 二、缺页中断的触发场景1. **首次访问新分配的虚拟页**2. **内存置换导致的页缺失**3. **访问权限冲突**4. **页表项无效**…

【echarts】仪表盘

<div style"width:50%;height:33%"><Yibiaopan echart_id"ybpChart2" :series_data"gaugeData2" title"火电" unit"MWh" :colorList"[#DFA58F,#F89061,#FF8E59]" /></div> 链接&#xff1a;ht…

java27

1.IO流 FileOutPutStream字节输出流基本用法&#xff1a; 一次性写入一个字符串的内容&#xff1a; 注意&#xff1a;\r或者\n表示把普通的r或者n的字符转义成回车的意思&#xff0c;所以不需要\\ FileInputStream字节输入流基本用法 -1在ASCII码里面对应的符号&#xff1a; 不…

OpenFeign和Gateway集成Sentinel实现服务降级

目录 OpenFeign集成Sentinel实现fallback服务降级cloud-alibaba-payment8003(支付服务)cloud-common-api(通用模块)cloud-alibaba-order9003(订单服务)Sentinel配置流控规则测试结果 Gateway集成Sentinel实现服务降级cloud-gateway9527(网关)测试结果 总结 OpenFeign集成Sentin…

CS144 - LAB0

CS144 - Lab 0 telnet 发送请求 如图&#xff0c;很简单&#xff0c;但是注意输入时间太久会超时 发邮箱 首先我们需要用命令行去发邮箱&#xff0c;这里我用企业微信邮箱给自己的 qq 邮箱发送~ 整个命令如下&#xff01; 对于其中的参数&#xff0c;其实从英文就可以看出来…

论文浅尝 | 将复杂知识图谱问答对齐为约束代码生成(COLING2025)

笔记整理&#xff1a;康家溱&#xff0c;东南大学在读硕士&#xff0c;研究方向为代码大语言模型 论文链接&#xff1a;https://aclanthology.org/2025.coling-main.267.pdf 发表会议&#xff1a;COLING 2025 1. 动机 近年来&#xff0c;随着大语言模型&#xff08;LLM&#xf…

Golang|分布式搜索引擎中所使用到的设计模式

迭代器模式 定义&#xff1a;在遍历接口时&#xff0c;提供统一的方法函数供调用&#xff0c;保持一致性。核心思想&#xff1a;与大众习惯保持一致&#xff0c;方便第三方实现容器类时保持一致。常见方法&#xff1a;如next()方法&#xff0c;适用于所有集合类&#xff0c;简化…

Ubuntu22.04通过命令行安装qt5

环境&#xff1a; VMware17Pro ubuntu-22.04.5-desktop-amd64.iso 步骤&#xff1a; 安装好虚拟机进入shell&#xff0c;或通过ssh登录&#xff0c;确保虚拟机能上外网&#xff0c;执行命令&#xff1a; sudo apt update sudo apt install build-essential sudo snap in…

STM32:ESP8266 + MQTT 云端与报文全解析

知识点1【MQTT的概述】 1、概述 MQTT是一种基于发布/订阅模式的轻量级应用层协议&#xff0c;运行在TCP/IP协议之上&#xff0c;专用物联网&#xff08;IoT&#xff09;和机器对机器&#xff08;M2M&#xff09;设计&#xff0c;其核心目标是低带宽&#xff0c;高延迟或不稳定…

HTML5 Canvas 星空战机游戏开发全解析

HTML5 Canvas 星空战机游戏开发全解析 一、游戏介绍 这是一款基于HTML5 Canvas开发的2D射击游戏&#xff0c;具有以下特色功能&#xff1a; &#x1f680; 纯代码绘制的星空动态背景✈️ 三种不同特性的敌人类型&#x1f3ae; 键盘控制的玩家战机&#x1f4ca; 完整的分数统…

箱式不确定集

“箱式不确定集&#xff08;Box Uncertainty Set&#xff09;”可以被认为是一种 相对简单但实用的不确定集建模方式。 ✅ 一、什么是“简单的不确定集”&#xff1f; 在鲁棒优化领域&#xff0c;“简单不确定集”通常指的是&#xff1a; 特点描述形式直观数学表达简洁&#…

内存管理 : 04段页结合的实际内存管理

一、课程核心主题引入 这一讲&#xff0c;我要给大家讲的是真正的内存管理&#xff0c;也就是段和页结合在一起的内存管理方式。之前提到过&#xff0c;我们先学习了分段管理内存的工作原理&#xff0c;知道操作系统采用分段的方式&#xff0c;让用户程序能以分段的结构进行编…

vue3: baidusubway using typescript

项目结构&#xff1a; <!--npm install -D tailwindcss-3d BaiduSubwayMap.vue npm install -D tailwindcss postcss autoprefixer--> <template><div class"relative w-full h-screen"><!-- 地图容器 --><div id"subway-container…

Redis最佳实践——性能优化技巧之集群与分片

Redis集群与分片在电商应用中的性能优化技巧 一、Redis集群架构模式解析 1. 主流集群方案对比 方案核心原理适用场景电商应用案例主从复制读写分离数据冗余中小规模读多写少商品详情缓存Redis Sentinel自动故障转移监控高可用需求场景订单状态缓存Redis Cluster原生分布式分片…

常见相机的ISP算法

常见的ISP算法 3A算法 去雾算法 图像增强算法 图像宽动态算法 图像的电子缩放算法&#xff0c;无极电子缩放 图像降噪算法 相机常见问题 1.相机启动速度问题&#xff0c;启动速度较慢 2.相机扛不住高低温问题 3.相机散热问题问题 4.相机高低温芯片保护掉电 5.相机的成像效果或者…

2024 CKA模拟系统制作 | Step-By-Step | 8、题目搭建-创建 Ingress

目录 ​​​​​​免费获取题库配套 CKA_v1.31_模拟系统 一、题目 二、核心考点 Ingress 资源定义 Ingress Controller 依赖 服务暴露验证 网络层次关系 三、搭建模拟环境 1.创建命名空间 2.安装ingress ingress-nginx-controller 3.创建hello.yaml并部署 四、总结 …

OldRoll复古胶片相机:穿越时光,定格经典

在数字摄影盛行的今天&#xff0c;复古胶片相机的独特魅力依然吸引着无数摄影爱好者。OldRoll复古胶片相机这款软件&#xff0c;以其独特的复古风格和丰富的胶片滤镜效果&#xff0c;让用户仿佛穿越回了那个胶片摄影的黄金时代。它不仅模拟了胶片相机的操作界面&#xff0c;还提…

通俗易懂的 JS DOM 操作指南:从创建到挂载

目录 &#x1f9e9; 1. 创建元素&#xff1a;document.createElement / createElementNS &#x1f4dd; 2. 创建文本&#xff1a;document.createTextNode ✏️ 3. 修改文本&#xff1a;node.nodeValue &#x1f5d1;️ 4. 移除元素&#xff1a;el.removeChild() &#x1…

CSS Day07

1.搭建项目目录 2.网页头部SEO三大标签 3.Favicon图标与版心 &#xff08;1&#xff09;Favicon图标 &#xff08;2&#xff09;版心 4.快捷导航 5.头部-布局 6.头部-logo 7.头部-导航 8.头部-搜索 9头部-购物车 10.底部-布局 11.底部-服务区域 12.底部-帮助中心 13.底部-版权…

RV1126-OPENCV 交叉编译

一.下载opencv-3.4.16.zip到自己想装的目录下 二.解压并且打开 opencv 目录 先用 unzip opencv-3.4.16.zip 来解压 opencv 的压缩包&#xff0c;并且进入 opencv 目录(cd opencv-3.4.16) 三. 修改 opencv 的 cmake 脚本的内容 先 cd platforms/linux 然后修改 arm-gnueabi.to…