0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于RV1126开发板实现自学习图像分类方案

ljx2016 来源:ljx2016 作者:ljx2016 2025-04-11 13:49 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1. 方案简介

自学习:在识别前对物体图片进行模型学习,训练完成后通过算法分类得出图像的模型ID。

方案设计逻辑流程图,方案代码分为分为两个业务流程,主体代码负责抓取、合成图像,算法代码负责训练和检测功能。

wKgZO2f4rlWAKRoAAAPst1Y3j3s168.png

2. 快速上手

2.1 开发环境准备

如果您初次阅读此文档,请阅读《入门指南/开发环境准备/Easy-Eai编译环境准备与更新》,并按照其相关的操作,进行编译环境的部署

在PC端Ubuntu系统中执行run脚本,进入EASY-EAI编译环境,具体如下所示。

cd ~/develop_environment
./run.sh
wKgZPGf4rlWAUQNdAACbrHAYX20357.png

2.2 源码下载以及实例编译

在EASY-EAI编译环境下创建存放源码仓库的管理目录:

cd /opt
mkdir EASY-EAI-Toolkit
cd EASY-EAI-Toolkit

通过git工具,在管理目录内克隆远程仓库

git clone https://github.com/EASY-EAI/EASY-EAI-Toolkit-C-Solution.git

wKgZO2f4rlWAO_BxAADIS9t8Zg0281.png

注:

* 此处可能会因网络原因造成卡顿,请耐心等待。

* 如果实在要在gitHub网页上下载,也要把整个仓库下载下来,不能单独下载本实例对应的目录

进入到对应的例程目录执行编译操作,具体命令如下所示:

cd EASY-EAI-Toolkit-C-Solution/solu-selfLearning/
./build.sh

注:

* 由于依赖库部署在板卡上,因此交叉编译过程中必须保持adb连接。

wKgZPGf4rlWAHBNVAAGZ4f3Wjjo145.png

注:

* 若build.sh脚本不带任何参数,则仅会拷贝solution编译出来的可执行文件。

* 若build.sh脚本带有cpres参数,则会把Release/目录下的所有资源都拷贝到开发板上。

* 若build.sh脚本带有clear参数,则会把build/目录和Release/目录删除。

2.3 模型获取

【百度网盘】

链接:https://pan.baidu.com/s/1mrhVHxHWJ8cY9Fl9k5KtYg

提取码:0k7j

wKgZO2f4rlWASvFOAABjDdFmOCs363.png

本方案用到模型:classify.model

直接把模型下载到本地Windows主机,复制。再进入PC端Ubuntu创建存放model目录:

cd /opt
mkdir model
wKgZPGf4rlaARVz_AAAejyLG8yc721.png

然后把模型从本地Windows主机粘贴到PC端Ubuntu中:

wKgZO2f4rlaAAuGQAAHViRDZHOE469.pngwKgZPGf4rlaAT7c2AADEjwtPVgc152.png

2.4 方案部署

使用下方命令再次回到开发实例目录

cd /opt/EASY-EAI-Toolkit-C-Solution/solu-selfLearning/

然后,将EASY-EAI编译环境的编译结果部署到板卡中(有两种方法)。

方法一:通过执行以下命令手动部署【推荐】

cp Release/solu-* /mnt/userdata/Solu
cp Release/simhei.ttf /mnt/userdata/Solu

方法二:在编译时加上编译参数自动部署

./build.sh cpres

最后,将准备好的模型部署到板卡中(注意:模型要放到编译结果的同一目录中),执行命令如下所示。

cp /opt/model/classify.model /mnt/userdata/Solu

2.5 示例方案运行

通过按键Ctrl+Shift+T创建一个新窗口,执行adb shell命令,进入板卡运行环境。

adb shell

wKgZO2f4rleARvKoAACOVQLk9o8342.png

进入板卡后,定位到例程部署的位置,如下所示:

cd /userdata/Solu

运行例程命令如下所示:

./solu-selfLearning

2.6 运行效果

运行打印如下:

wKgZPGf4rleAT5ZmAAF1aZUDzxc645.png

用摄像头对准训练物体,双击屏幕进行训练。一个模型训练5张图片,总共训练3个模型:

wKgZO2f4rSOAc4iUACEGj0u-H6I612.png

训练完成后进入识别模式:

wKgZO2f4rSOAXi7dACD1Of1Et8s012.png

2.7 开机启动

首先进入板卡环境,执行以下命令,在板卡上创建一个给本例程使用的应用目录:myapp

cd /userdata/apps/
mkdir myapp
wKgZO2f4rleAP6rgAAA1VO-PFiQ250.png

然后回到开发环境中,通过使用“2.4方案部署”类似的操作方法,把本例程所需要的全部文件,包含:编译结果,配置文件,模型等。部署到刚刚新建的myapp目录中。

最后在板卡上创建一个run.sh脚本来管控用户所有需要的应用即可,《入门指南/应用程序开机自启动》会详细描述run.sh脚本该如何编写。

3. 代码解析

方案主逻辑代码位于:EASY-EAI-Toolkit-C-Solution/ solu-selfLearning/src/main.cpp。代码实现主要通过调用我司的easyeai-api库快速实现自学习图像分类功能,代码主体分为主线程,算法分析子线程和按键模型训练回调。

3.1 组件库组成

要实现自学习图像分类功能,需要使用到easyeai-api库的以下组件。

模组信息如下所示。

组件 头文件以及库路径 描述
系统操作组件 easyeai-api/common_api/system_opt 提供线程操作函数
摄像头组件 easyeai-api/peripheral_api/camera 提供摄像头操作函数
显示屏组件 easyeai-api/peripheral_api/display 提供显示屏操作函数
自学习组件 easyeai-api/algorithm_api/self_learning 提供自学习操作函数
中文字库组件 easyeai-api/common_api/font_engine 提供中文显示操作函数
触摸屏组件 easyeai-api/peripheral_api/touchscreen 提供触摸屏操作函数

这些组件通过CMakeLists.txt编译进工程,具体请看后续章节。

3.2 逻辑框图

项目的整体逻辑框图如下所示。

wKgZPGf4rleAacyHAAPst1Y3j3s012.png

3.3 主线程

主线程处理的业务有:

  • 初始化外设;
  • 创建算法分析子线程;
  • 创建触摸屏回调函数
  • 抓图发送给到子线程;
  • 抓图、显示;

本处附上主要的逻辑功能代码,其他辅助的、校验型的代码先忽略。

组件初始化操作如下,本处调用RGB摄像头。

// 1.打开摄像头
ret = rgbcamera_init(CAMERA_WIDTH, CAMERA_HEIGHT, 90);
pbuf = NULL;
pbuf = (char *)malloc(IMAGE_SIZE);

创建线程互斥锁以及线程,如下所示。

// 2.创建识别线程,以及图像互斥锁
pthread_mutex_init(&img_lock, NULL);
CreateNormalThread(detect_thread_entry, &result, &mTid);

初始化显示屏,如下所示。

// 3.显示初始化
ret = disp_init(SCREEN_WIDTH, SCREEN_HEIGHT);

抓取图像,调用clone操作。

// 4.(取流 + 显示)循环
pthread_mutex_lock(&img_lock);
ret = rgbcamera_getframe(pbuf);

algorithm_image = Mat(CAMERA_HEIGHT, CAMERA_WIDTH, CV_8UC3, pbuf);
image = algorithm_image.clone();
pthread_mutex_unlock(&img_lock);

调用显示图像,将分析的结果通过result标记出来。

// 写入文字
char label_text[50];
char label_text2[50];
if(1 == train_flag){/*识别模式*/
	memset(label_text, 0 , sizeof(label_text));
	memset(label_text2, 0 , sizeof(label_text2));
	sprintf(label_text, "训练结束,开始识别"); 
	sprintf(label_text2, "模型ID:%d",result); 
}else{/*训练模式*/
	memset(label_text, 0 , sizeof(label_text));
	memset(label_text2, 0 , sizeof(label_text2));
	sprintf(label_text, "模型训练中,双击屏幕开始训练"); 
	sprintf(label_text2, "模型ID:%d , 训练次数:%d",mode_data , train_data_cnt); 
}
putText(image.data, image.cols, image.rows, label_text, 30, 30, color);
putText(image.data, image.cols, image.rows, label_text2, 30, 1000, color);
IplImage tmp = IplImage(image);
CvArr* arr = (CvArr*)&tmp;
CvRect rect1 = cvRect(20,300,680,680);
drawDashRect(arr,1,2,&rect1,CV_RGB(253,255,85),2);
disp_commit(image.data, IMAGE_SIZE);

3.4 触摸屏回调函数

触摸屏回调函数,主要完成以下操作:

  • 判断有双击屏幕事件发生;
  • 延时监测是否图像缓冲区是否为空;
  • 不为空时,证明主函数已发送图像数据过来,执行图像获取操作;
  • 双击屏幕时,将主线程图像送入算法接口进行模型训练;

3.5 算法分析子线程

算法分析子线程,主要完成以下操作:

  • 延时监测是否图像缓冲区是否为空;
  • 不为空时,证明主函数已发送图像数据过来,线程执行图像获取操作;
  • 调用模型分类分析函数;
  • 记录模型ID,用于主线程图像合成操作;

延时监测是否有图像,操作如下所示。

if(algorithm_image.empty()) {
	usleep(5);
	continue;
}

获取图像操作如下所示。

pthread_mutex_lock(&img_lock);
image = algorithm_image.clone();
pthread_mutex_unlock(&img_lock);

调用模型分类函数,算法得到的目标结果记录于*share_para内,如下所示。

// 算法分析
*share_para = self_learning_inference(classify_ctx, image, train_data, train_data_count, k_value);	

4. 开发指南

4.1 示例文件&目录结构

Solution git仓库会随着产品迭代更新,不断新增解决方案代码,当前截图只作参考。

4.1.1 Solution git仓库目录介绍。

Solution工程构成如下所示,由功能组件easyeai-api和各个解决方案构成。

wKgZO2f4rleAM-FeAAD6ebXUGmk979.png

单个“solu-”开头的目录即为一个解决方案案例,代码内调用“EASY EAI-API”来满足某一实际应用场景的需求。

功能组件的描述如下所示,easyeai-api是经过高度封装的易用性组件接口,便于用户直接调用板卡资源。

功能 组件目录 组件子目录 描述
功能组件 easyeai-api algorithm_api 算法组件
common_api 通用组件
media_api 多媒体组件
netProtocol_api 网络协议组件
peripheral_api 外设硬件组件

4.1.2 解决方案最基本的目录构成。

每个解决方案就是一个独立的项目,项目内包含部分如下所示,项目使用cmake构建自动编译部署。

wKgZPGf4rliAOzxRAAA9dkc3lIU682.png

具体介绍如下所示。

组成部分 描述
build.sh 编译脚本,用于管理生成可执行文件后的部署准备工作,用户可自定义shell命令
CMakeLists.txt 工程管理文件,用于组织整个工程结构,指导cmake生成Makefile
include 用于存放第三方应用库、头文件目录等
src 用于存放实现本方案需求的源代码
  • 增加已编译的第三方库,在include、libs目录内添加头文件和库文件;
  • 增加用户自定义的功能模块,推荐在src目录内增加;

具体情况如下所示,第三方模块相关的文件由include/3rd_model/xxx.h、libs/3rd_model/xxx.a。自定义的功能模块为src/mySrcCode、src/mySrcCode2。

wKgZO2f4rliANDgHAACw_pKlLn0295.png

4.2 CMakeLists.txt文件解析

4.2.1 编译环境配置部分:

第一部分为配置部分,配置部分如下所示。(获取当前方案目录、配置工具链、提取方案名称):

wKgZPGf4rliAToTcAADeMMzfUZ0829.png

配置信息如下所示。

配置项 描述
CMake要求版本 cmake_minimum_required函数指定,要求的最低版本
CMAKE_SYSTEM_NAME cmake的系统类型,交叉编译必须
CMAKE_CROSSCOMPILING cmake是否启动交叉编译
cross.camke camke_host_system_information获取平台信息,发现不是armv7l就导入当前平台的交叉编译配置。
project项目名 由project函数指定

4.2.2 easyeai-api配置部分

第二部分是引入我司的功能组件库(针对当前方案进行:配置EASY EAI API头文件目录、库文件目录以及配置库链接参数):

wKgZO2f4rliAOblHAAFFQnX-bm4043.png

配置信息如下所示。

配置项 描述
api_inc 最终通过target_include_directories函数指定目标包含的头文件路径
link_directories 由link_directories函数指定easyeai-api库所在路径
LINK_LIBRARIES 由LINK_LIBRARIES函数指定easyeai-api库文件

4.2.3 第三方库配置部分

第三部分配置第三方的库(针对当前方案进行:配置第三方头文件目录、库文件目录、配置第三方库链接参数以及配置源码目录):

wKgZPGf4rlmAeXKEAAB6xpk7-lg655.png

配置信息如下所示。

配置项 描述
custom_inc 自定义变量custom_inc,最终通过target_include_directories函数指定目标包含的头文件路径,在源码include目录下
link_directories 由link_directories函数指定第三方库所在路径
custom_libs 自定义变量custom_libs,最终通过target_link_libraries函数指定目标引用的库链接参数
aux_source_directory 自定义变量dir_srcs,用于添加工程代码以及自定义的个人代码

例如添加个人库的目录组成方式如下所示。

wKgZO2f4rlmADJBOAABsbmNVjYc782.png

aux_source_directory的修改方式为:

aux_source_directory(./src ./src/mySrcCode ./src/mySrcCode2 dir_srcs)

aux_source_directory(./src dir_srcs)
aux_source_directory(./src/mySrcCode dir_srcs)
aux_source_directory(./src/mySrcCode2 dir_srcs)

4.2.4 本方案配置部分

第四部分配置项目的编译信息,内容如下所示:

wKgZPGf4rlmAfS5qAABI5Ws3lFs022.png

配置项如下所示。

配置项 描述
add_executable 编译结果为${CURRENT_FOLDER}指定,即方案目录名;
编译的源文件为${dir_srcs}指定;
target_include_directories 指定头文件的名字,由${api_inc}与${custom_inc}指定;
target_link_libraries 指定额外的库,例如opencv的库等

4.3 build.sh编译脚本:

4.3.1 路径定位部分

第一部分用于提取目录用于编译操作,内容如下所示:(进入build.sh脚本所在目录,并且提取当前目录绝对路径,提取当前目录名称)

wKgZO2f4rlmAcmqgAAArNYW9H20734.png

4.3.2 清除编译部分

第二部分清除操作,清除目录为build、Release,内容如下所示:(执行build.sh脚本时,带入了参数“clear”,则清空编译输出)

wKgZPGf4rlmAHwzEAAAcOc9PK-E293.png

4.3.3 编译操作

第三部分,编译直接调用cmake,内容如下所示:(重新编译,成部署目录,并把资源自动部署进板卡)

wKgZO2f4rlqAA5qyAAAeTKcD4SU886.pngwKgZPGf4rlqAEmr5AAB-F6XTQqQ328.png



审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4801

    浏览量

    98519
  • 开发板
    +关注

    关注

    26

    文章

    6411

    浏览量

    120686
  • 图像分类
    +关注

    关注

    0

    文章

    97

    浏览量

    12528
  • rv1126
    +关注

    关注

    0

    文章

    118

    浏览量

    4435
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【飞凌嵌入式RV1126B开发板试用体验】初识飞凌嵌入式RV1126B开发板

    这几天刚收到飞凌嵌入式RV1126B开发板,带大家先认识一下这块开发板,收到的开发板如下图。 开发板有主板和核心板组成,
    发表于 04-13 17:27

    【飞凌嵌入式RV1126B开发板试用体验】+ 1. 开发环境搭建

    : https://forlinx-book.yuque.com/rh74yu/ok1126b。 图1 OK1126B开发板实物 图2 RV1126B处理器功能图 2
    发表于 03-16 15:34

    【飞凌嵌入式RV1126B开发板】+两款开发板之比较

    目前两款常见的RV1126B开发板,一款是灵眸科技推出的EASY EAI Nano-TB(RV1126B)开发套件,另一款就是飞凌嵌入式RV1126
    发表于 03-05 23:32

    ElfBoard新品发布|【RV1126B】ELF-RV1126B开发板正式发布

    ELF-RV1126B开发板基于瑞芯微RV1126B处理器设计,集成四核ARMCortex-A53架构,主频达1.6GHz,并内置3TOPS@INT8算力的NPU,支持INT8/INT16混合精度
    的头像 发表于 01-16 16:59 3252次阅读
    ElfBoard新品发布|【<b class='flag-5'>RV1126</b>B】ELF-<b class='flag-5'>RV1126</b>B<b class='flag-5'>开发板</b>正式发布

    飞凌嵌入式旗下教育品牌推出RV1126B\RK3506B\RK3576新品开发板

    、学生、科研人员还是个人学习者,这次发布的新品绝对值得一看!ELF-RV1126B开发板——边缘AI视觉芯ELF-RV1126B开发板搭载瑞
    的头像 发表于 01-09 10:09 1716次阅读
    飞凌嵌入式旗下教育品牌推出<b class='flag-5'>RV1126</b>B\RK3506B\RK3576新品<b class='flag-5'>开发板</b>

    替代升级实锤!实测RV1126B,CPU性能吊打RV1126

    RV1126B核心板已上市并稳定量产供应实测开始,设备使用触觉智能RV1126核心板与RV1126B核心板各自配套的开发板进行对比。RV1126
    的头像 发表于 12-11 17:13 2521次阅读
    替代升级实锤!实测<b class='flag-5'>RV1126</b>B,CPU性能吊打<b class='flag-5'>RV1126</b>

    【EASY EAI Nano-TB(RV1126B)开发板试用】+初识篇

    EASY EAI Nano-TB(RV1126B)开发套件是灵眸科技研发的一款应用于AIoTl领域的核心板,并配有十分丰富的外设资源,以此为基础便于快速进入学习开发角色。 EASY
    发表于 10-25 22:06

    告别 RV1126,迎来更强选择!RV1126B 加量不加价,重塑 AI 硬件新标杆

    在科技飞速迭代的当下,嵌入式 AI 硬件领域的产品更新速度始终保持着高频节奏。曾经凭借稳定性能在市场中占据一席之地的 RV1126,如今正式迎来产品生命周期的新阶段 —— 停产。这一消息传出时,不少
    的头像 发表于 10-22 17:48 1369次阅读

    瑞芯微RV1126B特性概述

    RV1126B是瑞芯微Rockchip在2025年第二季度全新推出的Arm架构AI视觉芯片,搭载4核Cortex-A53与自研3Tops算力NPU。全面替代上一代的RV1126,为智能安防、工业视觉
    的头像 发表于 10-09 11:22 2166次阅读
    瑞芯微<b class='flag-5'>RV1126</b>B特性概述

    音诺恒YNH-363 RV1126人脸识别主板规格书

    音诺恒RV1126人脸识别主板规格书
    发表于 09-20 11:15 0次下载

    RV1126系列选型指南:从RV1126RV1126B,一文看懂升级差异

    2025年7月,瑞芯微正式发布新一代AI视觉芯片RV1126B。作为其金牌方案商,EASYEAI灵眸科技同步推出搭载该芯片的AIoT核心板EAI1126B-Core-T。相较于前代RV1126
    的头像 发表于 09-04 10:50 5115次阅读
    <b class='flag-5'>RV1126</b>系列选型指南:从<b class='flag-5'>RV1126</b>到<b class='flag-5'>RV1126</b>B,一文看懂升级差异

    基于RV1109/RV1126的直播推流方案

    基于RV1109/RV1126 的直播推流方案 新龙鹏科技有限公司    关键特性 1)输入输出接口支持MIPI/BT1120/LVDS输入,MIPI/LVDS输出   2)网络接口支持千兆网口
    的头像 发表于 09-01 12:25 907次阅读
    基于<b class='flag-5'>RV</b>1109/<b class='flag-5'>RV1126</b>的直播推流<b class='flag-5'>方案</b>

    瑞芯微RV1126&RV1109替换RV1126B-P说明_V1.0

    瑞芯微RV1126&RV1109替换RV1126B-P说明_V1.0目前RV1109/1126已停产可提供新版本样品与技术支持
    发表于 08-11 12:02 2次下载

    瑞芯微RV1126B全新AI视觉芯片已正式量产!3T算力赋能多场景智能终端

    、机器人、智能车载等AIoT领域提供高效能解决方案,触觉智能作为瑞芯微方案商,将在不久后发布RK1126B核心板及开发板,大家敬请期待!下面就由触觉智能为大家从几
    的头像 发表于 07-11 18:36 2741次阅读
    瑞芯微<b class='flag-5'>RV1126</b>B全新AI视觉芯片已正式量产!3T算力赋能多场景智能终端

    在友晶DE1-SOC开发板实现Chirikov标准映射求解器

    该项目是在友晶DE1-SOC开发板实现Chirikov标准映射的求解器,并将其应用于图像加密和解密的概念验证。
    的头像 发表于 07-07 15:22 2003次阅读
    在友晶DE1-SOC<b class='flag-5'>开发板实现</b>Chirikov标准映射求解器