当前位置: 首页 > article >正文

RK3576/RK3588 Yolo11 目标检测 Demo

前言以前的大作业根据rknn_model_zoo和easy eai示例代码修改缝合仅供参考后来我试着模块化一些方便看但因为核心代码都是直接用的示例代码所以有些模块还是耦合compositor和display,有些模块干脆没有发挥实际作用decode有以下功能支持 UVC、MIPI、RTSP、MP4 四种输入UVC 采用 jpeg_turbo 解码RTSP 使用 gstreamer、mpp 硬解RGA 预处理模型权重复用每路可自定义多线程处理NPU推理自动绑定NPU核心RGA 拼接多路显示墙但性能很烂也完全没有考虑零拷贝6路1080p的RTSP流在RK3588上只有10帧此项目地址rk3588_yolo11_detection设备开发板rk3576/rk3588RTSP模拟器EasyRTSPServer网络摄像头海康威视效果四路1920x1080输入左边两路为UVC输入右边两路为RTSP输入,yolov11sTodork3576下RGA调用可能有越界写目前需要开辟更大的缓冲区防止报错非零拷贝qt5重写显示UI单路单线程优化介绍整体代码分为app、core、modules三部分。app整体控制逻辑core串联模块的核心组件modules主要模块appsrc/app/app_controller.cc是整体控制逻辑利用nlohmann库解析config.json配置文件为每一路配置运行环境启动对应线程src/app/app_controller.ccstd::string build_source_window_name(const std::string window_title, const SourceConfig source_cfg)配置单路运行环境主要是为多线程推理的线程池bool run_single_source(SourceRuntime *runtime)单路运行逻辑bool run_single_source(SourceRuntime *runtime)接受单路配置信息运行此路。SourceBase::Read - DecodeNode - FramePipeline(多线程 infer workerssrc/core/pool/infer_worker.cc) - DisplayNode// 每一路的帧处理流// SourceBase::Read - DecodeNode - FramePipeline(多线程 infer workerssrc/core/pool/infer_worker.cc) - DisplayNodewhile(source_ok!stop_requested()){if(runtime-cfg.fps0.0){constautonowstd::chrono::steady_clock::now();if(nownext_frame_time){// 如果没到的时间就sleep不获取最新帧用于限制最大帧率std::this_thread::sleep_until(next_frame_time);}next_frame_timestd::chrono::steady_clock::now()frame_interval;}// SourceBase::Readcore::types::SourceFrame input_frame;if(!runtime-source-Read(input_frame)){capture_fail_streak;// RTSP 失败概率高constintread_fail_threshold(runtime-cfg.typeINPUT_RTSP)?kRtspReadFailThreshold:1;if(capture_fail_streakread_fail_threshold){LOGW(source read failed (%d/%d before reconnect): %s\n,capture_fail_streak,read_fail_threshold,runtime-cfg.input.c_str());continue;}capture_fail_streak0;LOGE(source frame capture failed: %s\n,runtime-cfg.input.c_str());if(!reconnect_source(runtime,runtime-cfg.input,capture failed)){source_okfalse;keep_error_windowtrue;std::string msgSource reconnect failed\n;msgruntime-cfg.input;show_source_error(runtime,msg);break;}next_frame_timestd::chrono::steady_clock::now()frame_interval;continue;}capture_fail_streak0;// DecodeNodecv::Mat decoded;if(!decode_node.Decode(input_frame,decoded)||decoded.empty()){LOGE(decode failed: %s\n,runtime-cfg.input.c_str());if(!reconnect_source(runtime,runtime-cfg.input,decode failed)){source_okfalse;keep_error_windowtrue;std::string msgSource decode/reconnect failed\n;msgruntime-cfg.input;show_source_error(runtime,msg);break;}continue;}got_frametrue;// 得到至少一个有效帧用于验证此路是否初始化成功constcv::Mat*use_framedecoded;// 更新帧的实际尺寸if(metrics.input_width0metrics.input_height0){metrics.input_widthuse_frame-cols;metrics.input_heightuse_frame-rows;}// 多线程功能生产者-多消费者多生产者-单消费者// 每一路的主线程不断将帧放入生产队列workerpool中worker从队列中取出一帧进行处理随后将处理后的帧放到就绪队列// worker内部逻辑见src/core/pool/infer_worker.cc// 入队前先做容量控制限制队列深度以控制时延和内存。pipeline.WaitForCapacity();pipeline.EnqueueFrame(*use_frame,input_frame.capture_tp);// DisplayNodeFrameResult ready;if(pipeline.PopReady(ready))// 弹出就绪帧{if(handle_ready_frame(runtime,ready,fps_tracker,metrics))// 显示break;}}每一帧在Decode时均在此路的主线程通过 FramePipeline 队列分发给多个infer worker每个worker 执行预处理、推理、后处理随后将帧翻入Result队列core串联模块的核心组件帧队列、线程池和模块间共享数据结构定义还有一些日志工具src/core/log 利用spdlog库实现的日志功能src/core/pipeline多线消费者使用的帧队列src/core/pool线程池和worker内部逻辑自动绑定NPU核心src/core/pool/infer_worker.cc 每一个worker内部逻辑if(task.do_infer){// 标准流程预处理 - NPU 推理 - 后处理框解码与叠加绘制。modules::preprocess::PreprocessOutput preprocess_out;if(preprocess_node.Run(res.frame,worker-ctx,preprocess_out)){core::types::InferOutput infer_out;if(infer_node.Run(worker-ctx,preprocess_out.input_image,infer_out)){modules::postprocess::PostprocessOutput post_out;if(postprocess_node.Run(worker-ctx,infer_out,preprocess_out.letterbox,worker-conf_threshold,res.frame,post_out)){res.infer_msinfer_out.infer_ms;res.detectionspost_out.detection_count;}}}}{// 把处理完成的帧写回结果队列后续由 ResultQueue 做有序合并。std::lock_guardstd::mutexlk(results-mtx);results-items.push_back(std::move(res));}results-cv.notify_one();src/core/queue 队列src/core/types共享数据结构src/core/utils工具modules每个模块source输入源接口src/modules/source/source_base.h阻塞usb_cam_source.ccv4l2支持YUYV和MJPEGmipi_source.cc与USB类似支持YUYV和NV12rtsp_source.ccRTSPh264easy eai示例代码file_source.ccMP4视频文件namespacemodules{namespacesource{usingSourceFramecore::types::SourceFrame;usingSourceFrameFormatcore::types::SourceFrameFormat;classSourceBase{public:virtual~SourceBase()default;virtualboolOpen()0;virtualvoidClose()0;virtualboolRead(SourceFrame*out)0;};}// namespace source}// namespace modulesmGstChn.vDecgst_element_factory_make(mppvideodec,vDec);mGstChn.vScalegst_element_factory_make(videoscale,vScale);mGstChn.vCapsfiltergst_element_factory_make(capsfilter,vCapsfilter);mGstChn.vSinkgst_element_factory_make(appsink,vSink);decode解码但目前更多承担颜色格式转换功能RTSP的解码还是在source下UVC的解码在此处MJPEGboolDecodeMjpeg(constcore::types::SourceFrameinput,cv::Mat*out){if(input.data.empty())returnfalse;if(!tj_handle_){tj_handle_tjInitDecompress();if(!tj_handle_){LOGE(tjInitDecompress failed\n);returnfalse;}}intwidth0;intheight0;intsubsamp0;intcolorspace0;if(tjDecompressHeader3(tj_handle_,input.data.data(),static_castunsignedlong(input.data.size()),width,height,subsamp,colorspace)!0){LOGE(turbojpeg header decode failed: %s\n,tjGetErrorStr2(tj_handle_));returnfalse;}if(width0||height0)returnfalse;out-create(height,width,CV_8UC3);constintpitchwidth*3;if(tjDecompress2(tj_handle_,input.data.data(),static_castunsignedlong(input.data.size()),out-data,width,pitch,height,TJPF_BGR,0)!0){LOGE(turbojpeg decode failed: %s\n,tjGetErrorStr2(tj_handle_));out-release();returnfalse;}returntrue;}preprocess预处理rk示例代码使用RGA的imfill、improcessret_rgaimprocess(rga_buf_src,rga_buf_dst,pat,srect,drect,prect,usage);inference推理其中src/modules/inference/infer_context.cc用于共享权重rk示例代码intinit_infer_context(constchar*model_path,rknn_app_context_t*app_ctx){if(!model_path||!app_ctx)return-1;app_ctx-shared_handlenullptr;app_ctx-rknn_ctx0;app_ctx-input_attrsnullptr;app_ctx-output_attrsnullptr;app_ctx-is_quantfalse;{std::lock_guardstd::mutexlk(g_shared_model_mtx);if(g_shared_model.share_enabledensure_shared_model(model_path,g_shared_model)0){rknn_context ctx0;constintretrknn_dup_context(g_shared_model.base_ctx,ctx);if(retRKNN_SUCC){app_ctx-rknn_ctxctx;fill_app_ctx_from_info(app_ctx,g_shared_model.info);app_ctx-shared_handleg_shared_model;g_shared_model.ref_count;LOGI(reuse model weights: %s (shared contexts%d)\n,model_path,g_shared_model.ref_count);return0;}LOGW(rknn_dup_context failed (ret%d), fallback to per-context init\n,ret);g_shared_model.share_enabledfalse;if(g_shared_model.ref_count0){reset_shared_model(g_shared_model);}}}returninit_context_standalone(model_path,app_ctx);}intrun_forward(rknn_app_context_t*app_ctx,image_buffer_t*preprocessed_img,std::vectorrknn_output*outputs){if(!app_ctx||!preprocessed_img||!outputs){return-1;}rknn_input inputs[app_ctx-io_num.n_input];memset(inputs,0,sizeof(inputs));inputs[0].index0;inputs[0].typeRKNN_TENSOR_UINT8;inputs[0].fmtRKNN_TENSOR_NHWC;inputs[0].sizeapp_ctx-model_width*app_ctx-model_height*app_ctx-model_channel;inputs[0].bufpreprocessed_img-virt_addr;intretrknn_inputs_set(app_ctx-rknn_ctx,app_ctx-io_num.n_input,inputs);if(ret0){LOGE(rknn_input_set fail! ret%d\n,ret);return-1;}retrknn_run(app_ctx-rknn_ctx,nullptr);if(ret0){LOGE(rknn_run fail! ret%d\n,ret);return-1;}outputs-assign(app_ctx-io_num.n_output,rknn_output{});for(inti0;iapp_ctx-io_num.n_output;i){(*outputs)[i].indexi;(*outputs)[i].want_float(!app_ctx-is_quant);}retrknn_outputs_get(app_ctx-rknn_ctx,app_ctx-io_num.n_output,outputs-data(),NULL);if(ret0){LOGE(rknn_outputs_get fail! ret%d\n,ret);outputs-clear();return-1;}return0;}}// namespacepostprocess后处理使用CPUrk示例代码compositor多路显示墙RGA拼接图像easy eai示例代码staticvoidcommitImgtoDispBufMap(intchnId,void*pSrcData,RgaSURF_FORMAT srcFmt,intsrcWidth,intsrcHeight,intsrcHStride,intsrcVStride){if(gChnNums0){return;}intchnNumsgChnNums;intwinWidthgWinWidth;intwinHeightgWinHeight;if(gMutexInited){pthread_mutex_lock(gmutex);chnNumsgChnNums;winWidthgWinWidth;winHeightgWinHeight;pthread_mutex_unlock(gmutex);}if(chnNums0||winWidth0||winHeight0){return;}intunits0;while(1){units;if(chnNums(units*units)){break;}}Image srcImage;Image dstImage;memset(srcImage,0,sizeof(srcImage));memset(dstImage,0,sizeof(dstImage));srcImage.fmtsrcFmt;srcImage.widthsrcWidth;srcImage.heightsrcHeight;srcImage.hor_stridesrcHStride;srcImage.ver_stridesrcVStride;srcImage.rotationHAL_TRANSFORM_ROT_0;srcImage.pBufpSrcData;PTRINT dstBufPtr(PTRINT)*gppDispMapcalcBufMapOffset(chnId,units,winWidth,winHeight);dstImage.fmtRK_FORMAT_RGB_888;dstImage.widthwinWidth/units;dstImage.heightwinHeight/units;dstImage.hor_stridewinWidth;dstImage.ver_stridewinHeight/units;dstImage.rotationHAL_TRANSFORM_ROT_0;dstImage.pBuf(void*)dstBufPtr;srcImg_ConvertTo_dstImg(dstImage,srcImage);}display显示GTKeasy eai示例代码GridCompositorImgDesc_t img_desc{};img_desc.chnIdchannel_id;img_desc.widthsrc.cols;img_desc.heightsrc.rows;img_desc.horStridestatic_castint(src.step/src.elemSize());img_desc.verStridesrc.rows;img_desc.dataSizestatic_castint(src.total()*src.elemSize());strncpy(img_desc.fmt,BGR,sizeof(img_desc.fmt)-1);grid_compositor_submit_frame(reinterpret_castchar*(src.data),img_desc);{GtkWallStatestateWallState();std::lock_guardstd::mutexlk(state.mutex);if(displayIsRunning()){state.display_seen_runningtrue;}if(state.display_seen_running!displayIsRunning()){returntrue;}}

相关文章:

RK3576/RK3588 Yolo11 目标检测 Demo

前言 以前的大作业,根据rknn_model_zoo和easy eai示例代码修改(缝合),仅供参考 后来我试着模块化一些,方便看,但因为核心代码都是直接用的示例代码,所以有些模块还是耦合(composit…...

文件夹色彩标记系统:Folcolor效能倍增指南

文件夹色彩标记系统:Folcolor效能倍增指南 【免费下载链接】Folcolor Windows explorer folder coloring utility 项目地址: https://gitcode.com/gh_mirrors/fo/Folcolor 在信息爆炸的数字化时代,Windows用户每天面对成百上千个黄色文件夹&#…...

Pandoc:5步掌握全能文档转换的极简工作流

Pandoc:5步掌握全能文档转换的极简工作流 【免费下载链接】pandoc Universal markup converter 项目地址: https://gitcode.com/gh_mirrors/pa/pandoc 价值定位:为什么每个开发者都需要一款"格式翻译官" 当你需要将Markdown笔记转换为…...

PFC颗粒流代码模拟岩石预制裂隙与完整岩石单轴压缩对比分析

PFC颗粒流代码 pfc离散元岩石预制裂隙,裂隙岩石与完整岩石单轴压缩代码,可出各种裂隙形式,可分析应力应变曲线图,裂隙发育与数量,能量变化,简易声发射分析等做岩石单轴压缩离散元模拟的,谁没为…...

AI的“血管”:从大模型需求看6G、高速光纤与智算中心网络的技术变革

大模型训练与推理的爆发,正以前所未有的力度重塑通信网络基础设施。6G、高速光纤、智算中心网络,正成为AI基础设施的“血管”,承载着算力的血液,决定智能的极限。当GPT-5.4的推理能力逼近人类专家,当Sora可以生成一分钟…...

2026 年直播电商如何进化?内容创作与管理的新模式是什么?

核心要点 问题: 为什么很多直播电商团队在 2025 年后明显感到"内容越来越多,但效果越来越不稳定"? 答案: 进入 2026 年,直播电商从"单场爆发"转向"内容体系竞争"。真正拉开差距的&#…...

算法基础篇(11)Floyd算法

Floyd算法本质是动态规划,用来求任意两点之间的最短路,也称为插点法。通过不断在两点之间加入新的点来更新最短路。1、状态表示:f[k][i][j]表示:仅仅经过1~k这些点,结点i走到结点j的最短路径的长度。2、状态转移方程&a…...

SAP资产主数据批量修改避坑大全:GGB1替代+AR31工作清单配置详解(含日期字段特殊处理)

SAP资产主数据批量修改实战指南:从GGB1替代到AR31工作清单全流程解析 当财务团队需要对上千条资产记录进行成本中心迁移时,手工修改不仅效率低下,还容易产生数据不一致。SAP系统提供的GGB1替代规则与AR31工作清单组合方案,正是解决…...

别再ping IP了!手把手教你给ZeroTier虚拟网络里的设备起个‘好记’的名字(DNS/mDNS实战)

告别IP记忆困扰:ZeroTier网络中的智能命名方案实战指南 每次在ZeroTier虚拟网络中访问设备时,你是否也厌倦了反复查看和输入那串冗长的IP地址?想象一下,当你想连接家庭NAS时,只需输入nas.home就能立即访问&#xff0c…...

Spring Boot 3.2项目实战:5分钟搞定Tomcat虚拟线程配置,让你的接口吞吐量翻倍

Spring Boot 3.2虚拟线程实战:Tomcat配置优化与性能飞跃指南 当你的电商大促接口突然面临每秒上万请求,或者文件上传服务在高并发下响应缓慢时,传统线程池往往成为性能瓶颈。Spring Boot 3.2与Java 21的虚拟线程组合,正在重新定义…...

UG模型转STP后总出问题?可能是STEP 203和214版本没选对

UG模型转STP格式的深度选择指南:STEP 203与214版本差异解析 在工业设计领域,UG NX与STP格式的转换堪称日常操作,但许多工程师都曾遭遇这样的困境:明明转换过程一切顺利,接收方打开文件时却出现面片丢失、PMI信息异常甚…...

光储充系统实战笔记:当光伏遇到充电桩的硬核玩法

光储充交直流三相并网/离网系统 基于Matlab三相光伏储能充电桩(光储充一体化) 关键词:光伏大功率 储能 充电桩 LLC 电池 并网PQ控制 SPWM 恒压/恒流充电 提供两个仿真可对比看效果,如图一,二。 点击“加好友”可先看…...

AutoGen多智能体框架:从协作价值到企业级实践指南

AutoGen多智能体框架:从协作价值到企业级实践指南 【免费下载链接】autogen 启用下一代大型语言模型应用 项目地址: https://gitcode.com/GitHub_Trending/au/autogen 在人工智能快速发展的今天,如何让AI系统像人类团队一样高效协作完成复杂任务&…...

汽车电子测试人的 Prompt 工程

专栏:《AI 汽车电子测试实战》第 17 篇 作者:一线汽车电子测试工程师 适合人群:所有使用 AI 的测试工程师、想提升 AI 使用效率的测试人员开篇:为什么需要学 Prompt? 这是我上个月在某车企的 AI 培训项目中的真实经历。…...

信捷XD/XL系列PLC与C#通信实战:Modbus-RTU协议详解(附完整代码)

信捷XD/XL系列PLC与C#深度通信指南:从Modbus-RTU协议到工业级代码实现 在工业自动化领域,PLC与上位机的稳定通信是系统集成的核心环节。信捷XD/XL系列PLC凭借其出色的性价比和丰富的功能接口,已成为中小型自动化项目的热门选择。而C#作为.NET…...

Mplus实战:如何用随机截距交叉滞后模型(RI-CLPM)分析心理学纵向数据?

Mplus实战:随机截距交叉滞后模型(RI-CLPM)在心理学纵向研究中的深度应用 心理学研究中,我们常常需要探索变量间的动态相互作用——比如焦虑和睡眠问题如何相互影响?传统交叉滞后模型(CLPM)虽然广…...

OpenClaw环境隔离方案:ollama-QwQ-32B镜像与本地Python虚拟环境整合

OpenClaw环境隔离方案:ollama-QwQ-32B镜像与本地Python虚拟环境整合 1. 为什么需要环境隔离 上周我在尝试将OpenClaw接入本地部署的ollama-QwQ-32B模型时,遇到了一个棘手的问题:我的开发环境突然崩溃了。事后排查发现,是OpenCla…...

终极指南:如何使用LeetDown轻松降级A6/A7苹果设备系统

终极指南:如何使用LeetDown轻松降级A6/A7苹果设备系统 【免费下载链接】LeetDown a GUI macOS Downgrade Tool for A6 and A7 iDevices 项目地址: https://gitcode.com/gh_mirrors/le/LeetDown LeetDown是一款专为macOS设计的图形化降级工具,能够…...

5分钟快速上手:Rufus打造专业级USB启动盘的终极指南

5分钟快速上手:Rufus打造专业级USB启动盘的终极指南 【免费下载链接】rufus The Reliable USB Formatting Utility 项目地址: https://gitcode.com/GitHub_Trending/ru/rufus 还在为系统安装、数据恢复或系统维护而烦恼吗?Rufus(可靠U…...

Charticulator:突破传统桎梏的自定义数据可视化革新——从模板依赖到自由创作

Charticulator:突破传统桎梏的自定义数据可视化革新——从模板依赖到自由创作 【免费下载链接】charticulator Interactive Layout-Aware Construction of Bespoke Charts 项目地址: https://gitcode.com/gh_mirrors/ch/charticulator 数据可视化工具是否常常…...

uniapp定位踩坑记:腾讯地图误差1km?高德地图精准配置全攻略

Uniapp定位精度优化实战:从腾讯地图1km误差到高德厘米级精准配置 最近在开发一款外卖配送类应用时,我被定位精度问题折磨得够呛。原本以为接入腾讯地图SDK就能轻松搞定,结果实测发现定位偏差经常达到800米以上——这对于需要精确到楼栋的外卖…...

3步掌握PAGExporter:After Effects动画高效导出完整指南

3步掌握PAGExporter:After Effects动画高效导出完整指南 【免费下载链接】libpag The official rendering library for PAG (Portable Animated Graphics) files that renders After Effects animations natively across multiple platforms. 项目地址: https://g…...

Realtek RTL8125 2.5GbE网卡驱动技术指南

Realtek RTL8125 2.5GbE网卡驱动技术指南 【免费下载链接】realtek-r8125-dkms A DKMS package for easy use of Realtek r8125 driver, which supports 2.5 GbE. 项目地址: https://gitcode.com/gh_mirrors/re/realtek-r8125-dkms 1. 问题诊断:网络设备识别…...

光纤布拉格光栅(FBG)笔记【2】:传感机制与布拉格波长调谐分析

1. 光纤布拉格光栅的传感机制揭秘 第一次接触光纤布拉格光栅(FBG)传感时,我完全被它"以光测万物"的能力震撼了。这根比头发还细的光纤,竟然能精准感知温度、应变等物理量的变化。经过多次实验验证,我发现它的核心秘密就藏在布拉格波…...

OpenClaw 超级 AI 实战专栏【补充内容】AI开发实操:减少Token用量、提升模型效率的8个核心技巧(附代码)

目录 一、核心前提:理解Token消耗的关键场景 二、6种优化方案(附案例+代码) 方案1:精简Prompt(最易落地,立竿见影) 核心思路 应用案例 代码实现 方案2:上下文窗口裁剪(避免历史信息冗余) 核心思路 应用案例 代码实现 方案3:输入文本摘要压缩(批量处理场景…...

SLAM Toolbox应用宝典:从技术原理到实战落地的全面指南

SLAM Toolbox应用宝典:从技术原理到实战落地的全面指南 【免费下载链接】slam_toolbox Slam Toolbox for lifelong mapping and localization in potentially massive maps with ROS 项目地址: https://gitcode.com/gh_mirrors/sl/slam_toolbox SLAM Toolbox…...

OpenClaw云端体验方案:Qwen3.5-9B镜像免安装调试技巧

OpenClaw云端体验方案:Qwen3.5-9B镜像免安装调试技巧 1. 为什么选择云端沙盒方案? 上周我尝试在本地笔记本部署OpenClaw时,遭遇了Python版本冲突、CUDA驱动不兼容等一系列问题。作为一个经常需要快速验证技术方案的开发者,这种环…...

通义千问3-Reranker-0.6B优化升级:调整批处理大小和自定义指令,性能再提升5%

通义千问3-Reranker-0.6B优化升级:调整批处理大小和自定义指令,性能再提升5% 1. 为什么需要优化重排序模型性能? 在信息检索和问答系统中,重排序模型扮演着至关重要的角色。它负责对初步检索得到的文档进行二次排序,…...

从YAML到PyTorch模型:拆解Ultralytics YOLO V8/V11中`parse_model`函数的完整工作流

从YAML到PyTorch模型:拆解Ultralytics YOLO V8/V11中parse_model函数的完整工作流 在计算机视觉领域,YOLO系列模型因其卓越的实时检测性能而广受开发者青睐。Ultralytics团队推出的YOLO V8/V11版本不仅延续了这一优势,更通过精心设计的配置文…...

基于MATLAB的平移线扫激光三维重建完整方案与代码实现

现整理了一套完整的,平移线扫重建 matlab代码和方案,包含相机标定、光平面标定与方案、移动装置标定与方案、激光线条中心线自适应提取、畸变矫正、三维重建、点云滤波等部分,代码按模块编写,注释完整,附带一份完整苹果…...