文章目录

一.前言
朋友们好!今天给大家带来我给大家带来基于PyQt5+YOLOv8+DeepSeek的智能球体检测系统,这款软件系统支持对不同输入内容中的球体进行检测,本系统使用PyQt5制作界面,使用YOLOv8进行计算机视觉检测,配合DeepSeek的AI加持,横向拓展了软件系统的功能!
二.核心技术介绍
在这章我将要介绍本系统的核心技术。
1.PyQt5
PyQt5 是一套用于创建跨平台桌面应用程序的 Python GUI 工具包,它是 Qt 应用框架的 Python 绑定。通过 PyQt5,开发者可以使用 Python 编写具有现代图形界面的应用程序,支持丰富的控件、信号与槽机制、窗口管理、事件处理等功能。它兼容主流操作系统(如 Windows、macOS 和 Linux),适用于开发各种规模的桌面软件,常与 Qt Designer 配合使用以加快开发效率。
2.YOLOv8
YOLOv8(You Only Look Once version 8)是由 Ultralytics 推出的最新一代实时目标检测模型,属于 YOLO 系列的改进版本。相比前代模型,YOLOv8 在精度、速度和灵活性上都有显著提升,支持目标检测、图像分割、姿态估计等多任务处理。它采用了更加高效的网络结构和训练策略,并提供开箱即用的 Python 接口和命令行工具,适用于边缘设备和云端部署,广泛应用于安防监控、自动驾驶、工业检测等场景。
3.DeepSeek
DeepSeek是由深度求索公司开发的AI大模型助手,作为纯文本模型,我擅长自然语言处理、文档分析和智能对话。当与YOLO(You Only Look Once)实时目标检测系统结合时,可以形成强大的多模态应用架构------YOLO系统负责实时视觉识别和目标检测,快速准确地识别图像或视频流中的物体;而我则对YOLO检测到的结果进行深度语义分析和上下文理解,提供物体属性的详细解读、场景描述、行为分析以及决策建议。这种结合使得计算机视觉的"看到"与AI的"理解"完美融合,可广泛应用于智能监控、自动驾驶、工业质检等领域,实现从视觉感知到智能决策的完整闭环。
4.CSV
本系统使用CSV进行数据的存储与数据导出。
CSV(Comma-Separated Values)是一种简单通用的文本文件格式,以纯文本形式存储表格数据。它用逗号分隔不同的字段,每行代表一个数据记录,类似于电子表格或数据库中的行。由于其格式简单、易于读写且兼容性强,CSV被广泛应用于数据交换、导出和存储,支持几乎所有常见的办公软件和编程语言处理,是数据分析和系统间传输结构化信息时最常用的轻量级格式之一。
5.多线程
PyQt5 的多线程通常通过 QThread 类实现,它允许在 GUI 程序中运行耗时的操作而不阻塞主线程(即界面线程),从而保持界面响应。使用 PyQt5 的多线程方法通常有两种方式:继承 QThread 或使用 QRunnable 搭配 QThreadPool。推荐方式是将耗时任务写在一个独立的工作对象中,并通过 moveToThread() 将其移到子线程中运行,同时使用信号(pyqtSignal)与主线程通信。这种方式更加安全、结构清晰,适合复杂项目的线程管理。
三.核心功能
1.登录注册
1.登录
软件启动后首先进入登录页面,用户需要输入正确的用户名和密码才能使用本系统的正式功能,登录页面整体采用了垂直布局,局部采用了水平布局,登录界面简约不简单,登录功能后端采用CSV本地文件存储用户信息,每次登录都是通过查库进行验证的,实现了流程标准化。
我们设计了简约的登录注册界面展示与用户交互的所有组件,登录注册界面的标题展示了系统的名称。

2.注册
没有账号的用户需要进行注册,注册操作流程十分简单,用户点击登录界面的注册按钮就跳转到了注册窗口,用户需要输入自定义的用户名和两次匹配的密码才能完成登录,值得一提的是,成功注册的用户软件会自动填写用户名和密码到登录界面,实现了登录流程路径的简化。

2.主界面
用户通过输入自己的用户名和密码登录到本系统后进入主界面,主界面内容十分丰富,我来一一介绍:首先软件整体是垂直布局,顶部是系统的标题,从左到右依次展示了系统的作者信息、系统名称、当前时间以及CPU内存占用情况,下方为水平布局,左侧是系统的导航区域,我们设计了windows风格支持展开与收缩的内容导航区域,右侧是内容核心区域,通过点击导航按钮切换展示内容,主界面主要展示了以日期为维度统计的数据、用户信息操作按钮、系统信息、系统环境信息以及实时CPU、内存可视化折线图

3.图像检测界面
1.检测结果展示
用户通过点击左侧导航栏按钮切换到图像检测界面,在此界面支持选择图像进行输入,用户选择完之后被选择的图像会展示在左侧并且展示图像绝对路径信息,用户可以通过点击右侧的"进行检测"按钮对输入的图像数据进行检测,系统会自动调用YOLOv8相关算法根据指定的参数对输入图像内容进行检测,最后将检测结果展示到右侧,这样用户可以通过比对左右图像的区别得到直观的检测结果,系统自动使用红色边框框选出目标区域并且使用红色文字展示出目标类别以及它的置信度,这些参数和展示效果都可以在设置页面进行详细设置。

2.导出检测结果
我们设置了检测结果区域,包括检测目标数量的展示以及详细检测结果表格,用户可以更加直观地看到检测结果数据,另外当用户检测结束之后右侧的三个按钮自动设置为可以点击,这三个按钮的作用分别是:
导出结果:用户可以将检测结果进行导出,导出的文件格式可以是Excel、CSV、TXT,可以根据情况自行选择导出格式,我截图给大家看下导出的Excel文件内容格式。

3.可视化展示
然后就是可视化展示,用户可以点击进行可视化按钮,查看对于本次检测的可视化效果,系统内置了四种可视化效果:分别是:目标位置热力图、目标面积占比、置信度分布直方图、检测能力柱状图,这些图标通过不同维度对当前数据进行了可视化展示,更便于用户理解,这里指的一体的是,支持可视化图表进行导出操作,用户可以点击紫色的导出按钮,对当前的可视化效果图表进行导出,生成一张本地的PNG图像文件。

4.AI(DeepSeek)智能分析
将YOLOv8球体检测系统与DeepSeek等AI大模型深度融合,能够实现从"单纯检测"到"智能认知"的跨越式升级。该系统在YOLOv8高效精准的球体定位能力基础上,融入了DeepSeek强大的语义理解和推理决策能力,不仅可以实时识别球体位置,还能深度分析场景语义、生成战术策略并提供智能决策支持,从而在体育分析、工业质检和机器人视觉等领域构建出更加智能化、自适应的一体化解决方案。
这里是软件的另外一个核心:AI智能分析,我们的目标检测系统接入了DeepSeek大模型,支持对当前检测结果数据进行AI分析,AI会通过不同维度对当前检测结果进行多角度分析,最后生成检测结果分析报告,用户可以根据这个结果对系统进行调整,不断完善系统功能和目标检测准确度!
在AI分析结束后下方会展示一些按钮,用户可以方便地复制结果、导出文本内容、生成PDF报告、重新生成以及关闭,多重的操作方式给于用户了多种选择!

4.视频检测界面
1.视频文件检测
我们的系统支持视频内容中的球体检测,支持输入的视频类型包括:视频文件、视频流以及摄像头,通过识别视频画面的内容对内容中的目标球体进行检测,试试标注与展示,通过相关帧率控制保证了视频的流畅性,用户可以通过比对左右两侧的画面使用肉眼评估当前检测结果,我们的视频检测界面拥有图像检测界面相同的操作功能,这里不多赘述。

2.摄像头内容检测
用户点击"进行检测"按钮之后系统会自动调用摄像头,打开摄像头展示摄像头画面,实时检测目标画面中的球体,通过左右画面比对让用户看到检测结果,这里本人就不露脸啦~

5.系统设置界面
我们的系统是支持简单的参数设置的,具体可以设置目标检测模型、置信度阈值(Conf)、交并比阈值(IOU)、还有一些检测结果控制参数,比如检测框展示、目标类别展示、目标置信度展示,用户可以点击绿色的刷新按钮刷新可用模型,亦可通过点击退出按钮退出系统或者退出登录,本设置页面实现了目标检测参数的灵活配置!

6.关于软件界面
我们使用富文本html的形式展示了软件相关的信息,包括系统用到的相关技术,对于二维的数据使用二维表进行了展示,最底部放置了四个按钮,分别是:关于YOLO、关于软件、关于作者、关于QT,点击之后都会弹出对应的信息提示框,这个页面的作用是让用户更多的了解软件和创作者信息,跨过技术的鸿沟!

四.数据集
在球体目标检测任务中,YOLO(You Only Look Once)展现出极高的实时性与可靠性,能够有效解决传统检测方式在速度与稳定性上的限制。以往依靠人工观察或基于简单阈值的规则算法,不仅在多球体、快速运动、复杂光照等环境下易出现漏检与误判,其处理效率也难以满足工业、机器人或体育分析等高频场景的需求。相比之下,YOLO 可以稳定输出 30 FPS 以上的实时检测速率,对不同尺寸、颜色与表面材质的球体均能保持 95%+ 的识别精度,显著提升整体系统的自动化水平。
随着智能制造与智能机器人不断发展,球体检测逐渐成为物流分拣、自动抓取、轨迹分析、三维定位等应用中的核心环节。YOLO 的端到端检测框架不仅能够准确给出球体位置,还可进一步输出半径估计、运动方向等关键信息,为构建高鲁棒性的感知系统提供可靠基础,加速各类场景的智能化升级。
1.数据准备
我们为模型训练准备了500多张球体图像,其中大多数为网络图片,然后使用VOC的格式存储数据标注文件

数据标注文件格式为VOC,如下:
bash
<annotation>
<folder>images</folder>
<filename>ff7d0c400f3995e832500ba9f0bc379a.jpg</filename>
<path>E:\dataset\balldata-20220325T135941Z-001\balldata\tabletennis_voc\voc\images\ff7d0c400f3995e832500ba9f0bc379a.jpg</path>
<source>
<database>Unknown</database>
</source>
<size>
<width>720</width>
<height>720</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>ball</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>25</xmin>
<ymin>267</ymin>
<xmax>194</xmax>
<ymax>439</ymax>
</bndbox>
</object>
<object>
<name>ball</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>189</xmin>
<ymin>271</ymin>
<xmax>360</xmax>
<ymax>444</ymax>
</bndbox>
</object>
<object>
<name>ball</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>361</xmin>
<ymin>268</ymin>
<xmax>527</xmax>
<ymax>442</ymax>
</bndbox>
</object>
<object>
<name>ball</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>527</xmin>
<ymin>267</ymin>
<xmax>692</xmax>
<ymax>440</ymax>
</bndbox>
</object>
</annotation>
2.数据集处理、划分
首先将原始的VOC数据集转化为YOLO数据集,即将数据集从XML格式转化为TXT格式,这里我们提供了一键转化脚本step1-voc2yolo.py
及哦啊本将 Pascal VOC 格式的目标检测标注批量转换为 YOLO 所需的标签格式。程序会读取每个 XML 标注文件,解析出目标类别与边界框坐标,并结合对应图像的尺寸,将 VOC 的绝对像素框转换为 YOLO 的归一化中心点与宽高格式。转换后的标签以 .txt 文件输出到指定目录,使原本的 VOC 数据能够直接用于 YOLO 模型训练。
python
import os
import xml.etree.ElementTree as ET
from PIL import Image
# VOC 类别列表(顺序必须固定)
classes = ['ball'] # 替换成你自己的类别
# 输入路径
voc_anno_dir = r'E:\thunder_download\useful\tabletennis_voc\voc\annotations'
voc_img_dir = r'E:\thunder_download\useful\tabletennis_voc\voc\images'
# 输出路径
yolo_label_dir = r'E:\thunder_download\useful\tabletennis_voc\voc\labels'
os.makedirs(yolo_label_dir, exist_ok=True)
def convert_box(size, box):
"""将VOC边界框坐标转为YOLO格式"""
dw = 1. / size[0]
dh = 1. / size[1]
x_center = (box[0] + box[1]) / 2.0
y_center = (box[2] + box[3]) / 2.0
w = box[1] - box[0]
h = box[3] - box[2]
return (x_center * dw, y_center * dh, w * dw, h * dh)
def convert_annotation(xml_path, img_path, output_path):
tree = ET.parse(xml_path)
root = tree.getroot()
img = Image.open(img_path)
w, h = img.size
with open(output_path, 'w') as out_file:
for obj in root.iter('object'):
cls = obj.find('name').text
if cls not in classes:
continue
cls_id = classes.index(cls)
xml_box = obj.find('bndbox')
b = (
float(xml_box.find('xmin').text),
float(xml_box.find('xmax').text),
float(xml_box.find('ymin').text),
float(xml_box.find('ymax').text)
)
bb = convert_box((w, h), b)
out_file.write(f"{cls_id} {' '.join(map(str, bb))}\n")
# 遍历VOC标注文件夹
for filename in os.listdir(voc_anno_dir):
if not filename.endswith('.xml'):
continue
xml_path = os.path.join(voc_anno_dir, filename)
img_filename = filename.replace('.xml', '.jpg')
img_path = os.path.join(voc_img_dir, img_filename)
output_path = os.path.join(yolo_label_dir, filename.replace('.xml', '.txt'))
if not os.path.exists(img_path):
print(f"Warning: image {img_path} not found, skipping.")
continue
convert_annotation(xml_path, img_path, output_path)
print(f"Converted {filename} to {output_path}")
这样就能把数据集成功处理,处理后的数据集就变成了TXT格式:
bash
0 0.3170289855072464 0.6563245823389022 0.06884057971014493 0.09069212410501194
然后就是划分数据集,YOLO官方推荐的是测试集:验证集为8:2,我们这里撰写了一个随机划分的脚本,能够按照8:2随机划分数据。
脚本用于从原始数据集中自动构建 YOLO 训练所需的目录结构。它会读取标签文件列表,按 8:2 的比例随机划分为训练集和验证集,并在输出目录中分别创建对应的 images 与 labels 文件夹。随后,程序根据标签文件名匹配同名图像,找到后将图像和标签一并复制到相应的数据集分区,从而生成可直接用于模型训练的标准化数据集。
python
import os
import shutil
import random
import math
# 输入路径
labels_dir = r'E:\thunder_download\useful\tabletennis_voc\voc\labels' # YOLO标签文件目录
images_dir = r'E:\thunder_download\useful\tabletennis_voc\voc\images' # 图像文件目录
output_dir = r'E:\thunder_download\useful\tabletennis_voc\voc\output_dataset' # 输出目录
# 创建输出目录结构
for split in ['model_train', 'val']:
os.makedirs(os.path.join(output_dir, split, 'images'), exist_ok=True)
os.makedirs(os.path.join(output_dir, split, 'labels'), exist_ok=True)
# 获取所有标签文件(假设图像和标签同名)
label_files = [f for f in os.listdir(labels_dir) if f.endswith('.txt')]
random.shuffle(label_files)
# 按照 8:2 比例划分训练集和验证集
total_files = len(label_files)
train_count = math.floor(total_files * 0.8)
val_count = total_files - train_count
train_files = label_files[:train_count]
val_files = label_files[train_count:]
def copy_samples(file_list, split_name):
copied_count = 0
for label_file in file_list:
base_name = os.path.splitext(label_file)[0]
image_file = None
# 匹配图像扩展名
for ext in ['.jpg', '.png', '.jpeg']:
possible_image = os.path.join(images_dir, base_name + ext)
if os.path.exists(possible_image):
image_file = possible_image
break
if image_file is None:
print(f"⚠️ 图像文件 {base_name} 不存在,跳过。")
continue
# 拷贝标签和图像
shutil.copy(os.path.join(labels_dir, label_file), os.path.join(output_dir, split_name, 'labels', label_file))
shutil.copy(image_file, os.path.join(output_dir, split_name, 'images', os.path.basename(image_file)))
copied_count += 1
print(f"✅ {split_name} 集合完成,共复制 {copied_count} 张图像。")
# 执行复制
copy_samples(train_files, 'model_train')
copy_samples(val_files, 'val')
划分好之后大家就能得到两个文件夹,文件夹分别是训练集和测试集,里面分别存储着图像数据集文件和标注结果文件,大家如果想要加入自己的图像数据可以在这一步自行手动添加。

3.模型训练
数据集准备好之后就可以开始模型训练了,我们首先准备一个训练的配置文件,比如说是data.yaml

然后就可以开始模型训练了,直接执行我们准备好的train.bat文件,内容就是下面的内容
bash
yolo task=detect mode=train model=../data/models/yolov8n.pt data=./data.yaml epochs=50 imgsz=640 batch=16 lr0=0.01
然后模型就开始训练了,训练结束的时候我截了图

这里我贴一些训练验证结果截图


最后的results.png见下图,训练效果还是可以的!

我们的检测系统可以用在的应用场景:
1. 乒乓球、篮球、足球等运动分析
实时检测球体位置,用于轨迹追踪与速度估计
训练辅助:统计击球次数、回合数量、运动轨迹
教练分析工具:分析选手击球点、球速变化等
2. 机器人视觉与自动化控制
为机器人提供球体定位,实现自动拾取、传递、分类等操作
应用于自动发球机、智能陪练设备
作为视觉输入,让机器人完成避让或跟随球体等任务
3. 智能监控与场地管理
球场监控设备自动识别球体运动,辅助判定是否越界
对球类活动区域进行统计、热区分析
场馆智能管理系统中记录使用频率、运动轨迹等数据
4. 运动仿真与增强现实(AR)场景
为 AR/VR 应用提供精准的球体实时定位
将实际运动轨迹叠加可视化效果(如轨迹线、速度指示)
游戏开发中用于交互检测与物体跟踪
5. 教学实验与计算机视觉课程演示
展示目标检测、图像处理、GUI 交互的综合案例
用于课堂示范 "图形界面 + AI 推理" 的完整流程
帮助学生理解实时检测系统的构建方法
6. 视频分析与数据统计系统
批量处理比赛视频进行球体自动检测与事件统计
生成运动数据报告,用于科研分析或比赛复盘
可扩展到多摄像头融合,实现三维轨迹提取
五.项目运行环境
本项目名称为yolov8-ball-detection
1.项目依赖
博主是在Windows电脑上使用Python3.8开发的本系统,建议大家使用的Python版本别太高。
其中项目依赖为:
bash
PyQt5==5.15.11
QtAwesome==1.3.1
torch==2.4.1
torchvision==0.19.1
Pillow==9.3.0
pyqtgraph===0.13.3
PyQtWebEngine==5.15.5
opencv-python==4.10.0.82
ultralytics==8.3.98
Requests==2.32.5
pandas==2.0.3
numpy==1.24.4
Markdown==3.4.4
我已经整理到了requirements.txt,大家直接使用命令
pip install -r requirements.txt
即可一键安装项目依赖,其中的torch和torchvision只要匹配即可,不一定非要和博主开发环境的版本一致。
2.项目结构
很多小伙伴担心拿到代码后项目看不懂,这个大家不必担心,我们采用文件+类名对相关功能进行了模块化定义,大家见名知意。
下图博主采用tree命令生成了文件、目录树
bash
tree "D:\projects\gitee\2025\yolov8-ball-detection" /f /a
bash
D:\PROJECTS\GITEE\2025\YOLOV8-BALL-DETECTION
| .gitignore
| main.py(程序入口)
| record.txt(开发记录)
| requirements.txt(项目依赖)
|
|
+---script
| create_qrc.py
|
+---src(源代码核心目录)
| +---conf(配置内容)
| | | icon_conf.py
| | | style_conf.py
| | | system_conf.py
| | | test_data.py
| | | __init__.py
| |
| +---engine(核心引擎)
| | engines.py
| | __init__.py
| |
| +---resource(资源目录)
| | | resource.qrc
| | | resource_rc.py
| | | __init__.py
| | |
| | \---imgs
| | ai.svg
| | bg.jpg
| |
| +---threads(线程、信号总线)
| | main_threads.py
| | signal_bus.py
| | __init__.py
| |
| +---utils(工具方法、工具类)
| | custom_utils.py
| | user_manager.py
| | __init__.py
| |
| \---widgets(组件目录)
| base_widgets.py
| custom_pages.py
| custom_widgets.py
| main_page.py
| unique_widgets.py
| __init__.py

五.总结
本次给大家介绍了我使用PyQt5+YOLOv8+DeepSeek开发的智能球体检测系统,本系统功能强大,支持多种数据源输入,包含多种用户交互按钮以及模式,内置数据可视化方案、大模型AI加持,是您学习、工作使用的不错选择!
需要代码的朋友可以点击箭头下方的二维码加我好友,欢迎您了解!





