ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

YOLOV11有毒蘑菇识别系统:SpringBoot+Vue+Flask全栈部署实战

YOLOV11有毒蘑菇识别系统:SpringBoot+Vue+Flask全栈部署实战 1. 核心技术栈与功能定位这一个把深度学习目标检测和后端管理系统串起来的完整项目。识别对象是有毒蘑菇底层用 YOLOV11 做图像检测前端用 Vue 展示后端用 SpringBootMySQL 存储与管理中间再用 Flask 搭一层 Python 推理服务。从模型训练到 Web 展示链路是齐全的。适合拿来学习 YOLOV11 工程化落地也适合毕设、课设、实验室项目。你要是想搞懂“训练好的模型怎么接进管理系统”这一套结构是一个很典型的参考。1.1 先看这套系统的核心能力能力项说明模型算法YOLOV11Ultralytics 目标检测识别对象有毒蘑菇图像检测与分类推理服务Python PyTorch Flask 提供模型调用接口管理后台SpringBoot 提供业务接口Vue 做前端页面数据存储MySQL 保存识别记录、蘑菇种类、用户信息等部署模式前后端分离Python 推理服务独立部署适合场景蘑菇图像识别、农业科普、食品中毒预防实验、教学演示这个结构要解决的核心问题是模型训练和业务系统分离。YOLOV11 训练出来的.pt或.onnx模型不直接暴露给前端而是封装成 Flask 接口SpringBoot 作为中间层调用推理接口再把结果写入 MySQL最后 Vue 把结果渲染到页面。好处是模型升级不影响业务代码坏处是需要维护的服务多一点。1.2 适合什么读者已经会用 YOLO 系列做训练但对“如何集成到管理系统”没头绪的人。正在做 SpringBootVue 毕业设计需要一个真实 AI 功能模块的人。想整理一套“深度学习Web开发”完整项目经验放到简历上的读者。2. 适用场景与使用边界2.1 实际能做什么基于 YOLOV11 的有毒蘑菇识别系统常见的使用方式是用户上传蘑菇图片系统返回识别结果包括有毒/无毒判断、蘑菇种类、置信度、参考信息然后自动存档到 MySQL方便后续查询和统计。从技术上可以玩通的场景包括图片识别单张上传、识别、展示结果。批量检测前端批量提交图片后端逐张调用 Flask 推理接口。历史记录管理识别记录入库可按时间、结果类型筛选。数据库关联查询把蘑菇名称、毒素说明、分布区域等信息做成基础资料表。2.2 使用边界和合规提醒有毒蘑菇识别涉及生命安全。这里必须写清楚这个项目更适用于学习技术流程和实验演示不等同于专业毒菌鉴定工具。不要直接用识别结果指导野外采集或食用决策。如果项目要真实应用需要一个高精度的蘑菇数据集并且必须经过农林、真菌学专业人员评估。图片素材如果来自网络数据集注意数据集版权和使用授权。3. 环境准备与前置条件这个项目涉及四个环境Python 推理环境、Java 后端环境、Node 前端环境、MySQL 数据库。装错版本会非常痛苦下面给一套通用检查清单。3.1 Python 环境YOLOV11 推理依赖建议版本区间说明Python3.8 - 3.10太新的版本可能出现依赖兼容问题PyTorch2.xCUDA 版优先显卡驱动和 CUDA 版本要匹配ultralytics8.xYOLOV11 官方训练推理库Flask2.x / 3.x提供模型推理 HTTP 服务opencv-python4.x图像读取和预处理# 创建虚拟环境 conda create -n mushroom-yolo python3.9 conda activate mushroom-yolo # 安装 PyTorch有 GPU 时选择 CUDA 版本 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装 YOLOV11 和推理服务依赖 pip install ultralytics flask opencv-python # 如果没有 NVIDIA GPU用 CPU 版本也能跑只是速度更慢 # pip install torch torchvision3.2 Java 后端环境SpringBoot依赖建议版本说明JDKJDK 8 / JDK 11 / JDK 17根据你的 SpringBoot 大版本选择Maven3.6项目依赖管理SpringBoot2.7.x / 3.x需要配合 JDK 版本MySQL5.7 / 8.0数据库注意SpringBoot 3.x 要求 JDK 17SpringBoot 2.7 用 JDK 8 或 JDK 11 都行。如果你搜索到了“SpringBoot版本太高”的问题多半是 JDK 和 SpringBoot 大版本不匹配。# 检查版本 java -version mvn -v # SpringBoot 引依赖pom.xml 里加 Web、MyBatis、MySQL 驱动 # spring-boot-starter-web # mybatis-plus-boot-starter # mysql-connector-j3.3 Node 前端环境Vue依赖建议版本说明Node.js16 / 18 / 20长期稳定版均可npm8随 Node 安装Vue3.x / 2.x取决于模板项目node -v npm -v # Vue CLI 创建项目 npm install -g vue/cli vue create mushroom-front3.4 MySQL 数据库准备CREATE DATABASE mushroom_ai DEFAULT CHARACTER SET utf8mb4; -- 基础蘑菇类型表 CREATE TABLE mushroom_type ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100), is_poisonous TINYINT, description TEXT, image_url VARCHAR(255) ); -- 识别记录表 CREATE TABLE detection_record ( id INT PRIMARY KEY AUTO_INCREMENT, image_url VARCHAR(255), result_name VARCHAR(100), confidence DOUBLE, is_poisonous TINYINT, create_time DATETIME DEFAULT CURRENT_TIMESTAMP );这是最简表结构你按自己项目扩展字段即可。核心就两张表一张维护蘑菇种类一张记录每次识别结果。4. 环境部署与启动方式整个系统的启动顺序是先启动 Flask 推理服务再启动 SpringBoot最后启动 Vue 前端。4.1 Flask 推理服务from flask import Flask, request, jsonify from ultralytics import YOLO from PIL import Image import io app Flask(__name__) # 加载训练好的模型 model YOLO(best.pt) app.route(/predict, methods[POST]) def predict(): file request.files.get(image) if not file: return jsonify({code: 400, msg: no image}) image_bytes file.read() img Image.open(io.BytesIO(image_bytes)).convert(RGB) # 推理conf 阈值按实际效果调整 results model.predict(img, conf0.4, verboseFalse) # 提取第一个检测目标信息 for result in results: names result.names boxes result.boxes if boxes is None or len(boxes) 0: return jsonify({code: 404, msg: not detected}) class_id int(boxes.cls[0]) conf float(boxes.conf[0]) label names[class_id] return jsonify({ code: 200, name: label, confidence: round(conf, 4) }) return jsonify({code: 500, msg: predict error}) if __name__ __main__: app.run(host127.0.0.1, port5000)python app.py启动成功后本地 5000 端口就有推理接口了。可以用 curl 验证curl -X POST -F imagetest.jpg http://127.0.0.1:5000/predict返回 JSON 里包含name和confidence说明推理服务正常。这里要注意best.pt是你自己训练出来的权重文件路径不同项目命名可能不同。4.2 SpringBoot 后端服务SpringBoot 做两件事接收前端上传的图片。调用 Flask 推理服务拿结果并写入 MySQL。伪代码逻辑如下public DetectionResult detect(MultipartFile file) { // 1. 调用 Flask 推理服务 String flaskUrl http://127.0.0.1:5000/predict; HttpHeaders headers new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORMAT); MultiValueMapString, Object body new LinkedMultiValueMap(); body.add(image, file.getResource()); HttpEntityMultiValueMapString, Object requestEntity new HttpEntity(body, headers); RestTemplate restTemplate new RestTemplate(); ResponseEntityMap response restTemplate.postForEntity(flaskUrl, requestEntity, Map.class); // 2. 拿到推理结果 MapString, Object resultMap response.getBody(); String name (String) resultMap.get(name); Double conf (Double) resultMap.get(confidence); // 3. 写入 MySQL DetectionRecord record new DetectionRecord(); record.setResultName(name); record.setConfidence(conf); detectionRecordMapper.insert(record); return record; }启动 SpringBoot 的方式mvn clean package java -jar target/mushroom-backend-0.0.1-SNAPSHOT.jarapplication.yml里检查三个配置数据库连接信息、上传文件大小限制、Flask 服务地址。spring: datasource: url: jdbc:mysql://127.0.0.1:3306/mushroom_ai?useSSLfalse username: root password: your_password servlet: multipart: max-file-size: 10MB如果出现MySQL ssl连接错误在连接 URL 上加上useSSLfalse即可。如果出现时区问题加serverTimezoneAsia/Shanghai。4.3 Vue 前端服务前端核心功能是上传图片并展示识别结果最简单的实现方式是用 Element Plus 的上传组件配合 Axios 调 SpringBoot 接口。import axios from axios export function uploadImage(file) { const formData new FormData() formData.append(file, file) return axios.post(/api/detect, formData, { headers: { Content-Type: multipart/form-data } }) }组件里只需要维护两个状态图片预览地址和识别结果对象。上传后显示蘑菇名称、是否有毒、置信度这三个字段就够了。npm install npm run serveVue DevServer 默认跑在 8080SpringBoot 跑在 8081或者直接在 Vue 配置里写代理把/api转发到 SpringBoot。4.4 三者联调顺序Vue (8080) - SpringBoot (8081) - Flask (5000) - YOLOV11 模型 - MySQL调试时建议从下往上测。先直接 curl Flask确认模型能用再测 SpringBoot 对 Flask 的调用最后测 Vue 对 SpringBoot 的调用。如果一步到位联调失败很难知道是哪一层出了问题。5. 功能测试与效果验证5.1 Flask 推理服务测试测试样本一张蘑菇图片。curl -X POST -F imagetest.jpg http://127.0.0.1:5000/predict预期结果{ code: 200, name: Amanita muscaria, confidence: 0.87 }判断标准返回code:200有name和confidence说明推理流程通了。如果没有检测到目标会返回code:404。如果提示模型加载错误优先检查best.pt路径。5.2 SpringBoot 接口测试上传图片并调用/api/detectcurl -X POST -F filetest.jpg http://127.0.0.1:8081/api/detect预期结果{ id: 1, resultName: Amanita muscaria, confidence: 0.87, isPoisonous: 1 }注意isPoisonous应该由后端根据resultName查询mushroom_type表后补充而不是靠前端判断。5.3 Vue 前端页面测试打开前端页面后按以下步骤验证点击上传按钮选一张测试图片。页面显示图片缩略图。等待 2 - 10 秒取决于有没有 GPU。页面显示蘑菇名称、置信度、是否有毒。刷新页面后历史记录仍然存在说明已经写入 MySQL。如果图片一直在加载但无结果查看浏览器 Network 面板确认请求是否到了 SpringBoot、SpringBoot 是否成功调用了 Flask。哪一层断掉就修哪一层。5.4 批量识别测试如果要测批量识别可以先用 Python 脚本直接压测Flask接口import os import time import requests image_dir ./test_images url http://127.0.0.1:5000/predict for image_name in os.listdir(image_dir): image_path os.path.join(image_dir, image_name) if not os.path.isfile(image_path): continue with open(image_path, rb) as f: start time.time() response requests.post( url, files{image: f}, timeout30 ) elapsed time.time() - start print(f{image_name} - {response.json()} | {elapsed * 1000:.1f}ms)这个脚本可以帮你了解模型对单张图片的平均处理时间是多久、有没有检测失败的样本、并发情况下是否出现内存上涨。批量任务不应该在 SpringBoot 这一层用多线程狂发请求先把 Flask 压测通过再设计队列。6. 接口 API 与批量任务设计6.1 接口列表这套系统应有的接口大致如下接口方法功能/predictPOSTFlask图片推理/api/detectPOSTSpringBoot上传并识别记录入库/api/recordsGETSpringBoot分页查询历史记录/api/mushroomsGETSpringBoot蘑菇基础信息列表/api/mushrooms/{id}GETSpringBoot蘑菇详情6.2 Python 调用 Flask 接口示例import requests def predict_from_file(image_path): url http://127.0.0.1:5000/predict with open(image_path, rb) as f: response requests.post( url, files{image: f}, timeout30 ) return response.json() print(predict_from_file(img1.jpg))6.3 Java 调用 Flask 接口示例// 使用 RestTemplate 上传文件并获取结果 public MapString, Object callFlask(MultipartFile file) { String flaskUrl http://127.0.0.1:5000/predict; HttpHeaders headers new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); MultiValueMapString, Object body new LinkedMultiValueMap(); body.add(image, file.getResource()); HttpEntityMultiValueMapString, Object entity new HttpEntity(body, headers); RestTemplate restTemplate new RestTemplate(); ResponseEntityMap response restTemplate.postForEntity(flaskUrl, entity, Map.class); return response.getBody(); }这里推荐把 Flask 地址放到配置文件里不要写死在代码中。后面换 GPU 服务器或者换模型时直接改配置即可。6.4 批量任务建议批量识别不适合让前端一次性传几百张图片工程上更稳的做法是前端把批量图片上传到 SpringBoot。SpringBoot 把每个文件路径和状态存入batch_task表。后端定时任务或消息队列逐条调用 Flask。前端轮询查询任务进度完成后展示结果。如果你只是做课设简单循环就够了。如果是真实项目建议至少保存一份批次 ID每次识别完成后更新batch_id对应的记录状态。7. 资源占用与性能观察7.1 显存占用怎么观察训练完成的模型部署后显存占用主要看推理时加载的模型大小和图片分辨率。观察方式Linux 用nvidia-smi看显存和 GPU 利用率。Windows 任务管理器里能看到 GPU 专用显存占用。Python 代码里可以用pynvml读取显存状态。watch -n 1 nvidia-smi如果显存占用明显高往往是因为 YOLOV11 模型默认以 640 分辨率推理。可以调整imgsz320或imgsz480降低显存占用代价是准确率可能下降。results model.predict(img, imgsz320, conf0.4, verboseFalse)7.2 CPU 推理和 GPU 推理的差异CPU 推理能跑但单张图可能要几百毫秒到几秒。GPU 推理通常快几倍到几十倍。具体差多少不能一概而论和模型大小、CPU型号、显卡型号都有关系。测试方法很简单在 Flask 接口的打印日志里加一个耗时统计先 CPU 推理测一轮再 GPU 推理测一轮取平均值对比。真实业务高峰期如果单张推理超过 3 秒用户体验会明显变差。7.3 多进程与并发Flask 默认是单进程单线程。如果你直接用python app.py启动多个请求同时到达时会排队。真实项目至少用 gunicorn 或 waitress 启动gunicorn -w 2 -b 127.0.0.1:5000 app:app注意worker 数不宜设太多因为每个 worker 都会加载一份模型显存会成倍增长。2 个或 4 个 worker 就够用了。7.4 避免端口冲突和进程残留常见情况5000 端口被其他服务占用Flask 启动失败。8081 端口被占用SpringBoot 起不来。8080 端口被占用Vue 起不来。排查命令# Windows netstat -ano | findstr :5000 taskkill /PID 你的进程号 /F # Linux lsof -i :5000 kill -9 PID7.5 进程残留导致模型占用显存如果你关掉了 Flask 进程但显存没释放多半是 Python 进程没有完全退出。用nvidia-smi找到对应的 PID杀掉进程即可。模型推理时的临时显存占用了不要怕关键是不能有大量残留进程堆积。8. 常见问题与排查方法问题现象可能原因排查方式解决方案Flask 启动失败提示端口被占用5000 端口被其他服务占用netstat -anofindstr :5000模型权重加载报错best.pt路径错误或文件缺失检查权重文件是否在指定目录修正路径PyTorch 和 CUDA 版本不匹配驱动版本过低或 PyTorch 装成 CPU 版Python 里执行torch.cuda.is_available()重装匹配的 PyTorch推理时显存不足 OOM图片分辨率过高或批量图像太多nvidia-smi查看占用调低imgsz减小 batchSpringBoot 连不上 MySQL账号密码错、MySQL未启动、SSL报错看 SpringBoot 日志检查application.yml加useSSLfalseVue 请求 SpringBoot 跨域前后端端口不同未配置跨域浏览器 F12 看 CORS 报错后端加CrossOrigin或配置代理curl Flask 成功但 SpringBoot 调用 500MultipartFile 和 Flask 的files参数不匹配打印 SpringBoot 调用 Flask 的返回内容调整调用方式字段名保持image识别结果为 null阈值过高或图片确实没有目标降低conf阈值换测试图调整conf0.25左右再试批量任务跑一半卡住Flask 单进程阻塞或某张图异常看服务端日志加 timeout逐张打印日志Vue 上传图片后页面不刷新没有重新调用查询接口看 Network 面板识别成功后重新请求记录列表9. 最佳实践与使用建议9.1 数据集和模型训练的建议YOLOV11 识别有毒蘑菇效果几乎全部取决于数据集质量。如果你的数据集只覆盖几种常见毒蘑菇就不要把系统描述成“识别所有蘑菇”。模型识别是一个封闭集合问题数据集里没有的类别不可能被准确识别。如果要做项目展示建议数据集中每个类别至少 300 张以上训练图。图片中包含不同角度、光照、背景的蘑菇。标注时把“有毒蘑菇”和“无毒蘑菇”作为大类再细分小类。训练时用 YOLOV11 的yaml文件定义类别名推理时才能显示正确的中文名称。9.2 后端和模型解耦Flask 作为推理服务时不要和 SpringBoot 混在一个进程里。SpringBoot 里引 Python 模型是不现实的。把模型当远程服务调用是工程上最清晰的方式。9.3 稳定性与异常处理推理接口必须做超时处理。因为某一张图片异常可能导致整个请求阻塞Flask 是单线程时影响面更大。RestTemplate restTemplate new RestTemplate(); // 设置连接和读取超时 SimpleClientHttpRequestFactory factory new SimpleClientHttpRequestFactory(); factory.setConnectTimeout(3000); factory.setReadTimeout(30000); restTemplate.setRequestFactory(factory);9.4 界面演示效果Vue 识别页面上建议展示五类信息上传的图片预览、识别名称、置信度、是否有毒提示、检测框位置可选。检测框坐标可以从 Flask 接口中一并返回前端用 canvas 画出来。这会让演示效果明显更好。Flask 返回检测框的示例boxes result.boxes if boxes is not None and len(boxes) 0: box boxes[0].xyxy[0].tolist() x1, y1, x2, y2 box[:4] return jsonify({ code: 200, name: label, confidence: round(conf, 4), box: [x1, y1, x2, y2] })前端拿到box后在 canvas 绘制矩形框用户能直观看到模型识别的是图片里的哪个部分。这一步对验收效果提升非常明显。9.5 合规提醒蘑菇识别系统如果涉及真实用户反馈建议页面底部加一行提示“本系统识别结果仅供参考请勿依据本系统判断蘑菇是否可食用。”敏感、严谨、有必要。10. 总结与下一步从部署顺序看这套项目核心难度不在某个单一框架而在于跨语言链路打通Vue 传图到 SpringBootSpringBoot 转发到 FlaskFlask 加载 YOLOV11 模型推理再把结果写回 MySQL。这条链路任何一处断了整个项目都跑不通。第一次做完部署后建议先验证这三件事用curl直接测试 Flask 推理接口确认模型加载和推理正常。用浏览器直接访问 SpringBoot 的/api/detect接口确认能成功调用 Flask 并写库。在前端页面上传一张测试图片走完整个用户流程确认页面展示和历史记录都正确。最容易踩的坑集中在版本不匹配SpringBoot 和 JDK 的版本、PyTorch 和 CUDA 的版本、MySQL 连接参数这几个方向。只要按照第 3 节的环境清单逐项核对基本可以避免大量启动问题。如果后续要继续扩展可以考虑几个方向将 Flask 推理耗时和结果写入日志表做识别准确率统计。把 YOLOV11 导出成 ONNX使用 ONNX Runtime 加速推理减少 PyTorch 依赖。加入批量图片压缩和上传限制防止单张大图拖垮推理服务。加入 Redis 缓存热点图片的识别结果减少重复推理压力。补充蘑菇科普文章页面把识别结果和百科内容联动展示。这套项目是不是值得做关键看你当前的需求如果是为了学习 YOLOV11 工程化落地它结构清晰、技术栈完整如果是用来参加比赛或展示后端管理系统的完成度也能加分。建议按文中第 4 节的启动顺序先把链路跑通再逐步优化识别速度和界面效果。
返回列表