基于亚博K210开发板——物体分类测试
开发板
亚博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 到本机电脑上等待后续开发板调用。
实验步骤
- 代码流程
系统内部初始化部分:
系统时钟初始化
串口初始化
硬件引脚初始化
IO 电压设置
系统中断初始化
Flash 初始化
外部硬件初始化
Lcd 初始化
Ov2640 初始化
物体分类初始化
在这里插入代码片
物体分类业务逻辑层
等待摄像头采集完成
传入摄像头采集的图像到 KPU 运行模型
等待 KPU 处理完成
获取 KPU 最终处理的结果
把 KPU 处理的结果带入区域层计算最终标记分类结果
- 核心代码如下
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 LIUSENdisplay_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);}}
- 编译调试,烧录运行
进入自己项目 build目录,运行以下命令编译。
cmake .. -DPROJ=watchdog -G "MinGW Makefiles"
make
- 代码烧录方法
打开 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 平台可以比较轻松实现物体分类的功能。
相关文章:

基于亚博K210开发板——物体分类测试
开发板 亚博K210开发板 实验目的 本次测试主要学习 K210 如何物体分类,然后通过 LCD 显示屏实时显示当前物体的分类名称。本节采用百度出的 PaddlePaddle 平台开发。 实验元件 OV2640 摄像头/OV9655 摄像头/GC2145 摄像头、LCD 显示屏 硬件连接 K210 开发板…...
Kubernetes(K8s)核心架构解析与实用命令大全
在容器化技术席卷全球的今天,Kubernetes(简称K8s,以“8”代替“ubernete”八个字母)已成为云原生应用部署和管理的核心基础设施。作为Google基于内部Borg系统开源打造的容器编排引擎,K8s不仅解决了大规模容器管理的难题…...

什么是缺页中断(缺页中断详解)
文章目录 【操作系统】什么是缺页中断(缺页中断详解)一、缺页中断的本质与背景1. **虚拟内存与分页机制**2. **缺页中断的定义** 二、缺页中断的触发场景1. **首次访问新分配的虚拟页**2. **内存置换导致的页缺失**3. **访问权限冲突**4. **页表项无效**…...
解决:MySQL client, error code: 1251, SQLState: 08004
问题: Client does not support authentication protocol requested by server; consider upgrading MySQL client, error code: 1251, SQLState: 08004 原因: 客户端不支持服务器(8.0默认)caching_sha2_password 方式的链接认证…...

【echarts】仪表盘
<div style"width:50%;height:33%"><Yibiaopan echart_id"ybpChart2" :series_data"gaugeData2" title"火电" unit"MWh" :colorList"[#DFA58F,#F89061,#FF8E59]" /></div> 链接:ht…...

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

OpenFeign和Gateway集成Sentinel实现服务降级
目录 OpenFeign集成Sentinel实现fallback服务降级cloud-alibaba-payment8003(支付服务)cloud-common-api(通用模块)cloud-alibaba-order9003(订单服务)Sentinel配置流控规则测试结果 Gateway集成Sentinel实现服务降级cloud-gateway9527(网关)测试结果 总结 OpenFeign集成Sentin…...
Gin项目脚手架与标配组件
文章目录 前言设计思想和原则✨ 技术栈视频实况教程sponge 内置了丰富的组件(按需使用)几个标配常用组件主要技术点另一个参考链接 前言 软件和汽车一样,由多个重要零部件组装而成。 本文堆积了一些常用部件,还没来得及好好整理。先放着。 神兵利器虽多…...
ros2总结-常用消息包类型以及查询消息包命令
ROS2官方提供了多个常用的消息包(message packages),这些消息包定义了标准的数据结构,用于机器人系统中的通信和数据交换。以下是ROS2官方常见的消息包及其用途: ### 1. **std_msgs** - **用途**:提供基…...
C#·常用快捷键
一、大小写转换 CTRL U转小写 CTRL SHIFT U转大写 二、调试快捷键 F6: 生成解决方案 CtrlF6: 生成当前项目 F7: 查看代码 ShiftF7: 查看窗体设计器 F5: 启动调试 CtrlF5: 开始执行(不调试) ShiftF5: 停止调试 CtrlShiftF5: 重启调试 F9: 切换断点 CtrlF9: 启用/停止断点 C…...
CSS3实现的账号密码输入框提示效果
以下是通过CSS3实现输入框提示效果的常用方法,包含浮动标签和动态提示两种经典实现方案: 一、浮动标签效果 <div class"input-group"><input type"text" required><label>用户名</label> </div><…...
沉浸式 VR 汽车之旅:汽车虚拟展厅与震撼试驾体验
在传统的汽车销售模式里,消费者的看车选车过程极为艰辛。他们常常需要花费大量的时间和精力,亲自前往一家又一家的 4S 店。有时候,为了对比不同品牌、不同型号的汽车,可能要穿梭于城市的各个角落,耗费一整天甚至数天的…...
低秩矩阵、奇异值矩阵和正交矩阵
低秩矩阵 低秩矩阵(Low-rank Matrix)是指秩(rank)远小于其行数和列数的矩阵,即 r a n k ( M ) r ≪ min ( m , n ) rank(M) r \ll \min(m,n) rank(M)r≪min(m,n)。其核心特点是信息冗余性,可通过少量…...

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

论文浅尝 | 将复杂知识图谱问答对齐为约束代码生成(COLING2025)
笔记整理:康家溱,东南大学在读硕士,研究方向为代码大语言模型 论文链接:https://aclanthology.org/2025.coling-main.267.pdf 发表会议:COLING 2025 1. 动机 近年来,随着大语言模型(LLM…...
【Linux命令】scp远程拷贝
文章目录 1. 基本语法与常用选项2. 使用场景和使用示例本地文件->远程主机远程主机文件->本地远程主机->另一台远程主机 3. 使用注意事项 scp(Secure Copy Protocol)是linux中基于ssh的安全文件传输工具,用于在本地和远程主机之前安…...

Golang|分布式搜索引擎中所使用到的设计模式
迭代器模式 定义:在遍历接口时,提供统一的方法函数供调用,保持一致性。核心思想:与大众习惯保持一致,方便第三方实现容器类时保持一致。常见方法:如next()方法,适用于所有集合类,简化…...

Ubuntu22.04通过命令行安装qt5
环境: VMware17Pro ubuntu-22.04.5-desktop-amd64.iso 步骤: 安装好虚拟机进入shell,或通过ssh登录,确保虚拟机能上外网,执行命令: sudo apt update sudo apt install build-essential sudo snap in…...
【仿生机器人】仿生机器人系统架构设计2.0——具备可执行性
结合我的需求后,来自Claude4.0 的结构设计 仿生机器人系统架构设计 一、系统总体架构 1.1 核心设计理念 涌现式情感:情感不是预设的规则,而是从环境感知、记忆关联和内在状态的复杂交互中涌现出来动态人格塑造:性格特质随着经…...

STM32:ESP8266 + MQTT 云端与报文全解析
知识点1【MQTT的概述】 1、概述 MQTT是一种基于发布/订阅模式的轻量级应用层协议,运行在TCP/IP协议之上,专用物联网(IoT)和机器对机器(M2M)设计,其核心目标是低带宽,高延迟或不稳定…...

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

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

内存管理 : 04段页结合的实际内存管理
一、课程核心主题引入 这一讲,我要给大家讲的是真正的内存管理,也就是段和页结合在一起的内存管理方式。之前提到过,我们先学习了分段管理内存的工作原理,知道操作系统采用分段的方式,让用户程序能以分段的结构进行编…...
不使用绑定的方法
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // 初始设置 A 控件的宽度 ControlA.Width ControlB.Width / 2; // 监听 B 控件的 SizeChanged 事件 ControlB.SizeChanged (sender, e) > { ControlA.Width ControlB.Actual…...
Spring Boot 中的 Web 应用与 Reactive Web 应用
该判断题表述为:“Spring Boot启动过程中会判断当前应用类型是Web应用还是Reactive Web应用。” 这个说法是 正确的。Spring Boot 的自动配置机制会检查类路径,以确定是将应用程序配置为传统的 Servlet Web 应用还是 Reactive Web 应用。 Spring Boot 中…...
基于 stm32 的农用车控制系统设计
一、系统功能需求分析 农用车控制系统需实现多方面功能,以满足农业生产多样化需求。在动力控制方面,要实现发动机转速调节、挡位自动切换;作业控制涵盖农机具升降、播种施肥量调节、喷洒农药的流量与压力控制等;同时,还需具备车辆状态监测功能,实时监控发动机温度、油压…...

vue3: baidusubway using typescript
项目结构: <!--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原生分布式分片…...
vue或者前端适配makedown推荐开源依赖
在 Vue 或前端项目中处理 Markdown 格式,以下是一些推荐的开源依赖和工具,根据需求分类整理: 1. 基础 Markdown 解析与渲染 Vue 专用库 vueuse/markdown VueUse 生态的 Markdown 工具,轻量且集成度高。 适合快速在 Vue 项目中渲…...
打打基础 | 从翻转链表到寄存器、汇编与内存
我作为软件工程师在美国工作了三年,期间接触和浸泡过不少的技术栈,罗列一番的话有 AWS cloud, frontend (React, TypeScript), backend (Django, Springboot, ECS, GraphQL), JVM (Java, Scala, Kotlin), data pipelines (Spark, Snowflake, Prefect, DB…...