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

带图形界面的Python行人检测工具,支持实时视频分析与多线程加速

本文还有配套的精品资源,点击获取

简介:直接运行run.py就能启动带中文界面的行人检测程序,支持上传本地图片(images/目录下的1.jpg、2.jpg、3.jpg)或MP4视频(5b4552a28231b.mp4)进行识别。底层调用OpenCV,可切换YOLO或HOG+SVM两种检测模型,代码结构清晰,位于src/detect目录。GUI模块包含按钮交互、背景图(bg.jpg)、应用图标(icon.jpg)和中文字体(SimHei.ttf),确保界面显示正常。检测过程使用独立线程(threads/目录)处理,避免主界面卡顿,提升响应流畅度。配套requirements.txt列出全部依赖库,说明书.doc详细说明环境安装步骤、运行方式及常见问题排查方法。整个工具包无需复杂配置,适合刚接触目标检测的学习者快速验证效果,也方便开发者替换模型或拓展功能。

1. 项目概述:为什么这个行人检测工具值得你花十分钟装一次

我做计算机视觉落地项目快八年了,从最早用OpenCV手写HOG特征+滑动窗口,到后来搭YOLOv3训练服务器,再到如今带GUI的轻量级推理工具——说实话,90%的初学者卡在第一步:跑不起来。不是模型精度不够,是环境配半天、中文乱码、界面一加载就假死、视频卡成PPT……最后连“人在哪里”都看不到,更别说调参优化了。这个工具包,就是我去年帮三个高校实验室学生快速验证算法时,顺手攒出来的“防崩溃版本”。

它不是学术论文里的SOTA模型,也不是工业级部署系统,而是一个能让你三分钟看到结果、五分钟理解流程、十分钟改出自己版本的“可触摸”起点。核心关键词——行人检测、Python GUI、多线程视频分析、YOLO检测、HOG+SVM——每一个都不是摆设:
- “行人检测”意味着所有预处理、NMS后处理、坐标映射逻辑都已封装好,你传一张图进去,返回的就是带框+置信度的numpy数组;
- “Python GUI”不是tkinter凑数,而是PyQt5实现的完整窗口,按钮响应、状态栏更新、进度条反馈、中文字体渲染(SimHei.ttf)全部开箱即用;
- “多线程视频分析”不是简单用threading.Thread包一层,而是主UI线程与检测线程完全解耦,检测线程内部还做了帧缓冲队列和FPS限流,实测1080p视频在i5-8250U上稳定22fps不掉帧;
- “YOLO检测”默认集成YOLOv5s(ONNX格式),体积仅14MB,无需GPU也能跑,同时保留模型替换接口,换上你自己训的YOLOv8n.onnx,改两行路径就能切过去;
- “HOG+SVM”则是留给没显卡、没算力、甚至想搞嵌入式移植的同学的保底方案——纯CPU推理,单帧耗时<350ms(i5-8250U),准确率虽不如YOLO,但对穿深色衣服、背影、侧身等YOLO易漏检场景反而更鲁棒。

它适合谁?如果你是刚学完《OpenCV编程入门》第7章、对着detectMultiScale()发懵的学生;如果你是产品经理想快速给客户演示“我们真能识别人”;如果你是嵌入式工程师需要把检测逻辑移植到树莓派上——这个包就是你的第一块垫脚石。它不教你反向传播,但会告诉你:为什么HOG的cell size设为8×8、为什么YOLO的conf_thres不能低于0.4、为什么GUI里必须用QTimer而不是while True循环刷新画面。接下来,我会带你一层层拆开这个“黑盒子”,不是照着说明书点下一步,而是看清每一颗螺丝怎么拧、每根线怎么接。

2. 整体架构设计与技术选型逻辑

2.1 为什么放弃Flask/Django做Web界面,而坚持用PyQt5?

很多人第一反应是:“做个网页前端不更通用?”——我试过。去年给某安防公司做POC时,用Flask+OpenCV+Vue搭了个实时检测页面,结果客户现场演示时,浏览器卡顿、WebSocket断连、中文路径上传失败……折腾两小时没搞定。根本原因在于:视频流实时性要求与Web架构存在天然矛盾。HTTP协议本身无状态、短连接,传输视频帧需反复建立连接;浏览器JS处理图像需转Canvas再转Blob,内存拷贝三次;更别说跨域、HTTPS证书、移动端适配这些额外坑。

PyQt5则完全不同:它直接调用系统图形API(Windows用GDI+/Direct2D,macOS用CoreGraphics,Linux用X11/OpenGL),图像渲染走GPU加速路径;QPixmap加载BGR格式numpy数组只需QImage(...).rgbSwapped()一次转换;视频播放用QMediaPlayer底层调用FFmpeg,帧同步精度达毫秒级。更重要的是——它把“线程安全”刻进了基因里。PyQt的信号槽机制天然支持跨线程通信:检测线程计算完结果,emit一个detection_result_signal(bbox_list, fps),UI线程connect后直接更新画面,全程无锁、无竞态、无内存泄漏风险。这比自己手写threading.Event+queue.Queue可靠十倍。

当然,PyQt5也有代价:打包成exe后体积大(PyInstaller打包约120MB)、启动稍慢(首次加载Qt库约1.2秒)。但权衡下来,对初学者而言,“能稳定跑通”远比“包体小10MB”重要。而且我们做了针对性优化:requirements.txt里指定PyQt5==5.15.2(非最新版),避开6.x的ABI兼容问题;run.py启动时预加载QApplication,避免多次实例化;GUI模块里所有资源(bg.jpg/icon.jpg/SimHei.ttf)均用QResource编译进qrc文件,彻底规避路径错误。

2.2 检测引擎双模设计:YOLO与HOG+SVM不是并列选项,而是分层策略

代码里src/detect目录下有yolo_detector.py和hog_svm_detector.py两个文件,很多人以为只是“换模型”,其实背后是完整的检测策略分层

  • YOLO层(默认启用):负责高精度、高召回的主检测。我们采用YOLOv5s.onnx(非PyTorch原生模型),原因很实在:ONNX Runtime在CPU上推理速度比torch.jit.script快1.8倍(实测数据),且跨平台兼容性极佳(Windows/macOS/Linux全支持)。输入尺寸固定为640×640,这是平衡精度与速度的黄金点——小于640×640时小目标漏检率飙升(如1米外行人),大于则CPU推理超时(i5-8250U上720×720耗时翻倍)。后处理用ONNX Runtime自带的non_max_suppression,IOU阈值设为0.45(非官方推荐的0.6),因为行人密集场景下0.6会导致相邻框被过度抑制。

  • HOG+SVM层(备用启用):不是YOLO的降级替代,而是特定场景的增强补丁。当YOLO检测置信度均低于0.3,或连续3帧未检出目标时,自动触发HOG检测。HOG参数经实测校准:winSize=(64,128),blockSize=(16,16),blockStride=(8,8),cellSize=(8,8),nbins=9——这个组合在INRIA行人数据集上达到89.2%检测率(vs YOLOv5s的92.7%),但优势在于:对光照变化不敏感(阴天/逆光下仍稳定)、对遮挡鲁棒(半身/背影识别率高37%)、内存占用极低(单帧特征向量仅1764维,vs YOLO输入张量3686400维)。SVM分类器用sklearn.svm.SVC(kernel=’linear’)训练,模型文件hog_svm_model.pkl仅2.3MB,加载耗时<50ms。

提示:双模切换逻辑在src/detect/detector_manager.py中实现,核心是self.fallback_counter计数器。这不是简单“YOLO失败就切HOG”,而是基于统计置信度分布动态决策——比如当前帧YOLO返回5个框,平均置信度0.28,则触发HOG;若返回1个框置信度0.92,则跳过HOG。这种设计让系统在复杂场景下既保持精度,又不失可靠性。

2.3 多线程架构:为什么不用asyncio,而坚持传统线程?

threads目录下有video_thread.py、image_thread.py、gui_update_thread.py三个文件,有人问:“Python不是推荐用asyncio做并发吗?”——这是典型的概念混淆。asyncio解决的是I/O密集型任务(如网络请求、数据库读写)的并发,而视频帧解码、图像缩放、模型推理全是CPU密集型计算。asyncio的event loop无法真正并行执行这些任务,反而因协程切换增加开销。

我们采用经典的生产者-消费者线程模型:
-主线程(GUI线程):只做三件事——响应按钮点击、显示画面、更新状态栏。绝不碰OpenCV或模型推理;
-检测线程(Worker Thread):独立运行,持有模型实例和OpenCV VideoCapture对象。关键设计是帧缓冲队列(queue.Queue(maxsize=3)):当UI线程推送新帧时,若队列已满则丢弃旧帧(避免积压导致延迟),确保永远处理最新画面;
-渲染线程(可选):对高分辨率视频(如4K),额外启一个线程专门做resize+color convert,减轻检测线程负担。

线程间通信通过PyQt信号完成,例如video_thread.py中:

class VideoThread(QThread): frame_ready = pyqtSignal(np.ndarray) # 发送原始帧 detection_result = pyqtSignal(list, float) # 发送检测结果+FPS

GUI线程connect后:

self.video_thread.detection_result.connect(self.update_detection_display)

这种设计彻底规避了threading.Lock的复杂性,也杜绝了QObject: Cannot create children for a parent that is in a different thread这类经典Qt报错。

3. 核心细节解析与实操要点

3.1 GUI模块深度拆解:如何让中文不乱码、图标不丢失、背景图不拉伸

gui/main_window.py是整个界面的灵魂,但新手常栽在三个“看不见”的坑里:字体、资源路径、图像缩放。我们逐个击破:

中文字体(SimHei.ttf)加载逻辑
PyQt5默认不支持中文,即使系统装了微软雅黑,QLabel显示仍是方框。解决方案不是简单setFont(),而是全局字体注册

from PyQt5.QtGui import QFontDatabase font_id = QFontDatabase.addApplicationFont("resources/SimHei.ttf") if font_id < 0: print("Warning: SimHei.ttf load failed!") else: font_families = QFontDatabase.applicationFontFamilies(font_id) app_font = QFont(font_families[0], 10) QApplication.setFont(app_font)

关键点在于addApplicationFont()必须在QApplication实例化之后、任何窗口创建之前调用,否则无效。resources/目录是qrc资源文件编译后的虚拟路径,实际打包时所有资源已嵌入exe,不存在路径问题。

应用图标(icon.jpg)正确显示方法
很多教程教setWindowIcon(QIcon("icon.jpg")),但在高DPI屏幕(如Mac Retina、Windows 4K屏)上图标会模糊。正确做法是提供多分辨率图标并启用高DPI适配:

app = QApplication(sys.argv) app.setAttribute(Qt.AA_EnableHighDpiScaling) # 启用高DPI app.setWindowIcon(QIcon(":/icons/app_icon.png")) # 从qrc资源加载

qrc文件中定义:

<qresource prefix="/icons"> <file alias="app_icon.png">resources/icon_16.png</file> <file alias="app_icon@2x.png">resources/icon_32.png</file> </qresource>

这样Qt会自动根据屏幕DPI选择16px或32px图标。

背景图(bg.jpg)自适应填充
直接setStyleSheet("background-image: url(bg.jpg);")会导致图片拉伸变形。正确方案是重写paintEvent:

def paintEvent(self, event): painter = QPainter(self) pixmap = QPixmap(":/images/bg.jpg") scaled_pixmap = pixmap.scaled(self.size(), Qt.KeepAspectRatioByExpanding, Qt.SmoothTransformation) painter.drawPixmap(self.rect(), scaled_pixmap)

Qt.KeepAspectRatioByExpanding确保背景图始终覆盖整个窗口,多余部分被裁剪,且保持原始宽高比。实测1920×1080背景图在1366×768笔记本上显示完美无白边。

3.2 检测模型替换指南:从YOLOv5s到YOLOv8n,只需改3处

src/detect/yolo_detector.py是模型替换的核心入口。以YOLOv8n.onnx为例,替换步骤如下:

第一步:修改模型路径与输入尺寸
原代码:

self.model_path = "models/yolov5s.onnx" self.input_size = (640, 640)

改为:

self.model_path = "models/yolov8n.onnx" # 放入models/目录 self.input_size = (640, 640) # YOLOv8n同样支持640输入

第二步:调整预处理逻辑(关键!)
YOLOv5默认输入归一化到[0,1],YOLOv8n需归一化到[0,255]。原预处理:

img = cv2.resize(img, self.input_size) img = img.astype(np.float32) / 255.0 # 归一化 img = np.transpose(img, (2, 0, 1)) # HWC→CHW

YOLOv8n需改为:

img = cv2.resize(img, self.input_size) # 移除 /255.0 归一化!YOLOv8n expects uint8 input img = np.transpose(img, (2, 0, 1)) img = np.expand_dims(img, axis=0) # 添加batch维度

第三步:修正后处理输出解析
YOLOv5输出是(N,6)数组(x1,y1,x2,y2,conf,cls),YOLOv8n输出是(1,84,8400)张量(需reshape+sigmoid)。在postprocess()函数中:

# 原YOLOv5解析 boxes = output[:, :4] scores = output[:, 4] classes = output[:, 5] # YOLOv8n解析(需先reshape) output = output.reshape(1, 84, -1) # [1, 84, 8400] scores = output[0, 4:, :] # 取置信度部分 boxes = output[0, :4, :] # 取坐标部分 # 后续NMS逻辑不变

注意:YOLOv8n的ONNX模型需用ultralytics导出时加--opset 12参数,否则PyQt5环境可能报错。我们测试过v8.0.200版本,导出命令为:
yolo export model=yolov8n.pt format=onnx opset=12 dynamic=False

3.3 多线程视频分析的性能调优:如何把1080p视频帧率从12fps提到22fps

threads/video_thread.py中的性能瓶颈不在模型,而在OpenCV帧读取与色彩空间转换。实测发现:cap.read()耗时占整帧处理的63%,其中cv2.cvtColor()(BGR→RGB)占31%。优化方案如下:

帧读取优化
禁用OpenCV自动缓冲,强制单帧读取:

cap = cv2.VideoCapture(video_path) cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) # 关键!减少缓冲区

色彩转换绕过
PyQt5的QImage支持BGR格式直接加载(无需转RGB):

# 原低效写法(两次转换) rgb_frame = cv2.cvtColor(bgr_frame, cv2.COLOR_BGR2RGB) qimg = QImage(rgb_frame.data, w, h, w*3, QImage.Format_RGB888) # 高效写法(零拷贝) qimg = QImage(bgr_frame.data, w, h, w*3, QImage.Format_BGR888)

注意:QImage.Format_BGR888需Qt5.13+支持,requirements.txt已锁定版本。

FPS动态限流
避免检测线程过载拖垮UI,加入自适应限流:

target_fps = 25 frame_interval = 1.0 / target_fps last_process_time = time.time() while self.running: ret, frame = self.cap.read() if not ret: break current_time = time.time() if current_time - last_process_time < frame_interval: time.sleep(frame_interval - (current_time - last_process_time)) continue last_process_time = time.time() # 执行检测...

此逻辑让线程主动等待,而非疯狂轮询,CPU占用率从98%降至42%。

4. 实操过程与核心环节实现

4.1 环境配置全流程:requirements.txt背后的深意

requirements.txt不是简单罗列库名,每个依赖都有其不可替代性:

PyQt5==5.15.2 opencv-python==4.8.1.78 onnxruntime==1.16.3 numpy==1.24.4 scikit-learn==1.3.2 Pillow==10.0.1
  • PyQt5==5.15.2:避开6.x版本的API断裂(如QDialog.exec_()已废弃),且5.15.2是最后一个支持Python 3.7-3.11全版本的稳定版;
  • opencv-python==4.8.1.78:此版本修复了Windows下VideoCapture读取MP4的codec bug(早期4.5.x版本对H.264编码视频偶发卡死);
  • onnxruntime==1.16.3:专为CPU优化的推理引擎,比torchvision快2.1倍,且支持AVX2指令集加速(i5-8250U默认启用);
  • numpy==1.24.4:与onnxruntime 1.16.3 ABI兼容,更高版本会导致ImportError: DLL load failed
  • scikit-learn==1.3.2:HOG+SVM必需,1.3.x版本修复了SVM在多线程下的随机种子bug;
  • Pillow==10.0.1:用于GUI中图标缩放,10.x版本支持WebP格式,未来可扩展图标格式。

安装命令必须用:

pip install -r requirements.txt --find-links https://download.pytorch.org/whl/torch_stable.html --no-cache-dir

--find-links确保onnxruntime从官方源安装(避免conda-forge源的版本冲突),--no-cache-dir防止pip缓存损坏导致安装失败。

4.2 一键启动(run.py)的隐藏逻辑

run.py表面只有一行from gui.main_window import MainWindow,实则暗藏玄机:

import sys import os # 强制设置工作目录为run.py所在目录(解决资源路径问题) os.chdir(os.path.dirname(os.path.abspath(__file__))) # 解决PyInstaller打包后资源路径异常 if getattr(sys, 'frozen', False): # 运行时路径 base_path = sys._MEIPASS else: # 开发时路径 base_path = os.path.abspath(".") # 将base_path注入环境变量,供gui模块读取 os.environ['APP_BASE_PATH'] = base_path from gui.main_window import MainWindow

这段代码确保:
- 无论你是python run.py开发运行,还是pyinstaller run.py打包成exe,bg.jpgicon.jpgSimHei.ttf都能被正确定位;
-sys._MEIPASS是PyInstaller打包后自动创建的临时目录,所有资源解压至此,os.environ['APP_BASE_PATH']让gui模块通过os.getenv('APP_BASE_PATH')安全访问。

4.3 图片/视频检测全流程实录

以检测images/1.jpg为例,完整流程如下(附关键耗时):

  1. GUI线程:点击“选择图片”按钮 → 弹出QFileDialog → 用户选中1.jpg(耗时≈0ms,纯UI操作);
  2. GUI线程:读取文件路径 → 创建ImageThread实例 → 调用start()启动线程(耗时≈2ms);
  3. ImageThread线程
    -cv2.imread("images/1.jpg")→ 加载BGR图像(耗时≈8ms,1920×1080 JPEG);
    -cv2.resize(..., (640,640))→ 缩放(耗时≈15ms);
    -detector.detect()→ YOLOv5s.onnx推理(耗时≈142ms,i5-8250U CPU);
    -cv2.putText()绘制结果 → 在原图叠加文字框(耗时≈3ms);
  4. GUI线程:接收detection_result信号 →QPixmap.fromImage()转换 →QLabel.setPixmap()显示(耗时≈5ms);
  5. 最终显示:带红框的行人图,右下角显示“检测到3人,FPS: ∞(静态图)”,状态栏提示“图片检测完成”。

视频检测同理,但增加帧循环:
-VideoThread每33ms(30fps)读取一帧 → 推理 → emit结果 → UI更新;
- 若推理耗时>33ms(如YOLOv5s在1080p上约45ms),则自动跳过该帧(由frame_interval限流逻辑保证);
- 实测5b4552a28231b.mp4(1280×720,30fps)在i5-8250U上平均22.3fps,最高24fps。

4.4 中文显示与交互细节打磨

GUI中所有文本均通过QLabel.setText()设置,但中文显示正常只是基础,我们还做了三处体验优化:

动态字体大小适配
窗口缩放时,字体不能固定10号。在resizeEvent()中:

def resizeEvent(self, event): super().resizeEvent(event) new_font_size = max(9, min(14, int(self.width() / 120))) # 宽度越大字体越大 self.status_label.setFont(QFont("SimHei", new_font_size))

按钮悬停特效
用QSS实现平滑过渡:

self.detect_btn.setStyleSheet(""" QPushButton { background-color: #4CAF50; color: white; border: none; padding: 8px 16px; border-radius: 4px; font-size: 11px; } QPushButton:hover { background-color: #45a049; transform: scale(1.02); } """)

transform: scale(1.02)让按钮悬停时轻微放大,提升点击欲。

错误提示人性化
当用户选错视频格式(如.avi未安装codec),不弹出cv2.error原始报错,而是:

try: cap = cv2.VideoCapture(path) if not cap.isOpened(): raise ValueError("视频格式不支持,请使用MP4/H.264编码") except Exception as e: QMessageBox.critical(self, "错误", f"视频加载失败:{str(e)}\n提示:请确认文件是否损坏,或尝试用格式工厂转为MP4")

提示语直指解决方案,而非抛出技术术语。

5. 常见问题与排查技巧实录

5.1 典型问题速查表

问题现象根本原因解决方案验证方式
界面中文显示为方框SimHei.ttf未正确加载或字体未全局设置检查run.py中QFontDatabase.addApplicationFont()调用位置;确认SimHei.ttf在resources/目录下在QLabel中手动setText(“测试中文”),看是否显示正常
点击“开始检测”后界面假死检测逻辑未放入独立线程,阻塞了GUI主线程检查video_thread.py是否继承QThread;确认self.detector.detect()是否在run()方法内调用用任务管理器观察CPU占用,假死时CPU应<5%
视频检测FPS只有5-8帧OpenCV缓冲区过大或未启用硬件加速设置cap.set(cv2.CAP_PROP_BUFFERSIZE, 1);升级opencv-python到4.8.1.78+cap.get(cv2.CAP_PROP_BUFFERSIZE)确认返回值为1
YOLO检测框位置偏移输入图像尺寸与模型期望尺寸不匹配检查yolo_detector.py中self.input_size是否为(640,640);确认resize时未用cv2.INTER_AREA插值(应使用cv2.INTER_LINEAR用已知尺寸标定板图像测试,测量框坐标误差
HOG+SVM检测完全无结果SVM模型文件路径错误或特征提取参数不匹配检查hog_svm_detector.py中model_path路径;确认cv2.HOGDescriptor()参数与训练时完全一致单独运行hog_svm_detector.py的test函数,打印特征向量维度

5.2 我踩过的五个坑及独家避坑技巧

坑1:PyInstaller打包后图标丢失
现象:exe双击运行,窗口左上角显示默认空白图标。
原因:PyInstaller默认不打包资源文件,setWindowIcon(QIcon("icon.jpg"))路径失效。
避坑技巧:必须用qrc资源系统。创建resources.qrc文件:

<!DOCTYPE RCC><RCC version="1.0"> <qresource prefix="/"> <file>resources/icon.jpg</file> <file>resources/bg.jpg</file> <file>resources/SimHei.ttf</file> </qresource> </RCC>

然后pyside2-rcc resources.qrc -o resources_rc.py(PyQt5用pyrcc5),在main_window.py中import resources_rc。打包命令加--add-data "resources;resources"参数。

坑2:多线程下OpenCV VideoCapture崩溃
现象:视频检测运行2分钟后,程序闪退,报错cv2.error: OpenCV(4.8.1) ... error: (-215:Assertion failed) _src.empty() in function 'cv::cvtColor'
原因:VideoCapture对象不能跨线程共享,cap.read()在子线程调用时,主线程可能已释放cap。
避坑技巧:VideoCapture必须在子线程run()方法内创建,而非构造函数中:

class VideoThread(QThread): def __init__(self, video_path): super().__init__() self.video_path = video_path # 只存路径,不存cap对象 def run(self): self.cap = cv2.VideoCapture(self.video_path) # 在run内创建 while self.running: ret, frame = self.cap.read() # ...

坑3:YOLO ONNX模型在某些CPU上报错“Unsupported operator”
现象:导入onnxruntime时报InvalidGraph: This is an invalid model. Error in Node:... : Unsupported operator
原因:模型导出时用了高级OP(如NonMaxSuppression),而onnxruntime CPU版不支持。
避坑技巧:导出YOLO模型时禁用NMS,后处理在Python中完成:

# ultralytics导出命令 yolo export model=yolov5s.pt format=onnx opset=12 dynamic=False nms=False

然后在yolo_detector.py中用cv2.dnn.NMSBoxes()替代。

坑4:高DPI屏幕下界面元素挤压变形
现象:4K屏幕上,按钮变小、文字模糊、布局错位。
原因:Qt未启用高DPI适配。
避坑技巧:在run.py最顶部添加:

import os os.environ["QT_SCALE_FACTOR"] = "1.5" # 根据屏幕DPI调整,1.5对应150% # 或更推荐: os.environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1"

坑5:HOG检测在深色背景上漏检严重
现象:穿黑衣行人几乎不被识别。
原因:HOG特征对亮度敏感,深色区域梯度弱。
避坑技巧:在hog_svm_detector.py中加入CLAHE(对比度受限自适应直方图均衡化):

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) enhanced = clahe.apply(gray) # 再提取HOG特征

实测漏检率下降52%。

6. 二次开发与功能拓展指南

6.1 快速接入自己的YOLO模型

假设你已训练好my_yolo.pt,只需四步:

  1. 导出ONNX模型
    bash yolo export model=my_yolo.pt format=onnx opset=12 dynamic=False nms=False
    将生成的my_yolo.onnx放入models/目录。

  2. 复制detector模板
    cp src/detect/yolo_detector.py src/detect/my_yolo_detector.py

  3. 修改my_yolo_detector.py
    - 第12行:self.model_path = "models/my_yolo.onnx"
    - 第35行:self.input_size = (640, 640)(按你训练尺寸调整)
    - 第68行:self.class_names = ["person"](按你数据集类别修改)

  4. 在detector_manager.py中注册
    python from src.detect.my_yolo_detector import MyYOLODetector # 在get_detector()方法中添加: elif detector_type == "my_yolo": return MyYOLODetector()

然后GUI中即可通过self.detector_manager.switch_detector("my_yolo")切换。

6.2 添加摄像头实时检测功能

只需新增threads/camera_thread.py

class CameraThread(QThread): frame_ready = pyqtSignal(np.ndarray) def __init__(self, camera_id=0): super().__init__() self.camera_id = camera_id self.running = False def run(self): self.cap = cv2.VideoCapture(self.camera_id) self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) self.running = True while self.running: ret, frame = self.cap.read() if ret: self.frame_ready.emit(frame) self.cap.release()

在main_window.py中:

self.camera_thread = CameraThread() self.camera_thread.frame_ready.connect(self.process_camera_frame) self.start_camera_btn.clicked.connect(self.camera_thread.start)

6.3 导出检测结果为CSV报表

src/utils/export_utils.py中添加:

import csv from datetime import datetime def export_to_csv(detections, video_path, output_path): """detections: [(frame_id, x1, y1, x2, y2, conf, cls), ...]""" with open(output_path, 'w', newline='') as f: writer = csv.writer(f) writer.writerow(['FrameID', 'X1', 'Y1', 'X2', 'Y2', 'Confidence', 'Class', 'Timestamp']) for det in detections: writer.writerow([*det, datetime.now().strftime("%Y-%m-%d %H:%M:%S")])

在GUI中添加“导出报表”按钮,调用此函数即可。

我在实际项目中用这套框架,两周内帮客户完成了商场客流统计系统原型——从零开始,到交付带热力图、时段统计、异常滞留报警的完整Demo。工具的价值不在于它多炫酷,而在于它让你把时间花在解决问题上,而不是调试环境上。现在,你可以打开终端,敲下python run.py,看着第一个行人框跳出来——那一刻,你就已经站在了计算机视觉的大门口。门后是什么?取决于你想往哪走。

本文还有配套的精品资源,点击获取

简介:直接运行run.py就能启动带中文界面的行人检测程序,支持上传本地图片(images/目录下的1.jpg、2.jpg、3.jpg)或MP4视频(5b4552a28231b.mp4)进行识别。底层调用OpenCV,可切换YOLO或HOG+SVM两种检测模型,代码结构清晰,位于src/detect目录。GUI模块包含按钮交互、背景图(bg.jpg)、应用图标(icon.jpg)和中文字体(SimHei.ttf),确保界面显示正常。检测过程使用独立线程(threads/目录)处理,避免主界面卡顿,提升响应流畅度。配套requirements.txt列出全部依赖库,说明书.doc详细说明环境安装步骤、运行方式及常见问题排查方法。整个工具包无需复杂配置,适合刚接触目标检测的学习者快速验证效果,也方便开发者替换模型或拓展功能。


本文还有配套的精品资源,点击获取

http://www.jsqmd.com/news/908450/

相关文章:

  • 干了十几年硬件测试,终于遇到一台省心的多通道直流电源——洛仪PDS 3000M+系列深度解析
  • 华硕笔记本终极轻量控制神器G-Helper:10MB替代臃肿奥创中心
  • Claude Code用户如何配置Taotoken解决密钥与额度不足问题
  • 成都高新会展推广,5月亲测有效
  • Windows 11下用VS2022编译Smoothieware固件,解决OpenPnP设备配置项不匹配问题
  • Linux服务器管理员的百度网盘工具箱:bypy命令行的10个高频使用场景与避坑记录
  • 衡水市2026年最新黄金回收靠谱门店推荐 黄金+K金+白银+铂金回收门店TOP5排行榜+联系方式 - 大熊猫898989
  • 五大硬件配件深度解析:解锁Alexa智能家居的完整自动化场景
  • 【LLM基础研究】核心六:AIInfra
  • Ubuntu开机卡在‘snap is fully seeded‘?别慌,先试试这招清理磁盘空间
  • 衡阳市2026年最新黄金回收靠谱门店推荐 黄金+K金+白银+铂金回收门店TOP5排行榜+联系方式 - 大熊猫898989
  • AI会不会成为冲锋衣行业的新增长引擎?
  • 零成本打造私有AI大脑:手把手教你本地部署DeepSeek,告别昂贵API!
  • Tabby终端美化与效率提升指南:从主题配色到自定义快捷键设置
  • Adobe-GenP 3.0终极指南:5分钟激活Adobe全系列软件的完整教程
  • AI认知之镜:从统计模式到意识幻象的技术本质与应对
  • 为自动化营销流程集成AI能力实现客户邮件的智能分类与回复
  • 5个实用技巧:如何彻底解决NVIDIA Profile Inspector驱动兼容性问题
  • 2025年五大技术趋势:从AI到量子计算,如何穿透炒作实现商业落地
  • 中药炮制技术与GMP标准化虚实融合智慧实训室,开创未来实训新模式
  • Win Server 2019远程桌面设置踩坑实录:从单用户锁死到安全的多用户协作
  • 避开高频电路仿真坑:用 Multisim 做 LC 正弦波振荡器实验时,这 3 个关键参数(R3、C2、静态点)千万别设错
  • 杭州哪家AI广告片制作公司经验丰
  • Windows Server 2019 Hyper-V实战:用DELL R730XD快速创建并导出标准化虚拟机模板
  • 呼和浩特市2026年最新黄金回收靠谱门店推荐 黄金+K金+白银+铂金回收门店TOP5排行榜+联系方式 - 大熊猫898989
  • Ubuntu 安装图形化蓝牙管理器 blueman-manager 并连接蓝牙鼠标(超详细教程)
  • 【UI变更】多机操控
  • G-Helper技术解析:华硕笔记本开源控制工具深度指南
  • 8086汇编MUL指令保姆级教程:从8位到16位乘法,手把手教你算清结果存哪儿
  • FreeRTOS Tickless模式实战:在STM32F103上实测功耗降低了多少?