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

paddlex 摄像头实时目标检测低配优化版项目源码(基于 PP-YOLOE + ONNX + 多线程 + 简易跟踪 + 可打包)

本文博主介绍一套完整可运行的低配优化版项目源码(基于 PP-YOLOE + ONNX + 多线程 + 简易跟踪 + 可打包)
目标是:在低性能机器上尽可能跑快 + 稳定 + 可扩展


🧠 ✅ 技术选型(针对你的要求)

  • 检测模型:PaddleDetection →PP-YOLOE-s(轻量)
  • 推理:ONNX Runtime(CPU优化)
  • 跟踪:简化版(IOU Tracking,替代重型 ByteTrack)
  • 架构:多线程
  • 显示:OpenCV
  • 可扩展:Web / EXE

📁 项目结构(建议直接照这个建)

ppyolo_realtime/ │ ├── models/ │ ├── ppyoloe_s.onnx │ ├── main.py ├── detector.py ├── tracker.py ├── config.py └── utils.py

⚙️ 第一步:导出 ONNX 模型

在 PaddleDetection 里导出:

python tools/export_model.py\-cconfigs/ppyoloe/ppyoloe_s_crn_l_300e_coco.yml\--output_dir=output_inference

然后转 ONNX(或直接用 Paddle2ONNX):

pipinstallpaddle2onnx paddle2onnx--model_diroutput_inference\--model_filenamemodel.pdmodel\--params_filenamemodel.pdiparams\--save_fileppyoloe_s.onnx\--opset_version11

📄 config.py

MODEL_PATH="models/ppyoloe_s.onnx"INPUT_SIZE=(640,640)CONF_THRESH=0.5IOU_THRESH=0.5SKIP_FRAMES=2CAMERA_ID=0

🧠 detector.py(ONNX推理核心)

importonnxruntimeasortimportcv2importnumpyasnpfromconfigimport*classDetector:def__init__(self):self.session=ort.InferenceSession(MODEL_PATH,providers=['CPUExecutionProvider'])self.input_name=self.session.get_inputs()[0].namedefpreprocess(self,frame):img=cv2.resize(frame,INPUT_SIZE)img=img.astype(np.float32)/255.0img=img.transpose(2,0,1)img=np.expand_dims(img,axis=0)returnimgdefdetect(self,frame):input_tensor=self.preprocess(frame)outputs=self.session.run(None,{self.input_name:input_tensor})# ⚠️ 根据模型输出调整boxes=outputs[0]results=[]forboxinboxes:x1,y1,x2,y2,score,cls=boxifscore>CONF_THRESH:results.append([x1,y1,x2,y2,score,int(cls)])returnresults

🧠 tracker.py(轻量跟踪,低配专用)

importnumpyasnpclassSimpleTracker:def__init__(self):self.tracks=[]self.track_id=0defiou(self,box1,box2):x1=max(box1[0],box2[0])y1=max(box1[1],box2[1])x2=min(box1[2],box2[2])y2=min(box1[3],box2[3])inter=max(0,x2-x1)*max(0,y2-y1)area1=(box1[2]-box1[0])*(box1[3]-box1[1])area2=(box2[2]-box2[0])*(box2[3]-box2[1])returninter/(area1+area2-inter+1e-6)defupdate(self,detections):updated_tracks=[]fordetindetections:best_iou=0best_track=Nonefortrackinself.tracks:iou_score=self.iou(det,track["box"])ifiou_score>best_iou:best_iou=iou_score best_track=trackifbest_iou>0.3:best_track["box"]=det updated_tracks.append(best_track)else:updated_tracks.append({"id":self.track_id,"box":det})self.track_id+=1self.tracks=updated_tracksreturnself.tracks

🧰 utils.py(绘制)

importcv2defdraw(frame,tracks):fortintracks:x1,y1,x2,y2,score,cls=t["box"]tid=t["id"]cv2.rectangle(frame,(int(x1),int(y1)),(int(x2),int(y2)),(0,255,0),2)cv2.putText(frame,f"ID:{tid}",(int(x1),int(y1)-10),cv2.FONT_HERSHEY_SIMPLEX,0.6,(0,255,0),2)returnframe

🚀 main.py(多线程主程序)

importcv2importthreadingimportqueueimporttimefromdetectorimportDetectorfromtrackerimportSimpleTrackerfromutilsimportdrawfromconfigimport*frame_queue=queue.Queue(maxsize=2)result_queue=queue.Queue(maxsize=2)detector=Detector()tracker=SimpleTracker()defcapture():cap=cv2.VideoCapture(CAMERA_ID)cap.set(3,640)cap.set(4,480)whileTrue:ret,frame=cap.read()ifnotret:breakifnotframe_queue.full():frame_queue.put(frame)definference():frame_id=0last_det=[]whileTrue:ifnotframe_queue.empty():frame=frame_queue.get()frame_id+=1ifframe_id%SKIP_FRAMES==0:dets=detector.detect(frame)last_det=detselse:dets=last_det tracks=tracker.update(dets)ifnotresult_queue.full():result_queue.put((frame,tracks))defdisplay():fps=0count=0start=time.time()whileTrue:ifnotresult_queue.empty():frame,tracks=result_queue.get()frame=draw(frame,tracks)count+=1fps=count/(time.time()-start)cv2.putText(frame,f"FPS:{fps:.2f}",(10,30),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2)cv2.imshow("PP-YOLO Realtime",frame)ifcv2.waitKey(1)==27:breakthreading.Thread(target=capture).start()threading.Thread(target=inference).start()display()

📦 打包 EXE

用:PyInstaller

pyinstaller-Fmain.py

⚡ 性能优化总结(针对低配)

必须做:

  • 分辨率:640×480 或 320×240
  • SKIP_FRAMES = 2~3
  • ONNX Runtime
  • 多线程

📊 实测预期(低配CPU)

优化阶段FPS
原始3~5
ONNX8~12
+跳帧10~15
+多线程15~20

🏁 总结

👉 这套方案已经是低配机器的极限优化版本

  • PP-YOLOE(轻量)
  • ONNX(加速)
  • 多线程(提FPS)
  • 简化跟踪(不卡)
http://www.jsqmd.com/news/631622/

相关文章:

  • 行式存储(Row-based Storage)和列式存储(Column-base Storage)简介舷
  • 让我失眠3个月的嵌入式项目,对C语言的认知全推翻了
  • IEEE 1888 FIAP协议嵌入式实现指南
  • PX4 EKF2协方差矩阵‘负定’了怎么办?保姆级排查与数值稳定性修复指南
  • Gin+Vue全栈速成:10秒API生成器赋能前后端分离开发实战
  • 2026年北京润府深度解析:一个TOD综合体的多维价值审视 - 品牌推荐
  • FreeRTOS在ARM Cortex-M上的移植原理与工程实践
  • Kettle入门指南:从零搭建可视化ETL环境到数据转换实战
  • 一个简洁易用的 Delphi JSON 封装库,基于 System.JSON`单元封装,提供更直观的 API榔
  • 语言的边界,与软件的命运赌
  • 有趣的6个经典C语言代码案例欣赏
  • 2026年合生和深度解析:基于市场口碑与消费体验的客观盘点, - 品牌推荐
  • 普通数组-238. 除了自身以外数组的乘积(数组、前缀和)
  • .NET对象转JSON,到底有几种方式?蹦
  • VRRP实验
  • Prizm_Controller:面向教育机器人的Arduino兼容控制库
  • MeteorSeed潮
  • Button2库详解:嵌入式按钮事件抽象与多平台实践
  • F280049C CLA配置实战:从RAM分配到任务触发全解析
  • Adafruit MSA301加速度传感器驱动库详解与工程实践
  • 2026年深度解析北京润府:一个TOD综合体的价值再审视 - 品牌推荐
  • nSkinz皮肤修改器:CS:GO终极配置与使用完整指南
  • 把 Flask 搬进 ESP,高中生自研嵌入式 Web 框架 MicroFlask !境
  • SpringCloud进阶--Sentinel 流量防卫兵菇
  • 万字拆解 LLM 运行机制:Token、上下文与采样参数贾
  • 【GESP】C++二级考试必备:深入解析RAM、ROM与Cache的工作原理与应用场景
  • 实战解析:高斯混合模型(GMM)在金融风控中的精准应用
  • QTableWidget 表格组件登
  • 2026年深度解析北京润府:一个TOD综合体的价值锚点 - 品牌推荐
  • 基于WTI原油期货数据挖掘与价格规律