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

高通跃龙QCS9100平台上工业缺陷检测实战(1): 从摄像头到端侧推理的最小闭环

前言本系列将聚焦高通跃龙QCS9100平台实施工业缺陷检测。本文第一篇我们在该QCS9100平台将缺陷检测链路完整跑通。你跑完这篇应该能看到两件非常具体的东西runs/里不断冒出带框的图片终端里能看到每次推理大概多少毫秒、FPS 大概多少本文先使用ONNXRuntimeCPU完成闭环目的是优先把“摄像头/预处理/后处理/可视化输出”链路固定下来在此基础上第二篇再切换到 QNN/HTP。1. 运行结果输入USB 摄像头一般是/dev/video0也可以换成本地图片/视频先自测输出runs/下持续生成带框图片控制台持续打印推理耗时ms和 FPS滑动窗口2. 环境准备2.1 硬件Thundercomm的基于高通跃龙QCS9100 平台 Linux OS的AI边缘盒子USB UVC 摄像头最省事MIPI 相机后续工程化再展开2.2 软件Python 3.10GStreamer用于验证相机与定位问题Python 包numpy、opencv-python-headless、onnxruntime查看基础信息确认工具与版本uname-apython3-Vgst-launch-1.0--version3. 摄像头验证确认摄像头节点ls-l/dev/video*无显示环境也能验证只看 fpsgst-launch-1.0 v4l2srcdevice/dev/video0!videoconvert!fpsdisplaysink video-sinkfakesink text-overlayfalsesyncfalse-v如果这一步不稳定掉帧/卡住/打不开请先排查驱动/权限/像素格式问题再继续后续推理步骤本文第 7 节提供了排查清单。4. 安装依赖Ubuntu/Debian 类系统示例sudoaptupdatesudoaptinstall-ypython3-pip python3-venvmkdir-p~/defect_democd~/defect_demo python3-mvenv venvsourcevenv/bin/activate pipinstall-Upip pipinstallnumpy opencv-python-headless onnxruntime5. 模型准备你最终肯定会用自训练的缺陷模型。但在这一步先用通用检测模型比如YOLO把流程跑通流程没跑通前模型对不对根本无从谈起。在 PC 上导出 ONNX示例pipinstallultralytics yoloexportmodelyolov8n.ptformatonnximgsz640opset12得到yolov8n.onnx后拷贝到设备端mkdir-p~/defect_demo/modelsscpyolov8n.onnxuserdevice-ip:/home/user/defect_demo/models/提示若你已自训练缺陷模型直接把文件命名为models/defect.onnx下文也同样适用。6. 推理与可视化在设备端创建infer_cam_onnx.py可直接复制粘贴运行importosimporttimefrompathlibimportPathimportcv2importnumpyasnpimportonnxruntimeasort MODEL_PATHmodels/yolov8n.onnx# 换成你的缺陷模型也可以DEVICE/dev/video0IMG_SIZE640CONF_THRES0.25IOU_THRES0.45SAVE_DIRPath(runs)SAVE_DIR.mkdir(parentsTrue,exist_okTrue)defletterbox(im,new_shape640,color(114,114,114)):h,wim.shape[:2]ifisinstance(new_shape,int):new_shape(new_shape,new_shape)rmin(new_shape[0]/h,new_shape[1]/w)nh,nwint(round(h*r)),int(round(w*r))im_resizedcv2.resize(im,(nw,nh),interpolationcv2.INTER_LINEAR)top(new_shape[0]-nh)//2bottomnew_shape[0]-nh-top left(new_shape[1]-nw)//2rightnew_shape[1]-nw-left im_paddedcv2.copyMakeBorder(im_resized,top,bottom,left,right,cv2.BORDER_CONSTANT,valuecolor)returnim_padded,r,(left,top)defxywh2xyxy(x):yx.copy()y[...,0]x[...,0]-x[...,2]/2y[...,1]x[...,1]-x[...,3]/2y[...,2]x[...,0]x[...,2]/2y[...,3]x[...,1]x[...,3]/2returnydefnms(boxes,scores,iou_thres):x1,y1,x2,y2boxes.T areas(x2-x1)*(y2-y1)orderscores.argsort()[::-1]keep[]whileorder.size0:iorder[0]keep.append(i)iforder.size1:breakxx1np.maximum(x1[i],x1[order[1:]])yy1np.maximum(y1[i],y1[order[1:]])xx2np.minimum(x2[i],x2[order[1:]])yy2np.minimum(y2[i],y2[order[1:]])wnp.maximum(0.0,xx2-xx1)hnp.maximum(0.0,yy2-yy1)interw*h iouinter/(areas[i]areas[order[1:]]-inter1e-9)indsnp.where(iouiou_thres)[0]orderorder[inds1]returnkeepdefpostprocess_yolov8(outputs,conf_thres0.25,iou_thres0.45): 常见 YOLOv8 ONNX 输出形态之一 outputs[0] shape: (1, 84, 8400) 或 (1, 8400, 84) 84 4(Box) num_cls outoutputs[0]outnp.squeeze(out,axis0)ifout.shape[0]out.shape[1]:outout.T boxesout[:,:4]cls_scoresout[:,4:]cls_confcls_scores.max(axis1)cls_idcls_scores.argmax(axis1)maskcls_confconf_thres boxes,cls_conf,cls_idboxes[mask],cls_conf[mask],cls_id[mask]ifboxes.shape[0]0:returnnp.empty((0,4)),np.empty((0,)),np.empty((0,),dtypenp.int32)boxesxywh2xyxy(boxes)keepnms(boxes,cls_conf,iou_thres)returnboxes[keep],cls_conf[keep],cls_id[keep].astype(np.int32)defmain():ifnotos.path.exists(MODEL_PATH):raiseFileNotFoundError(f模型不存在:{MODEL_PATH})sessort.InferenceSession(MODEL_PATH,providers[CPUExecutionProvider])in_namesess.get_inputs()[0].name capcv2.VideoCapture(DEVICE)ifnotcap.isOpened():raiseRuntimeError(f无法打开摄像头:{DEVICE}(检查权限/驱动/占用))frame_id0fps_win[]print(开始推理按 CtrlC 退出。输出保存到 runs/ 目录。)try:whileTrue:ok,framecap.read()ifnotok:print(读帧失败退出。)breakimg,r,(padw,padh)letterbox(frame,IMG_SIZE)rgbcv2.cvtColor(img,cv2.COLOR_BGR2RGB)inprgb.astype(np.float32)/255.0inpnp.transpose(inp,(2,0,1))[None,...]t1time.time()outputssess.run(None,{in_name:inp})boxes,scores,cls_idspostprocess_yolov8(outputs,CONF_THRES,IOU_THRES)t2time.time()# 映射回原图坐标ifboxes.shape[0]0:boxes[:,[0,2]]-padw boxes[:,[1,3]]-padh boxes/r boxes[:,[0,2]]np.clip(boxes[:,[0,2]],0,frame.shape[1]-1)boxes[:,[1,3]]np.clip(boxes[:,[1,3]],0,frame.shape[0]-1)visframe.copy()for(x1,y1,x2,y2),sc,cidinzip(boxes,scores,cls_ids):x1,y1,x2,y2map(int,[x1,y1,x2,y2])cv2.rectangle(vis,(x1,y1),(x2,y2),(0,255,0),2)cv2.putText(vis,fid{cid}{sc:.2f},(x1,max(0,y1-6)),cv2.FONT_HERSHEY_SIMPLEX,0.7,(0,255,0),2)infer_ms(t2-t1)*1000.0fps1.0/max(1e-6,(t2-t1))fps_win.append(fps)iflen(fps_win)30:fps_win.pop(0)cv2.putText(vis,fInfer{infer_ms:.1f}ms FPS~{np.mean(fps_win):.1f},(10,30),cv2.FONT_HERSHEY_SIMPLEX,0.9,(255,0,0),2)# 限制写盘频率避免 I/O 拖慢ifframe_id%200:out_pathSAVE_DIR/fframe_{frame_id:06d}.jpgcv2.imwrite(str(out_path),vis)print(fsave:{out_path}det{len(boxes)}fps~{np.mean(fps_win):.1f})frame_id1exceptKeyboardInterrupt:passfinally:cap.release()print(结束。)if__name____main__:main()运行cd~/defect_demosourcevenv/bin/activate python3 infer_cam_onnx.py7. 常见问题摄像头打不开先用第 3 节的gst-launch-1.0验证确认是否被占用、权限是否足够。能取流但推理很慢将写盘频率降到每 50 帧一张将输入尺寸改小320/416验证加速部分在二展开。输出框太多导致后处理慢提高CONF_THRES必要时先做 topK 再 NMS四会展开。下一篇介绍至此我们已经完成了高通QCS9100 上从摄像头取流、ONNX 模型推理、后处理到结果可视化的最小闭环。**下一篇**我们将切换到QNN/HTP真正发挥 NPU 的加速能力敬请期待版权声明本文为博主原创文章遵循 CC 4.0 BY-SA 版权协议转载请附上原文出处链接和本声明。

相关文章:

高通跃龙QCS9100平台上工业缺陷检测实战(1): 从摄像头到端侧推理的最小闭环

💡 前言 本系列将聚焦高通跃龙QCS9100平台实施工业缺陷检测。 本文第一篇我们在该QCS9100平台将缺陷检测链路完整跑通。 你跑完这篇,应该能看到两件非常具体的东西: runs/ 里不断冒出带框的图片终端里能看到每次推理大概多少毫秒、FPS 大概…...

论文党「反内耗」神器:Paperzz 把毕业论文初稿写成「开卷答题」,4 步搞定从 0 到成稿

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿paperzz - 毕业论文-AIGC论文检测-AI智能降重-ai智能写作https://www.paperzz.cc/dissertation 谁懂啊家人们!写毕业论文就像在玩「地狱级闯关游戏」:对着空白文档发呆半天写不出开头…...

2026 学术写作破局:Paperzz 如何用「四步闭环法」解决毕业论文初稿难产,让你 3 天写完合格初稿

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿paperzz - 毕业论文-AIGC论文检测-AI智能降重-ai智能写作https://www.paperzz.cc/dissertation 引言:被毕业论文初稿困住的年轻人,正在用一种更高效的方式毕业 2026 年,国…...

从选题到成稿零焦虑:Paperzz 毕业论文初稿写作,让学术创作告别 “卡壳式内耗”

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿paperzz - 毕业论文-AIGC论文检测-AI智能降重-ai智能写作https://www.paperzz.cc/dissertation 在毕业论文的漫长写作路上,你是否也陷入过这样的循环:对着空白文档发呆半天写不出开头…...

TMS320F2812光伏并网逆变器设计:高效MATLAB电路仿真与DSP代码实现结合方案,含...

TMS320F2812 光伏并网逆变器设计方案,附有相关的matlab电路文件,以及DSP的程序代码,方案、仿真文件、代码三者结合使用效果好,事半功倍。 备注:赠送逆变器并联环流matlab文件,基于矢量控制的环流抑制策略和下垂控制的环…...

鸿蒙中 应用的权限(一)

本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新 一、权限管控 什么是应用权限? 系统提供一种通用权限访问方式,允许应用访问系统资源(如通讯录)和系统能力&#xff…...

LabVIEW图像处理框架核心结构示意图

labview通用图像处理框架程序源码 详情见图做图像处理的朋友应该都经历过这种尴尬:写个Demo三分钟搞定,项目一复杂就变成意大利面条代码。今天分享的这套LabVIEW通用框架,核心就三句话——状态机打底、队列传数据、插件式开发。咱们直接扒开源…...

Pyrene-PEG-NH2 氨基功能化芘荧光PEG活细胞成像与示踪探针

芘丁酸酯聚乙二醇氨基(Pyrene-PEG-NH2)是一种结合了芘(Pyrene)、聚乙二醇(PEG)和氨基(NH2)的多功能化合物。【基本信息】中文名称:芘丁酸酯-聚乙二醇-氨基;芘…...

【智慧商城 | 项目笔记】第六天

前言:智慧商城项目是关于前端的Vue2的项目,本系列文章,我讲总结我从这个项目中学到的知识点,写项目笔记。如果你也在初学Vue或想巩固Vue相关的知识,希望这系列文章可以帮助到你。 【智慧商城 | 项目笔记】第六天今日完…...

高速多串激光泵浦二极管驱动电路:可扩展、高电流、高电压、多重安全保护电路架构参考

高速多串激光泵浦二极管驱动电路,可扩展, 连续电流可达25A,支持最高电压90V; 调制频率可达10kHz 多重安全保护电路; 可单独屏蔽故障电流串; 闭环控制,带电流输出; 电路架构是基于多年…...

西门子V15及以上版本通用模拟量处理程序块:1200与1500模拟量滤波程序及报警功能

西门子1200和1500通用模拟量处理程序块,模拟量滤波程序,程序块可方便直接调用,用于过滤峰值且可以方便调用模拟量高低报警。 博图版本V15及以上。工业现场模拟量信号处理总带着点玄学,尤其是车间里那些老设备,时不时给…...

【Python一周入门】学习笔记归纳(二)六大基本类型

文章目录数字(Number)字符串String列表List元组Tuple字典Dictionary集合Set推导式列表推导式字典推导式集合推导式元组推导式(生成器推导式)数字(Number) 数字类型是客观的不可变的,分为整型,浮点型&#…...

Linux(1)的基本使用

系统每次开机默认进入字符界面[rootnode11 ~]# systemctl set-default multi-user.target系统每次开机默认进入图形界面[rootnode11 ~]# systemctl set-default graphical.targetweb界面登录(很少用)[rootnode11 ~]# systemctl enable --now cockpit.soc…...

LatentMorph:将隐式潜空间推理融入图像生成

目录 一、前言 二、 LatentMorph 论文概述 核心问题 方法:LatentMorph 实验结果 核心贡献 三、四个组件是怎么运作的,输入输出是啥 四个组件详解 1. 视觉记忆凝结器 (Memory Condensers) 2. 强化学习驱动的推理调用器 (Reason Invoker) 3.…...

2000-2024年上市公司迪博内部控制指数评分及评级数据

迪博内部控制指数简介迪博内部控制指数(DIB内部控制指数)由深圳迪博企业风险管理技术有限公司发布,是国内权威的上市公司内部控制评价体系。该指数从内部控制五要素(控制环境、风险评估、控制活动、信息与沟通、内部监督&#xff…...

基于Matlab的不变矩算法实现数字验证码识别过程及其GUI界面构建

基于matlab不变矩算法实现数字验证码 过程:先对验证图像进行去噪、定位、归一化等预处理,然后计算待识别数字的不变矩,再进行特征匹配,得到识别结果。 以Matlab软件为开发平台来进行设计实现及仿真,并构建相应的GUI界面…...

M3U8 调试不用愁,这款在线播放工具帮你高效搞定

在音视频开发、流媒体运维的日常工作中,M3U8 格式的流验证与调试是高频需求,不管是验证直播流链路是否通畅,还是排查点播 M3U8 播放异常,都需要一款便捷的工具来支撑。而本地播放器配置繁琐、原生浏览器对 HLS 协议支持有限&#…...

一款轻量高效的 M3U8 在线播放工具,开发者调试必备

在音视频开发、流媒体测试的日常工作中,我们经常会遇到 M3U8 格式的视频流验证需求 —— 不管是检查直播流的可用性,还是调试点播链接的播放兼容性,都需要一个便捷的工具来快速验证。而原生 HTML5 的 video 标签对 HLS 协议支持有限&#xff…...

常见二进制漏洞原理及分析

本文将介绍常见二进制漏洞类型及避免方法。一.虚拟内存的布局Linux中进程使用虚拟内存,再由MMU转换成物理内存,其虚拟内存布局如下,其中堆区向高 地址生长,栈区向低地址生长,且代码段和rodata段为只读属性。栈区 …...

永磁同步电机伺服控制仿真:三环PI参数自整定Matlab模型探秘

永磁同步电机伺服控制仿真三环PI参数自整定 Matlab仿真模型 1.模型简介模型为永磁同步电机伺服控制仿真,采用 Matlab R2018a Simulink搭建。模型内主要包含DC直流电压源、三相逆变器、永磁同步电机、采样模块、SVPWM、Clark、Park、Ipark、位置环、速度环、电流环等…...

用 Copilot 一年后,我的代码质量变好了还是变差了?

01 从怀疑到离不开去年这个时候,GitHub Copilot 刚在我们小组里小范围开放试用。我当时的态度是不屑一顾的——一个 AI 能懂多少逻辑?代码补全不还是靠 IDE 的智能提示?况且我学了几年 Java,写过多少个项目,什么场景没…...

电网电压扰动下相光伏并网逆变器控制的Simulink仿真探索

电网电压扰动联系相光伏并网逆变器的控制 simukink仿真 电流闭环控制的逆变器并网 LCL 型输出滤波器 含有文档报告在光伏并网发电系统中,逆变器作为核心部件,其性能的优劣直接影响到电能质量和系统稳定性。而电网电压扰动是实际运行中不可避免的问题&am…...

内存涨价、供应不稳?嵌入式工程师必看:适合轻量级项目ARM选型与存储避坑指南

在嵌入式开发的圈子里,很多工程师都经历过这种“阵痛”: 原本用得好好的高性能单片机(MCU),随着项目需求的增加——要接个高分辨率屏、要做个复杂的协议转换、要跑个轻量级语音识别,或者要处理多路音频流—…...

高速追剪程序之定长追剪实战

高速追剪程序,定长追剪,威纶触摸屏汇川5u全套程序,注释清楚。最近搞了个高速追剪的项目,用的是威纶触摸屏搭配汇川5u的全套程序,今天来跟大家分享一下。 整体思路 高速追剪的核心目标就是在物料高速运动过程中&#xf…...

提示词工程:这样跟AI说话,它才听你的!

哈,提示词是什么?简单来说,提示词(Prompt) 就是你向人工智能(比如我)发出的指令或问题。它是你用来描述“希望AI干什么”的那段文字。AI会根据你提供的提示词,来生成相应的回答或内容…...

微电网二次控制:下垂控制与基于数据采样二次控制的奇妙融合

微电网二次控制,下垂控制,基于数据采样的二次控制,补偿了下垂控制的偏差,实现了有功均分,效果好在微电网的运行控制领域,下垂控制和基于数据采样的二次控制是两个关键的技术点,它们相互配合&…...

无人零售/五金厂必看!边缘设备Java+YOLOv11推理稳定性全攻略:崩溃率从15%降到0.1%,断点续检1秒恢复

今年帮深圳南山的无人零售创业公司和东莞长安的五金厂同时做了边缘设备Java+YOLOv11推理的稳定性升级——无人零售那边是100个瑞芯微RK3588货架盘点设备,之前的崩溃率15%/天,每天要重启3-5次,数据丢失10%+,断点续检难,每次重启要重新盘点所有10个货架(10分钟),效率低,…...

STM32串口双机模拟汽车电量里程项目:Protues仿真与源码解析

STM32单片机开发的串口双机模拟汽车电量里程项目,两个STM32单片机进行数据交互,模拟主控与驱动传感器发送数据,可以手动调节数据,并显示屏显示出来。 包括程序源码和protues仿真8.12版本。 程序源码注释详细。 非常适合开发人员&a…...

基于Matlab的螺丝轮廓识别:数字图像处理流程

基于matlab的螺丝轮廓识别,matlab数字图像处理。 对输入图像进行灰度化,滤波,平滑操作然后进行阈值化,分割成二值图像,之后对图像进行图像的形态学操作,最终使用边缘检测算法提取边缘,最终获得十…...

SpringBoot3实战集成mzt-biz-log,一行代码搞定业务日志记录

作为后端开发者,业务日志是线上问题排查、操作追溯和审计留痕的核心抓手。手写业务日志不仅重复代码量大,还容易出现记录不规范、关键信息漏记错记的问题,排查线上问题时往往效率极低。最近我在SpringBoot3项目中接入了mzt-biz-log这款轻量业…...