✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python项目 安卓项目 微信小程序项目
文章目录
- 一、前言
- 二、开发环境
- 三、系统界面展示
- 四、部分代码设计
- 五、论文参考
- 六、系统视频
- 结语
一、前言
本系统名为《基于深度学习的多作物叶片病害分类研究》,面向多作物叶片病害识别场景,把深度学习模型训练、ONNX部署和Web功能串成一个可操作的毕业设计系统。开发语言使用Python,深度学习部分基于PyTorch和Ultralytics YOLO,检测类采用YOLOv8s、YOLO26m等YOLO系列模型,分类类通过ConvNeXt-Tiny、ResNet等骨干网络做海选;训练过程采用短训海选、LR Finder、seed/warmup/cosine/EMA/AMP和EarlyStopping,最终保留best.pt,并通过export_run.py导出opset 17、simplify、NMS end2end的best.onnx。后端使用Django启动并加载best.onnx完成推理,前端使用Vue、ElementUI、ECharts、HTML、CSS、JavaScript和jQuery,数据存储使用MySQL。系统功能包括系统首页、用户管理、识别历史管理、识别历史、病害识别、图片识别、视频识别、摄像头识别、数据大屏、个人信息和修改密码;用户可上传图片或视频、调用摄像头画面进行病害识别,结果写入识别历史,数据大屏用ECharts以dark主题展示classBar等六类图表,方便查看识别记录和分类结果。
二、开发环境
开发语言:Python 深度学习框架:PyTorch(import torch / torch.cuda)+ Ultralytics YOLO 算法模型:检测类走 YOLO 系列(YOLOv8s、YOLO26m);分类类走骨干网络海选(ConvNeXt-Tiny、ResNet 等) 训练配方:短训海选 → LR Finder → seed/warmup/cosine/EMA/AMP → best.pt,EarlyStopping 数据/工具链:YOLO 归一化 cxcywh 标签或 ImageNet 目录、pandas/numpy、cleanlab + scikit-learn、albumentations 增强 模型部署:export_run.py 导出 ONNX(opset 17、simplify、NMS end2end),后端启动加载 best.onnx 可视化:ECharts 数据大屏(dark 主题,classBar 等六图) 后端框架:Django 前端:Vue+ElementUI+Echarts+HTML+CSS+JavaScript+jQuery 数据库:MySQL
三、系统界面展示
- 基于深度学习的多作物叶片病害分类研究系统界面展示:

四、部分代码设计
- 项目实战-代码参考:
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("LeafDiseaseHistoryAnalytics").master("local[*]").getOrCreate()
spark.range(1).count()
import os, json, time, base64, cv2, numpy as np, onnxruntime as ort
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from .models import RecognitionHistory
MODEL_PATH = os.path.join(os.path.dirname(__file__), "weights", "best.onnx")
CLASS_NAMES = [f"类别{i}" for i in range(10)]
session = ort.InferenceSession(MODEL_PATH, providers=["CPUExecutionProvider"])
def _preprocess_image(img):
img = cv2.resize(img, (640, 640))
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = img.astype(np.float32) / 255.0
img = np.transpose(img, (2, 0, 1))
return np.expand_dims(img, axis=0)
def _parse_pred(outputs):
pred = outputs[0][0]
if pred.ndim == 1:
cls_id = int(np.argmax(pred))
score = float(np.max(pred))
else:
cls_id = int(np.argmax(pred[:, 4]))
score = float(np.max(pred[:, 4]))
return cls_id, score
@csrf_exempt
def image_predict(request):
if request.method != "POST":
return JsonResponse({"code": 400, "msg": "请求方式错误"})
file = request.FILES.get("image")
if not file:
return JsonResponse({"code": 400, "msg": "请上传图片"})
raw = file.read()
arr = np.frombuffer(raw, np.uint8)
img = cv2.imdecode(arr, cv2.IMREAD_COLOR)
if img is None:
return JsonResponse({"code": 400, "msg": "图片解析失败"})
input_tensor = _preprocess_image(img)
input_name = session.get_inputs()[0].name
outputs = session.run(None, {input_name: input_tensor})
cls_id, score = _parse_pred(outputs)
label = CLASS_NAMES[cls_id % len(CLASS_NAMES)]
user_id = request.session.get("user_id")
history = RecognitionHistory.objects.create(user_id=user_id, source_type="image", file_name=file.name, result_label=label, score=score, raw_json=json.dumps({"shape": list(outputs[0].shape)}))
return JsonResponse({"code": 200, "history_id": history.id, "label": label, "score": round(score, 4)})
@csrf_exempt
def video_predict(request):
if request.method != "POST":
return JsonResponse({"code": 400, "msg": "请求方式错误"})
file = request.FILES.get("video")
if not file:
return JsonResponse({"code": 400, "msg": "请上传视频"})
save_path = os.path.join("media", "video", file.name)
os.makedirs(os.path.dirname(save_path), exist_ok=True)
with open(save_path, "wb") as f:
for chunk in file.chunks():
f.write(chunk)
cap = cv2.VideoCapture(save_path)
frame_count = 0
hit_count = 0
last_label = "未识别"
last_score = 0.0
input_name = session.get_inputs()[0].name
while cap.isOpened() and frame_count < 30:
ok, frame = cap.read()
if not ok:
break
frame_count += 1
if frame_count % 5 != 0:
continue
input_tensor = _preprocess_image(frame)
outputs = session.run(None, {input_name: input_tensor})
cls_id, score = _parse_pred(outputs)
if score >= 0.5:
hit_count += 1
last_label = CLASS_NAMES[cls_id % len(CLASS_NAMES)]
last_score = score
cap.release()
user_id = request.session.get("user_id")
history = RecognitionHistory.objects.create(user_id=user_id, source_type="video", file_name=file.name, result_label=last_label, score=last_score, raw_json=json.dumps({"frames": frame_count, "hits": hit_count}))
return JsonResponse({"code": 200, "history_id": history.id, "label": last_label, "score": round(last_score, 4), "frames": frame_count})
@csrf_exempt
def camera_predict(request):
if request.method != "POST":
return JsonResponse({"code": 400, "msg": "请求方式错误"})
payload = json.loads(request.body.decode("utf-8"))
image_base64 = payload.get("image_base64", "")
if not image_base64:
return JsonResponse({"code": 400, "msg": "缺少画面数据"})
if "," in image_base64:
image_base64 = image_base64.split(",", 1)[1]
raw = base64.b64decode(image_base64)
arr = np.frombuffer(raw, np.uint8)
img = cv2.imdecode(arr, cv2.IMREAD_COLOR)
if img is None:
return JsonResponse({"code": 400, "msg": "画面解析失败"})
input_tensor = _preprocess_image(img)
input_name = session.get_inputs()[0].name
outputs = session.run(None, {input_name: input_tensor})
cls_id, score = _parse_pred(outputs)
label = CLASS_NAMES[cls_id % len(CLASS_NAMES)]
user_id = request.session.get("user_id")
history = RecognitionHistory.objects.create(user_id=user_id, source_type="camera", file_name="camera_frame.jpg", result_label=label, score=score, raw_json=json.dumps({"frame_time": time.time()}))
return JsonResponse({"code": 200, "history_id": history.id, "label": label, "score": round(score, 4)})
五、论文参考
- 计算机毕业设计选题推荐-基于深度学习的多作物叶片病害分类研究系统-论文参考:

六、系统视频
- 基于深度学习的多作物叶片病害分类研究系统-项目视频: 点击链接观看项目演示视频
结语
计算机毕业设计选题推荐:基于深度学习的多作物叶片病害分类研究|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目 大家可以帮忙点赞、收藏、关注、评论啦~ 源码获取:⬇⬇⬇
精彩专栏推荐⬇⬇⬇ Java项目 Python项目 安卓项目 微信小程序项目




