FEATURED · 精选文章

基于YOLOv5的蘑菇识别系统:从数据集训练到GUI部署全流程

发布时间 / 2026/8/31 7:02:13
来源 / 创域科博编辑部
栏目 / 资讯中心
基于YOLOv5的蘑菇识别系统:从数据集训练到GUI部署全流程 简介本资源是一个面向人工智能初学者与计算机视觉爱好者的实战型蘑菇毒性识别系统聚焦野外采食安全与食品安全场景解决普通用户难以凭肉眼准确辨别蘑菇是否有毒的现实问题。项目基于YOLOv5目标检测算法构建集成训练好的模型与图形化交互界面支持用户上传图片一键识别并输出毒性判断结果。压缩包共53个文件包含9个核心Python源码如mogu.py、gui_util.py、models/yolo.py等、23张标注与界面用PNG图像、20个编译后pyc文件及1份readme说明整体30.98MB目录结构清晰涵盖数据加载、模型推理、GUI组件与UI资源四大模块。已有130人学习下载读者可直接运行体验完整流程获取从模型调用、图像预处理到Tkinter界面集成的全链路代码实现并参考内置图像样本与模块化设计快速理解YOLOv5在小众垂直领域的落地方法。1. 项目整体设计与技术选型1.1 项目背景与核心需求蘑菇识别这个项目并不是我一时兴起做的玩具。平时喜欢去山里采风时不时会看到各种野生蘑菇而每年因为误食毒蘑菇进医院的新闻都不少。虽然我不是真菌学专家但作为搞CV的开发者我觉得完全可以用目标检测技术做一个“能认蘑菇、能提示风险”的工具出来。这个项目最后做成了一套基于yolov5的蘑菇检测识别系统准确地说是一个带GUI界面的应用程序集成了模型推理、结果显示、风险提示这些功能既能识别蘑菇的品种也能输出“有毒/无毒”的参考判断。先说清楚这个项目的边界。任何基于视觉的蘑菇识别系统都不能替代专业人士的鉴定更不能成为“采食依据”。这一点我在项目里写得很明确GUI里的提示语也是“识别结果仅供参考不构成食用建议”。做这个项目的核心目的是给蘑菇爱好者、生物科普学习者、以及想练手yolov5落地流程的开发者提供一个完整可运行的参考实现。你拿到这套源码能看到从数据集整理、模型训练、GUI封装到最终打包的全部环节这也是我写这篇文章的初衷。1.2 技术选型为什么是yolov5而不是其他模型目标检测领域现在可以选择的技术栈其实很多老牌的Faster R-CNN、SSD新一点的EfficientDet、YOLOX还有没法绕开的yolov5生态。我最终选yolov5主要基于三个方面的考虑。第一是工程成熟度。yolov5在GitHub上社区活跃度极高issue回答完善网上能搜到的踩坑记录也非常多对做个人项目来说这个生态意味着遇到问题大概率别人已经遇到过。第二是推理速度和精度的平衡蘑菇识别不是实时性要求极高的场景但训练和推理都不希望太慢yolov5s这种体量的模型在一块普通消费级显卡上就能跑得动CPU推理也能做到秒级响应这在做GUI演示的时候尤其重要。第三是部署成本低yolov5官方仓库自带导出脚本PyTorch模型可以直接导出成TorchScript、ONNX等格式后面做Python GUI集成非常方便。当然如果你手头的显卡比较紧张或者对精度有更高要求也可以考虑yolov5m甚至yolov5l我在后面的训练策略部分会给出不同档位的对比和选择建议。1.3 系统整体架构这个项目的代码结构并不复杂主要分三大模块数据集与训练模块包括数据标注、数据集划分、训练脚本、训练结果输出。推理模块加载训练好的模型权重对输入图片做预处理、目标检测、后处理输出检测框、类别、置信度。GUI交互模块基于PySide6也可以改用PyQt5实现负责文件选择、实时显示、识别结果展示和风险提示。三者之间通过一个自定义的推理类解耦。GUI层只跟推理类打交道不直接操作模型文件这样后续如果要换模型、换目标检测框架只需要改推理类的内部实现GUI部分几乎不用动。2. 数据集准备与预处理2.1 蘑菇图像数据的来源与整理训练一个能用的蘑菇识别模型数据是最大的门槛。网上关于蘑菇的公开数据集其实不少但质量参差不齐而且类别体系很混乱。有的数据集按“有毒/无毒”二分类来组织有的则是按具体品种来组织比如Amanita muscaria毒蝇伞、Boletus edulis美味牛肝菌、Cantharellus cibarius鸡油菌这些。我在这个项目里采用的是按“品种名”标注、在展示层映射为“有毒/无毒”标签的做法因为只做二分类的话模型学到的特征太粗糙遇到没见过的蘑菇容易瞎猜按品种训练能让模型学到更细粒度的纹理、颜色、形状特征推理结果也更有参考价值。我整理数据集的时候主要从两个方向下手一是公开数据集平台比如Kaggle上有一些蘑菇图片集另外就是自己采集。自己采集图片注意不要只拍俯视图蘑菇在不同生长阶段、不同角度下的外形差异很大我最终的数据集里每类蘑菇都尽量包含幼体、成熟体、菌盖正面、菌盖背面、菌柄这几个视角的图片大概3500张左右覆盖了10个常见品种其中既有可食用的也有有毒的。2.2 数据标注LabelImg标注要点目标检测的数据标注我用的是LabelImg这个工具虽然界面朴素但胜在轻量、不需要配置环境、开箱即用。标注的逻辑很简单框出蘑菇主体给它打上类别标签。但实际操作中有几个细节非常影响训练效果我踩过坑这里重点说一下。一是标注框要尽量紧贴蘑菇边缘但不需要精确到每一个菌褶。很多新手喜欢把框画得特别大把背景的树叶、泥土也框进去。背景信息过多会干扰特征提取因为模型不知道该学“蘑菇”还是该学“蘑菇旁边的树叶”。我一般建议标注框在蘑菇最外缘的基础上再缩1%到2%的边距这样既不会切掉菌盖边缘也不会框进太多杂质。二是对于图像中有多个蘑菇的情况每个蘑菇都要单独标注哪怕部分被遮挡。遮挡严重的蘑菇直接跳过不标因为这会导致模型在训练时学到残缺的特征。三是标注完一定要用脚本检查一遍类别名的拼写一致性LabelImg不会自动纠正你打错字我遇到过“chanterelle”和“chanterrelle”混用结果训练时模型报错排查了半天才发现是标签文件名对不上。2.3 数据增强策略目标检测任务里数据增强是提升模型泛化能力的利器。yolov5本身内置了Mosaic增强、随机仿射变换、HSV扰动这些策略训练时默认开启不需要你再额外写增强代码。但内置增强不等于什么都不用管我根据蘑菇识别的场景特点手动补了两块逻辑。第一是上下翻转增强。蘑菇是自然物体不存在“倒过来就不是蘑菇”的问题yolov5默认训练时上下翻转的概率是0.5我调到了0.7相当于把一个蘑菇图片“免费”翻倍了。第二是针对光线条件的增强。野生蘑菇图片经常是在树荫下拍摄的曝光差异很大我额外对数据集做了亮度、对比度的离线增强模拟了暗光、逆光的情况这样模型在实际使用中遇到光线不太好的照片时不至于直接失明。当然也要注意增强的边界不能把训练数据增强到失真。如果图片增强后颜色变得完全不像真实蘑菇了那这个样本对训练是负贡献。yolov5的配置文件里有一个hsv_h、hsv_s、hsv_v参数默认分别是0.015、0.7、0.4这个配置我个人觉得在蘑菇数据集上表现还可以不需要再加大。3. 模型训练与调参实战3.1 环境搭建与依赖安装模型的训练环境我是基于conda管理的Python版本用了3.9PyTorch用的2.0.1CUDA版本11.8。说实话yolov5对Python版本的兼容性很友好3.8到3.10基本都能跑不用太纠结。创建环境的命令很简单但有几个依赖坑要提醒。yolov5项目的requirements.txt里有几个包在装的时候经常有人踩坑。第一个是opencv-python如果机器上之前装过opencv-contrib-python直接pip install -r requirements.txt可能会产生冲突建议先统一卸载再装。第二个是pyyaml老版本yolov5对pyyaml版本比较敏感装太新的5.4可能报错我建议指定pyyaml5.4.1。第三个是matplotlib这个包在训练过程中会用来画指标曲线但如果服务器是无桌面环境的import matplotlib时可能报找不到display的错装的时候建议直接带参数安装。conda create -n mushroom python3.9 conda activate mushroom pip install torch2.0.1 torchvision0.15.2 --index-url https://download.pytorch.org/whl/cu118 git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt pyyaml5.4.13.2 数据集配置与目录结构yolov5训练自己的数据集需要准备三个关键文件数据集配置文件my_mushroom.yaml、标注好的图片目录、以及标签目录。整个目录结构建议这样组织mushroom_dataset/ ├── images/ │ ├── train/ # 训练图片 │ └── val/ # 验证图片 ├── labels/ │ ├── train/ # 训练标注txt │ └── val/ # 验证标注txt └── my_mushroom.yamlyaml文件里要指定训练集和验证集的绝对路径以及类别数量、类别名称列表。这里有个常见错误yolov5的标签文件是txt格式每行内容为“class_id x_center y_center width height”坐标值都是归一化到0到1之间的。从LabelImg导出的时候默认的export格式是VOC XML不要忘了转换成yolov5要求的格式。yolov5仓库里自带了convert2yolo的脚本但只支持COCO和VOC的部分字段解析我自己写了一个转换脚本简单粗暴直接遍历XML文件提取坐标信息。写脚本的时候注意一个细节XML里坐标是左上角和右下角的绝对坐标转换公式是x_center (x_min x_max) / 2 / image_width y_center (y_min y_max) / 2 / image_height width (x_max - x_min) / image_width height (y_max - y_min) / image_height我把代码贴出来方便你直接参考import xml.etree.ElementTree as ET import os def convert_xml_to_txt(xml_path, output_path, image_width, image_height, class_map): tree ET.parse(xml_path) root tree.getroot() with open(output_path, w) as f: for obj in root.iter(object): cls_name obj.find(name).text if cls_name not in class_map: continue cls_id class_map[cls_name] bbox obj.find(bndbox) x_min int(bbox.find(xmin).text) y_min int(bbox.find(ymin).text) x_max int(bbox.find(xmax).text) y_max int(bbox.find(ymax).text) x_center (x_min x_max) / 2.0 / image_width y_center (y_min y_max) / 2.0 / image_height w (x_max - x_min) / image_width h (y_max - y_min) / image_height f.write(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}\n) class_map {Amanita_muscaria: 0, Boletus_edulis: 1, Cantharellus_cibarius: 2}3.3 训练参数选择与过程记录yolov5模型的训练命令核心参数就这些python train.py \ --data my_mushroom.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --device 0 \ --name mushroom_run这里每一个参数背后都是有讲究的。img参数也就是输入图片尺寸直接决定了模型能看到的细节程度。蘑菇的辨识特征很多都在菌盖花纹和菌柄纹理上我试过416和640两档416在验证集上的mAP明显低于640因为小目标在416尺寸下丢失了太多纹理信息。当然不是越大越好如果设成1280显存占用会暴涨训练速度也急剧下降而且推理时间变长对GUI应用不友好。最终选640这是精度和速度的平衡点。batch参数尽量调大在显存允许的情况下batch越大训练越稳定。不过这里有个经验值对于蘑菇这种数量不算特别多单类几百张的小型数据集batch过大反而容易过拟合。我用的是16跑100个epochs大约需要3到4个小时取决于显卡性能。训练过程中的指标观察点也有讲究不要太早看结果。yolov5的训练日志里会打印出Box Loss、Obj Loss、Cls Loss、mAP这些指标前20个epoch内loss下降会非常快之后进入平台期我习惯把关注点放在val/0.95mAP这个指标上它是综合衡量检测效果的核心指标。我这里训练结束后验证集上的mAP0.5在0.86左右mAP0.5:0.95在0.68左右对一个10类、3000多张图片的数据集来说算是一个很可用的水平。如果你想要更高精度可以尝试yolov5mmAP能再涨两到三个点但模型体积从14MB涨到40MB推理时间也会增加个人项目还是建议用s就够了。3.4 超参数优化心得yolov5官方文档里提到超参数是“model hypnosis”比如lr0初始学习率、lrf最终学习率、momentum、weight_decay这些。对新手来说直接使用默认超参数是完全没有问题的因为yolov5的默认配置经过了大量数据集的验证。我自己在这个项目里只调整了一个地方就是把anchor的三个尺度调的更小一些。因为蘑菇目标在图片中的面积占比通常不大尤其是在野外拍摄的场景里很多蘑菇只占图片的很小一块。yolov5有一个auto anchor的功能训练时会自动计算适合数据集的anchor尺寸但为了稳妥我直接在模型配置文件里手动重算了一次然后把yolov5s.yaml里的anchor替换成了自己的值。原理也很好理解anchor是模型预设的候选框如果预设的框尺度跟真实目标差距太大模型学习起来会很费劲收敛也慢。你如果跑训练的时候发现训练日志里出现“Autoanchor: 2.1 anchors/target, 0.92 Best Possible Recall”说明anchor还算合理。如果这个数明显偏低比如低于0.8那就要考虑手动调整anchor了。4. GUI界面设计与交互实现4.1 GUI库选型为什么不用tkinter做Python桌面端GUI绕不开的选择就是tkinter、PyQt/PySide和wxPython。tkinter虽然Python自带轻量、上手快但做视觉类的展示界面会非常吃力。你要在一个tkinter窗口里实时刷新摄像头画面或者显示带检测框的图片需要自己处理很多底层绘制逻辑视觉效果也比较简陋。而PySide6是Qt官方支持的Python绑定界面美观度、控件丰富程度、图标资源支持都比tkinter好得多而且它的QThread机制对于“GUI主线程不能被推理过程阻塞”这个核心需求是官方级别的支持。那PySide6和PyQt5又怎么选两者用法几乎一致但PySide6是Qt官方亲儿子LGPL协议更宽松对个人项目没有任何授权风险我用的是PySide6。安装也很简单pip install PySide64.2 界面布局与功能模块我的GUI界面整体是一个典型的左侧控制、右侧展示的布局结构。左侧是一个控制面板包含三块功能区域图片选择按钮、识别参数配置置信度阈值滑动条、识别结果信息区。右侧是一个大的图片显示区域用来展示原图和识别后的标注图。具体控件的布局代码如下from PySide6.QtWidgets import (QMainWindow, QWidget, QHBoxLayout, QVBoxLayout, QPushButton, QLabel, QSlider, QTextEdit) from PySide6.QtCore import Qt from PySide6.QtGui import QPixmap, QImage class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle(蘑菇识别系统) self.setMinimumSize(1024, 680) central_widget QWidget() self.setCentralWidget(central_widget) main_layout QHBoxLayout(central_widget) # 左侧控制面板 left_layout QVBoxLayout() self.btn_open QPushButton(打开图片) self.btn_open.clicked.connect(self.open_image) left_layout.addWidget(self.btn_open) self.btn_detect QPushButton(开始识别) self.btn_detect.clicked.connect(self.run_detect) left_layout.addWidget(self.btn_detect) left_layout.addWidget(QLabel(置信度阈值)) self.slider_conf QSlider(Qt.Horizontal) self.slider_conf.setRange(10, 90) self.slider_conf.setValue(25) left_layout.addWidget(self.slider_conf) self.text_result QTextEdit() self.text_result.setReadOnly(True) left_layout.addWidget(self.text_result) left_layout.addStretch() # 右侧图片区域 self.label_img QLabel(请选择图片) self.label_img.setAlignment(Qt.AlignCenter) self.label_img.setMinimumSize(700, 600) main_layout.addLayout(left_layout, 1) main_layout.addWidget(self.label_img, 3)这个布局看起来很简单但它对应了使用过程中的全部交互逻辑。图片选择通过QFileDialog获取图片路径点击识别后调用推理类推理完成后把带检测框的图片转成QPixmap显示在右侧区域同时把识别到的蘑菇品种、置信度、是否有毒、风险提示这些信息输出到左侧的文本区域里。4.3 线程处理推理不卡界面的关键这个点必须单独拎出来说因为很多初学者的GUI项目看起来能跑但一执行推理整个界面就卡死不动了鼠标变成转圈圈原因就是推理过程占据了GUI的主线程。Qt的窗口事件循环被阻塞界面自然无法响应。解决方案就是使用QThread把耗时操作放到子线程。我对推理类的封装方式比较务实写一个继承自QObject的工作类通过signal把推理结果传回主线程。核心逻辑大致是from PySide6.QtCore import QThread, Signal, QObject class DetectWorker(QObject): finished Signal(dict) def __init__(self, image_path, conf_thres): super().__init__() self.image_path image_path self.conf_thres conf_thres def run(self): # 这里调用模型推理 result self.detect() self.finished.emit(result) def detect(self): # 具体推理逻辑包括预处理、模型前向传播、后处理 pass class MainWindow(QMainWindow): def start_detect(self): self.worker DetectWorker(self.image_path, self.conf_thres) self.thread QThread() self.worker.moveToThread(self.thread) self.thread.started.connect(self.worker.run) self.worker.finished.connect(self.thread.quit) self.thread.start()注意这里不能直接把自建的worker对象new出来就start一定要用moveToThread把worker迁移到新线程里否则worker里的槽函数还是在主线程执行的等于白做。我刚开始写这块的时候没注意moveToThread结果界面上确实不卡了但代码逻辑一团糟一调试才发现槽函数全在主线程跑信号没有真正跨线程传递。4.4 图片显示与检测框绘制图片显示这一块yolov5源码里自带的plot_one_box方法可以直接在numpy格式的图上画检测框和标签。为了跟PySide6的显示对接我做的处理是让yolov5推理完直接返回annotated imagenumpy数组然后把这个数组转成QImage再转成QPixmap显示。转换代码注意通道顺序yolov5返回的图是BGR顺序需要先转成RGBdef ndarray_to_qpixmap(self, img): if img.ndim 3: rgb_img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) h, w, ch rgb_img.shape bytes_per_line ch * w q_image QImage(rgb_img.data, w, h, bytes_per_line, QImage.Format_RGB888) else: h, w img.shape q_image QImage(img.data, w, h, w, QImage.Format_Grayscale8) return QPixmap.fromImage(q_image)另外窗口大小和图片尺寸不一致的时候直接用QPixmap显示会导致图片被拉伸变形。我一般会让QLabel设置setScaledContents(False)然后用scale保留宽高比否则检测框的位置会和图片显示位置产生偏移看起来就很怪。5. 完整识别流程从图片到结果5.1 模型加载与预处理推理模块的核心是把训练好的权重文件加载进来同时完成数据预处理。yolov5仓库自带detect.py脚本但那个脚本面向命令行批量推理不适合直接在GUI里调用。我单独写了一个mushroom_detector.py里面封装了模型推理类。关键是继承yolov5的DetectionModel这样既能复用yolov5的前处理逻辑也能方便地做参数控制。import torch import cv2 import numpy as np from models.experimental import attempt_load from utils.general import non_max_suppression, scale_coords from utils.augmentations import letterbox class MushroomDetector: def __init__(self, weights_path, devicecpu): self.device torch.device(device) self.model attempt_load(weights_path, map_locationself.device) self.model.eval() def preprocess(self, img_src): img letterbox(img_src, new_shape640, stride32, autoTrue)[0] img img.transpose((2, 0, 1))[::-1] img np.ascontiguousarray(img) img_tensor torch.from_numpy(img).to(self.device) img_tensor img_tensor.float() / 255.0 if img_tensor.ndimension() 3: img_tensor img_tensor.unsqueeze(0) return img_tensor def detect(self, img_src, conf_thres0.25, iou_thres0.45): img_input self.preprocess(img_src) with torch.no_grad(): pred self.model(img_input)[0] pred non_max_suppression(pred, conf_thres, iou_thres) return predletterbox是个重要的预处理步骤它的作用是把原始图片等比缩放到640x640的尺寸同时用灰色填充边缘空白部分保证原始图片不会因为拉伸而变形。如果你直接用cv2.resize把它强行拉伸到640x640蘑菇的形状会发生畸变检测框的位置也会不准。5.2 后处理与结果映射模型输出的pred是一个tensor第一维是batch第二维是检测到的目标内容是[x1, y1, x2, y2, confidence, class_id]。这个坐标是相对于640x640缩放后图像的跟原图尺寸对不上需要做一个反算yolov5提供了scale_coords方法可以直接处理。我封装了一个结果解析函数def parse_results(self, pred, img_src_shape): results [] for det in pred: if len(det): det[:, :4] scale_coords(det[:, :4], (640, 640), img_src_shape).round() for *xyxy, conf, cls in reversed(det): cls_id int(cls) class_name self.names[cls_id] risk_level self.risk_map.get(class_name, unknown) results.append({ box: [int(v) for v in xyxy], confidence: float(conf), class_name: class_name, risk: risk_level }) return resultsrisk_map是一个把品种名映射到“有毒/无毒/未知”的字典。比如“Amanita_muscaria”映射为有毒“Boletus_edulis”映射为无毒。这个映射关系是固定的基于菌类常识和已有数据做的静态映射不涉及任何推测。5.3 视频与摄像头识别扩展虽然GUI主要面向图片识别但代码层面上我也做了视频流的支持。yolov5的推理流程对图片和视频帧是通用的只需要把cv2.VideoCapture读到的每一帧传给detect方法即可。在这个基础上我也做了摄像头实时识别的简单演示。不过这里注意帧率的控制如果推理速度跟不上摄像头帧率就会导致画面卡顿。我的处理方式是在GUI里加一个间隔帧率控制每三帧只推理一帧其余两帧直接显示原图这样体验会流畅很多。6. 常见问题与排查技巧实录6.1 模型加载报错路径与权重文件不匹配这是使用过程中最常见的问题。模型加载时报“not a directory”或者“no such file or directory”的错误通常是weights路径错误。训练好的模型在yolov5/runs/train/mushroom_run/weights/目录下会有best.pt和last.pt两个文件使用时优先选择best.pt它是验证集上表现最好的权重。如果你的代码和权重文件不在同一个目录下建议使用绝对路径不要依赖相对路径因为GUI程序的工作目录可能和脚本所在目录不一致。6.2 检测框位置偏了如果检测框在GUI里画出来发现跟实物对不上首先检查是不是图片显示阶段做了缩放导致显示坐标变了。我再强调一次缩放显示图片检测框坐标也要跟着缩放正确做法是在QPixmap真实显示的尺寸上按比例换算检测框坐标。不要直接拿原始图片的检测坐标画在缩放后的图片上那肯定错位。6.3 GPU显存不足训练或者推理时如果报CUDA out of memory可以手动调小batch size或者推理时改用CPU。yolov5默认会优先使用GPU但个人电脑显存只有6G甚至更少的话训练时batch设成8甚至4图片尺寸降到480也能正常训练只是慢一些。推理时用CPU并不会慢到不能接受一张640x640图片大概是1到2秒对GUI交互来说是够用的。6.4 打包成exe后缺模型文件用PyInstaller把GUI程序打包成exe时很多人会遇到一个问题程序在开发环境里跑得好好的打包后双击就没反应。通常是因为模型权重文件.torchscript或.pt没有被正确打包进exe。我的建议是不要把模型文件打包进exe内部而是把模型作为外部资源文件放在exe同级的model/目录下程序启动时动态加载。这样既方便后续更新模型不重新打包exe也避免了PyInstaller处理深度学习模型文件时的各种隐性问题。PyInstaller打包时还需要额外注意yolov5项目的几个数据文件比如classes.txt、yaml配置文件以及utils、models这些目录下的Python文件。我最终打包命令是这样的pyinstaller --onefile --windowed --add-data ./model/best.pt;./model --add-data ./mushroom_classes.txt;. --iconmushroom.ico app.py如果打包后程序报错建议先用--console模式打包一次这样能直接看到错误日志排查起来效率高很多。6.5 置信度阈值调整GUI里我放了一个阈值滑动条这个设计是出于实际使用考量。不同场景下对置信度阈值的要求不同如果只是做科普展示希望尽量多地框出蘑菇阈值可以调到0.2如果要做严格的风险提示不希望出现太多错误检测阈值可以调到0.5以上。我的代码里默认是0.25这是yolov5的通用推荐值但实际使用中我试过把有毒蘑菇识别相关的推理阈值定在0.35误检率会下降很多。7. 演示效果与经验总结项目做完之后我自己在本地做了几组测试。用训练集外的野生蘑菇照片测试大部分场景下识别效果都让人满意特别是菌盖特征明显的毒蝇伞和鸡油菌检测框很稳置信度经常能到0.8以上。最难的是一张蘑菇只露出一小部分、或者背景特别复杂的情况这个时候模型会把树叶或者石头误判成蘑菇解决方法就是前面说的提高阈值或者后期在数据增强里加入更多背景干扰样本。从代码层面讲这个项目最有价值的地方不是“用yolov5训练了一个模型”而是“把一个深度学习模型完整地封装成了一个有交互界面的应用”。从数据标注到模型训练再到GUI集成和打包部署这里面的每一步都有值得注意的坑。我实际调试中最花时间的地方是GUI线程和模型推理的协作这部分搞清楚之后所有类似的项目都可以复用同一套设计模式。这套源码后续还可以做很多扩展。比如接入摄像头实时识别让用户在野外拍摄时直接看到提示或者把模型换成yolov8、换成最新的YOLO系列接口也可以把GUI界面改成移动端或者Web端把推理服务挂到后端。对我个人来说做这个项目最大的收获是理解了“模型是核心但不是全部”这句话——一个能被普通人使用的AI工具除了模型精度之外交互设计、错误处理、结果解释缺一不可。本文还有配套的精品资源点击获取
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻