ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

YOLOv8+PySide6花卉识别系统实战:从训练到桌面应用

YOLOv8+PySide6花卉识别系统实战:从训练到桌面应用 关于 YOLOv8/YOLOv5 PySide6 做花卉识别系统我先说结论这个技术栈是够用的而且很适合作为深度学习和图形界面结合的完整项目。它不只是训练一个模型而是把模型、数据处理、界面交互、批量识别、打包部署全链路串起来。如果你想拿它做毕业设计、课程设计或者作为简历里的实际项目关键不在那一行训练命令而在于数据怎么整理、参数怎么调、界面怎么封装、出错了怎么排查。这篇文章会按实际开发顺序拆开讲从安装环境到训练模型再到写一个能选图、能拍照、能显示识别框的 PySide6 桌面应用最后补充我踩过的坑。1. 这套系统到底解决什么问题值不值得做1.1 它不仅是“识花软件”更是一套完整的目标检测工程很多人看到“花卉识别鲜花识别检测系统”第一反应是“用分类模型不就行了吗”。这里有个重要区分图像分类只能告诉你“这是什么花”目标检测做的是在整张图里找出每一朵花的位置用矩形框标出来再告诉你每个框里是什么品种。如果你的应用场景是“阳光下有一片花丛画面里有玫瑰、菊花、月季混在一起”分类模型会非常吃力目标检测模型则能同时输出多个目标的位置和类别更适合真实图片。所以这个项目的本质是物体检测Object Detection不是单纯分类。它解决的问题是在复杂背景、多目标、多类别的情况下自动定位并识别花卉。落地场景包括景区拍照识花、植物研究辅助工具、智能花卉分拣系统、拍照巡检等。对学习者来说完整做一遍这个项目等于把深度学习检测模型的完整流程和桌面应用开发流程都练了一遍这在课程设计和求职项目里是非常拿得出手的。1.2 适合什么场景和人群这个系统适合三类人计算机视觉方向的学生需要把 YOLO 模型、训练流程、评估指标、模型导出串起来做毕设或者课程设计。想要快速搭建桌面工具的开发者不想一直用命令行做推理想有一个能选择图片、实时显示识别框的界面。准备简历项目的求职者只写“我会 YOLO”太单薄如果写成“我训练过自建数据集并用 PySide6 封装成桌面系统”项目完整度会高很多。当然也有不适合的情况如果你想做大规模实时视频分析比如无人机航拍万亩花田检测桌面单机工具并不是最优方案那要往服务化和分布式方向走。如果只是做一个手机 App 识花PySide6 桌面端也不是最终解法更适合小程序或移动端推理。所以要先明确自己的目标场景不要一上来就想着把功能做“大”。1.3 YOLOv8 和 YOLOv5 同时出现怎么选这个项目标题里同时出现了 YOLOv8 和 YOLOv5说明设计者希望系统具备兼容性。实际开发中建议不要同时作为两个独立方案来做而是把其中一个作为主力另一个作为对照。我一般建议新手先用 YOLOv8因为它的 API 更简洁训练命令和推理接口设计更友好数据集格式和文档也更清晰。如果你的环境比较老或者需要迁移到自有部署平台YOLOv5 可能更稳因为生态时间长社区资料多很多老设备的兼容方案都齐了。从实际效果看在中小规模花卉数据集上YOLOv8 默认配置的精度通常略高于 YOLOv5但差距并不会大得离谱。真正影响结果的还是数据质量、标注一致性和训练参数。所以选型时不用太纠结关键是选一个守住跑通之后再做对照。对比项YOLOv8YOLOv5训练接口yolov8 命令行 Python API更统一命令行 train.py老项目常用模型结构C2f 模块Anchor-Free 分支C3 模块Anchor-Based 为主导出格式ONNX、TorchScript、Engine 等同样支持常见格式易用性对新手更友好配置少资料多但参数项多社区资料增长很快官方文档清晰老牌稳定老问题都能搜到2. 环境准备先把依赖版本和硬件条件确认清楚2.1 Python 和 PySide6 的版本搭配为什么安装顺序很重要PySide6 是 Qt6 的 Python 绑定安装本身不算难但容易和已有环境冲突。我建议使用独立虚拟环境不要直接装到系统 Python 里否则以后打包或者升级依赖时很可能一团糟。环境准备顺序很重要按这个顺序走能少很多坑创建虚拟环境python -m venv flower_env激活虚拟环境Windows 下执行flower_env\Scripts\activateLinux/macOS 下执行source flower_env/bin/activate安装 PySide6pip install PySide6安装 PyTorch根据自己有没有 N 卡选择 CPU 版或 CUDA 版安装 YOLO 相关依赖pip install ultralytics或处理 YOLOv5 仓库依赖这里有个容易踩的问题如果先装 PyTorch再装 PySide6通常没问题但如果你在已安装 ultralytics 的环境里升级了 Python 或 PyTorch很可能出现动态链接库不匹配。所以先创建一个干净环境再逐项安装每个库装完跑一下最小导入验证比攒着一口气装完然后报错更高效。2.2 深度学习框架装 CPU 版还是 GPU 版主要看显存花卉检测模型不算超大模型但训练时 GPU 和纯 CPU 的体验差别非常大。如果只是做界面演示跑推理CPU 也可以接受但速度会比较慢尤其是摄像头实时识别时CPU 推理的帧率可能只有 1-3 FPS。如果是训练自己的数据集CPU 训练一个中等规模数据集可能要按小时或天计算而一般 GPU 只需要几十分钟到几小时。判断方式很简单有 NVIDIA 独立显卡且显存不低于 4GB建议安装 CUDA 版 PyTorch。没有 NVIDIA 显卡或者显存只有 2GB 左右先用 CPU 版跑通流程训练时把图片尺寸和 batch 调小。如果你想用的是 Mac 的 M 系列芯片可以正常安装 PyTorchYOLO 在 Apple Silicon 上也能跑但很多预编译的 CUDA 加速用不了。安装 PyTorch 时不建议手动下载 CUDA 工具包直接通过 PyTorch 官网提供的 pip 命令安装最稳妥。因为 PyTorch 自带的 CUDA 运行库版本和系统驱动有对应关系如果你不清楚驱动版本就先用nvidia-smi查看驱动支持的 CUDA 版本再选择匹配的 PyTorch 版本。2.3 建议的最小配置和推荐配置如果你只是做一个能演示的小系统这个配置足够了CPU4 核以上内存8GB 以上显卡可选无显卡也能运行推理系统Windows 10/11 或 Ubuntu 20.04如果你想训练一个效果不错的花卉模型推荐配置是CPU6 核以上内存16GB 以上显卡NVIDIA GTX 1660 6GB 起步显存越大越好硬盘至少准备 10GB 空间存放数据集、权重文件和中间结果显存不够时不要硬训练优先把batch-size降到 4 或 2再把imgsz从 640 降到 512 或 416能明显减少显存占用。低配置机器也能跑但不要指望训练速度和高端显卡一样快也不要一上来就开大批次训练。建议第一次跑通时不要追求高精度先用最小数据集验证整个流程能走通再考虑提升训练规模和效果。3. 数据集整理花卉识别的第一道坎不是模型是数据3.1 数据从哪来如何避免类别不平衡花卉识别系统的上限很大程度由数据集决定。训练好一个检测模型必须有带位置框标注的数据不是简单的一堆花照片就能直接用。数据来源主要有几类公开数据集比如部分开源花卉检测数据集、植物分类数据集但很多公开集是分类格式需要转换并补标注。自己拍摄用手机拍不同场景、不同角度、不同光照下的花工作量比较大但效果最贴合实际应用。网络采集需要注意版权和合规性只能作为学习用途不要用于商业化项目。爬取后清洗先做图像去重、筛选再交给标注工具处理。类别不平衡是个容易被忽略的问题。如果你的数据集里月季有 2000 张菊花只有 100 张训练出来的模型很可能对月季过拟合对菊花识别能力很差。解决思路尽量让每类图片数量接近至少不要差 5 倍以上。对样本少的类别做增强比如旋转、翻转、裁剪、亮度变化。训练参数里可以调节class weights但这个方式不如直接补数据稳定。3.2 标注格式转换VOC、COCO、YOLO 格式之间的坑标注工具有很多选择比如 LabelImg、LabelMe、CVAT、X-AnyLabeling。标注出来的结果可能是 Pascal VOC 的 XML 格式也可能是 COCO 的 JSON 格式而 YOLO 训练需要的是 TXT 格式。每种格式的坐标定义和存储方式不同转换时最容易出错。YOLO 格式每张图对应一个同名 TXT 文件每一行内容是class_id center_x center_y width height其中坐标值要归一化到 0 到 1 之间。举例如果一张图宽 640 像素高 480 像素一个目标框左上角为 (100, 80)右下角为 (200, 160)那么中心坐标是 ((100200)/2 / 640, (80160)/2 / 480) (0.234, 0.25)宽度是 ((200-100)/640)0.156高度是 ((160-80)/480)0.167。转换时最容易出现的问题坐标忘记归一化训练时 loss 非常不稳定。class_id 从 0 开始但自己在标签文件里从 1 开始标了。图片路径里的文件名和标注文件名不一致导致训练时找不到标注。图片格式是 BMP 或 PNG但数据加载配置里没写对。如果你只是转换一两次手写脚本或直接用开源转换脚本都可以。如果数据量很大我建议先写一个小工具统一检查标注文件图片尺寸、TX 文件数量、类别 id、坐标范围。训练前多检查一遍能省下大量调试时间。3.3 训练集、验证集、测试集怎么划分并写 data.yaml数据准备好之后需要划分成三部分训练集模型学习的样本通常占 70% 到 80%。验证集训练过程中用来评估模型、看是否过拟合通常占 10% 到 15%。测试集训练完成后用来做最终评估尽量不参与训练调参占 10% 到 15%。不要把测试集和验证集混用。很多人只划分训练和验证然后拿验证集当最终效果这样结果偏乐观后期部署时才会发现模型泛化能力不足。划分后需要生成一个data.yaml文件YOLO 训练时通过它找到数据集。一个典型配置如下path: D:/flower_dataset train: images/train val: images/val test: images/test nc: 5 names: 0: rose 1: chrysanthemum 2: tulip 3: sunflower 4: orchid这里path是数据集根目录train和val是相对路径。如果你的图片和标注文件是放在一起的YOLO 会自动在同一目录查找同名 TXT 文件所以图片目录和标签目录的对应关系要确保正确。有些情况下需要单独指定train_labels路径但常见版本默认是和图片同目录或挂在labels子目录里一定要去确认。4. 模型训练单条命令能跑通但 mAP 不达标要看这些参数4.1 YOLOv8 和 YOLOv5 的训练命令差异数据集整理好后训练这一步比想象中简单因为它已经被官方封装成很成熟的命令行工具。YOLOv8 的典型训练命令是yolo detect train dataflower.yaml modelyolov8n.pt epochs100 batch16 imgsz640 device0YOLOv5 的典型训练命令是python train.py --data flower.yaml --weights yolov5s.pt --epochs 100 --batch-size 16 --img 640 --device 0差别主要在参数名上YOLOv8 用model和imgszYOLOv5 用weights和img。如果你同时折腾两个版本很容易在参数名上来回踩坑。我的建议是刚开始只选一个版本把训练命令写熟再去看另一个版本的差异。第一次训练时可以用yolov8n.pt或yolov5s.pt做预训练权重不要直接从头训练也不要一上来就用最大的模型。预训练权重能让你少跑很多轮就得到不错的效果。如果数据集和预训练类别差异很大也仍然建议用预训练权重做迁移学习它学到的通用特征对花卉这种真实物体是有帮助的。4.2 关键参数epochs、batch、imgsz、device、workers这几个参数直接影响训练速度、显存占用和最终效果。epochs表示训练轮数。对于小规模数据集100 轮基本够用如果从预训练权重开始50 轮也能看到明显效果。训练轮数太少会欠拟合太多会过拟合。我判断训练是否结束不是只看轮数而是看验证集 loss 是否还在下降下降不明显就可以停了。batch-size决定每次送入 GPU 的图片数量。显存不足时优先降低它。但 batch 太小训练收敛速度会慢而且 BatchNorm 层的统计可能不稳定。如果显存只有 6GB建议从 8 开始跑一次看显存占用再逐步调整。imgsz是输入图片的尺寸。默认 640 适合大多数场景。如果你有很多小花朵640 足够如果图片里花非常小、非常密集可以提高到 960 或 1280但显存和训练时间会明显增加。反之如果只是做一个演示系统416 或 512 也能出效果速度更快。device指定训练设备0表示第一块 GPUcpu表示用 CPU。多人共用服务器时要确认 GPU 显存没有被别人占用否则一启动就 OOM。workers表示数据加载的进程数。不要盲目调大Windows 下 workers 超过 8 可能导致数据加载异常。可以先设为 4如果训练时 CPU 还没有吃满再往上调。4.3 如何判断训练是否正常loss、mAP、PR 曲线训练过程中要盯的不是训练集 loss而是验证集指标。YOLO 的输出目录里会保存results.csv或results.png里面包含train/box_losstrain/cls_lossval/box_lossval/cls_lossmetrics/precisionmetrics/recallmetrics/mAP50metrics/mAP50-95训练正常时loss 整体下降mAP 上升。如果验证集 loss 持续上升而训练集 loss 还在下降说明过拟合了可以提前停止或者加入更多数据增强。mAP50 在简单场景下达到 0.9 以上不算罕见但在复杂花卉数据集上能稳定到 0.8 以上已经不错。mAP50-95 更低而且提升更慢这是正常现象。如果你在意模型在“找得准不准”上的表现要看 Precision如果在意“找得全不全”要看 Recall。具体到花卉检测如果你希望识别出画面中大部分花而不是漏掉Recall 更重要如果你希望每个识别结果都很可信Precision 更重要。4.4 训练时最常见的三类失败显存溢出、NAN、训练发散显存溢出一般报错是CUDA out of memory。解决顺序是先减小 batch-size再减小 imgsz最后替换成更小的模型。不要一上来就加device0还不够还要确认没有其他进程占用显存。训练时出现 loss 为 NAN常见原因包括学习率过大、梯度爆炸、数据里有异常值、模型或损失函数不兼容。先做这几件事降低学习率检查数据集标注是否有坐标越界把batch-size调小。如果仍然 NAN可以检查是否是预处理阶段除零错误比如某些图片尺寸为空或标注文件为空。训练发散的症状是 loss 不断上升或剧烈震荡mAP 一直为 0。常见原因是数据集标签格式错误、类别数量不一致、或者学习率太大。不要急着改网络结构先用一个小数据集跑一个短训练比如 10 个 epoch确认稳定后再放开。5. 推理和模型导出本地验证通过后再考虑界面集成5.1 单张图片、文件夹、视频和摄像头的推理验证训练完成后输出目录下会有best.pt和last.pt。best.pt是验证集上效果最好的权重last.pt是最后一次迭代的结果。部署时优先使用best.pt。在写 PySide6 界面之前先用命令行验证推理结果。YOLOv8 的推理命令yolo detect predict modelruns/detect/train/weights/best.pt sourcetest.jpg conf0.25 saveTruesource可以是单张图片、文件夹路径、视频文件甚至摄像头序号。conf是置信度阈值低于这个值的检测框会被过滤掉。检测结果会保存在 runs/detect/predict 目录下。预测时如果结果为空先别急着怀疑模型。检查图片分辨率是否过小、花朵目标是否太小、conf阈值是否设置太高。你可以把conf降到 0.1 看能否输出大量候选框如果还是什么都没有重点查图片格式和模型输入通道。摄像头推理在 YOLO 命令行里可以直接用摄像头序号但一旦进了 PySide6 界面就不建议再用命令行方式而是要通过 Python API 加载模型并逐帧推理。5.2 导出 ONNX 和 TorchScript 时要注意什么如果只想在本地桌面系统里用.pt文件不需要导出。但如果未来要考虑别的推理框架比如 OpenCV DNN、ONNX Runtime或者想对比不同推理引擎的速度可以导出。YOLOv8 导出命令yolo export modelbest.pt formatonnx dynamicTrue导出 ONNX 时有个容易踩的坑opset版本和推理框架支持不一致会导致某些算子不支持。如果用 ONNX Runtime 加载可以先确认你的 onnxruntime 版本是较新的版本再导出。导出后可以用onnxruntime写一个简单脚本验证输出张量形状。TorchScript 导出对 PySide6 集成也有帮助因为它不依赖ultralytics包运行体积更小推理速度更稳定。但 TorchScript 在不同 PyTorch 版本之间兼容性并不完美所以如果环境固定可以放心用如果要在多环境部署ONNX 更稳妥。5.3 性能判据FPS、单张耗时、模型大小界面集成前要给系统定几个性能目标否则做完了也不知道算不算合格。单张推理耗时CPU 上 YOLOv8n 对 640x640 图片可能在 0.2 到 1 秒之间GPU 可能在 10 到 50 毫秒。如果你的电脑配置较差耗时高不奇怪。FPS摄像头实时检测达到 15 FPS 以上体验就比较流畅。低于 5 FPS 基本没法用。模型大小yolov8n.pt大约 6MB 左右yolov8s.pt大约 22MB。如果你要打包给用户使用模型越大加载越慢启动越慢。需要注意的是加载模型本身也有耗时。在 PySide6 界面里最好启动时一次性加载模型而不是每次选图片都重新加载。如果你把模型加载放在按钮点击事件里用户会明显感觉到卡顿。建议第一次集成到界面时先设置一个“模型加载中”的状态提示不然用户点击按钮后长时间没有反馈会以为程序崩溃了。6. PySide6 界面设计把模型封装成可用系统重点在消息循环和线程6.1 界面整体布局选择图片、展示结果、显示日志一个合格的花卉识别桌面系统界面不需要很花哨但必须让人能用。我建议核心布局采用左右结构或上下结构左侧是图片预览区用来显示原始图片和识别后的结果图。右侧是控制区选择图片按钮、摄像头开启按钮、模型加载进度、识别结果列表。底部或侧边是日志区显示当前执行的步骤和异常信息。用 PySide6 实现时核心控件包括 QLabel 或 QGraphicsView 显示图片QPushButton 触发操作QTextEdit 显示日志QComboBox 选择模型。界面代码不复杂但要注意坐标转换YOLO 输出的框坐标是归一化或原始像素坐标显示到 QLabel 上时如果图片被缩放需要把坐标也做对应缩放不然框会画歪。一个简单的方式是先设置 QLabel 按比例缩放显示图片然后将检测框坐标按缩放比例转换。具体比例是label_width / image_width和label_height / image_height。6.2 模型加载和推理为什么必须放到 QThread 里这是 PySide6 应用里最常见的卡死原因。如果你直接在按钮点击事件里调用模型推理推理耗时会阻塞 Qt 的事件循环界面会变成“无响应”状态。要解决这个问题必须把耗时操作放到后台线程。简单做法是创建QThread子类把模型推理放进去在主线程里通过信号接收结果。下面是一个简化示例import sys import cv2 from PySide6.QtCore import QThread, Signal from ultralytics import YOLO class InferenceThread(QThread): result_ready Signal(object) error_occurred Signal(str) def __init__(self, model_path, image_path, parentNone): super().__init__(parent) self.model_path model_path self.image_path image_path def run(self): try: model YOLO(self.model_path) img cv2.imread(self.image_path) results model.predict(img, conf0.25) self.result_ready.emit(results) except Exception as e: self.error_occurred.emit(str(e))这个示例把模型加载也放在子线程里好处是界面启动后可以继续交互。但要注意如果反复创建和销毁线程并且每次都重新加载模型开销会很大。更好的方式是启动时先加载模型到内存线程只负责推理不负责加载模型。正确做法是在主程序初始化时把模型加载好线程的run()只调用模型推理并发送结果。这样既避免卡界面也避免模型重复加载。6.3 在界面里显示 YOLO 检测结果坐标框、类别名、置信度预测结果results是ultralytics的 Results 对象常见用法是拿到一个boxes数据里面包含boxes.xyxy左上角和右下角坐标boxes.cls类别索引boxes.conf置信度绘制结果有两种方式。第一种是直接用results[0].plot()生成一张带框的图像直接在 QLabel 里显示。它最简单但只能在整块图上显示标签不够灵活。第二种是自己遍历框用 OpenCV 画矩形和文字然后显示。这种方式更可控可以自定义颜色、字体和标签。我用得比较多的是第二种因为可以过滤置信度阈值、改变标签措辞而且可以把检测结果保存成结构化数据。如果只是演示第一种足够。6.4 摄像头实时检测和图片检测的处理差异图片检测是单次推理摄像头检测是连续多帧推理。实时处理时要注意几个问题摄像头帧率通常 30 FPS但推理速度不一定跟得上。需要控制处理帧率不要每一帧都推理否则界面卡顿。我一般会隔一帧或两帧处理一次。摄像头画面需要垂直翻转否则画面左右反的体验很怪。可以用cv2.flip(frame, 1)。如果在子线程里做摄像头视频流注意线程退出时要释放摄像头资源否则下次打开摄像头会提示被占用。摄像头检测的主循环是这样while self.capture.isOpened(): ret, frame self.capture.read() if not ret: break frame cv2.flip(frame, 1) results self.model.predict(frame, conf0.25) annotated_frame results[0].plot() # 转换成 Qt 可显示的 QImage 再发送到主线程 self.result_ready.emit(annotated_frame)注意model.predict默认可能返回一个结果列表results[0]是当前帧的检测结果。处理视频时不要对每个结果都做show窗口操作否则会和 PySide6 的消息循环冲突。6.5 打包成 exe 的常见问题桌面应用做完了很多人想打包成 exe 发给别人用。PyInstaller 是常用工具但 PySide6 和深度学习库打包通常会遇到几个问题打包体积很大几百 MB 很正常。缺少动态链接库启动时报 DLL 找不到。模型文件路径在打包后和源码中不同导致加载失败。ultralytics内部有动态导入PyInstaller 分析依赖时可能漏掉部分模块。简单的应对措施使用--collect-all ultralytics收集所有资源文件。把模型文件通过--add-data携带进去并在代码中改成resource_path方式定位。打包后一定要在干净机器上测试不要只在开发机跑。如果你的项目是毕业设计通常不需要打包成 exe在 IDE 里能运行完整功能就已经满足要求。如果想打包建议先打包一个最小测试版本确认能启动后再加入模型和界面。7. 常见问题排查先看日志再改参数不要盲调7.1 启动报错torch 导入失败、PySide6 版本冲突启动程序时最常见的错误是ModuleNotFoundError: No module named torch或No module named PySide6。这种问题通常是因为当前终端或 IDE 激活的项目环境不是安装依赖的环境。先检查pip list确认包的安装情况再确认 IDE 解释器路径。还有一类问题是torch和PySide6版本冲突导致 Qt 动态库加载异常。可能的表现是程序能启动但打开摄像头时崩溃或者点击按钮时提示线程错误。这种时候不要急着改代码先确认虚拟环境里torch、opencv-python、PySide6是不是都用同一个环境安装的。如果你之前从源码安装了 opencv后来又 pip 安装了 opencv-python很容易发生底层库冲突。7.2 训练卡住数据加载、工作线程数、磁盘速度训练开始时如果一直停留在Scanning或Downloading或者进度条不动先排查以下几项数据集路径是否包含中文或特殊字符这会导致一些库在 Windows 下读取异常。图片和标注文件是否存在是否和数据划分路径一致。磁盘剩余空间是否足够训练过程会不断写入缓存和权重文件。workers是否设得过大导致数据加载线程相互阻塞。可以先设为 0 试试。如果数据量很大磁盘读写速度也会影响训练。建议把数据集放到本地 SSD 上不要放在网络盘或移动硬盘里。7.3 检测效果差输入尺寸、置信度阈值、NMS 阈值检测结果不理想时按顺序排查不要一次改多个参数先看原始输入图片的分辨率如果图片非常小物体边缘模糊模型很难识别。把conf调低到 0.1看是否有很多框。如果调低后能检出更多目标说明原阈值太高。如果很多框重叠调节 NMS 的 IoU 阈值默认 0.45 是通用值可以调到 0.5 或 0.6。如果仍然识别不出来考虑训练时imgsz和推理时imgsz不一致的问题。训练用 640推理却用 1280模型可能不匹配。7.4 界面卡死大概率是主线程被推理占住了界面点击后未响应最常见的根因就是推理操作放在了主线程里。解决办法就是前面提到的 QThread或者使用QTimer分步处理。还要注意子线程里不能直接刷新界面控件必须通过信号把数据传递到主线程否则 Qt 会报“cross-thread”错误。如果摄像头视频流在子线程里持续推理同时主线程还在加载大图片也可能出现界面卡顿。可以设置一个阈值视频流每秒最多处理 15 帧不处理的帧直接丢弃只显示最新帧。7.5 日志和输出目录管理提前规划能省很多事很多人在一个小项目里因为输出目录混乱浪费大量时间。训练输出、测试输出、界面日志都混在一起最后连哪个 weight 是哪个数据集的都分不清。我建议在项目根目录下建这几个子目录flower_project/ ├── dataset/ │ ├── images/ │ ├── labels/ │ └── data.yaml ├── runs/ │ ├── train/ │ └── detect/ ├── models/ │ └── best.pt ├── ui/ │ └── main_window.py └── logs/ └── app.log这样训练结果、模型文件、日志记录都能对号入座。运行时把日志也写入文件以后排错能直接看历史记录不用靠记忆。最后留几个我自己的实践建议如果你打算花一周时间把这个系统做完整我会建议这样排优先级第一先把数据集和训练跑通。即使只有几百张图、几个类别也要先把data.yaml和训练命令走通拿到一个可用的best.pt。模型好不好是后续所有工作的基础。第二再写推理脚本。用命令行验证单张图片确认模型能用输出框和标签位置正确。这一步不需要界面脚本越简单越好。第三最后才写 PySide6 界面。先把模型加载和推理放到线程里再做图片显示和结果绘制最后扩展摄像头。第四如果时间富余再做打包和日志。打包不是必需项但如果你想把系统给别人演示打包能省去对方配置环境的痛苦。这个项目真正落地时最该盯住的不是功能列表而是输入格式、资源占用和失败重试。数据格式错、线程卡死、模型路径找不到这三个问题占了绝大多数调试时间。把每一步都验证清楚整个系统会比预期顺利得多。
返回列表