核心内容摘要
文脉定序系统Python爬虫实战:智能语义重排序与数据采集
YOLODeepSeek农作物病虫害检测系统【结合DeepseekQwen】【可以上传文件夹批量检测可以导出图片检测结果为PDF文件】可以实现检测图片、批量检测图片、视频检测、摄像头检测四种方式。
能够检测出[“苹果-黑腐病”, “苹果-健康”, “苹果-结痂”, “甜椒-细菌性斑疹”, “甜椒-健康”, “木薯-褐条病”, “木薯-细菌性枯萎病”, “木薯-绿斑病”, “樱桃-健康”, “樱桃-白粉病”, “玉米-叶斑病”, “玉米-普通锈病”, “玉米-健康”, “葡萄-黑腐病”, “葡萄-健康”, “葡萄-叶枯病”, “木薯-健康”, “木薯-花叶病毒”, “玉米-大斑病”, “柑桔-黄龙病”, “桃子-桃细菌性穿孔病”, “桃子-健康”, “土豆-早疫病”, “土豆-健康”, “土豆-晚疫病”, “水稻-褐斑病”, “水稻-健康”, “水稻-稻瘟病”, “草莓-白粉病”, “草莓-健康”, “草莓-角斑病”, “番茄-细菌性斑疹病”, “番茄-早疫病”, “番茄-晚疫病”, “番茄-健康”, “番茄-叶霉病”, “番茄-斑枯病”]37种检测情况。
结合DeepSeek、Qwen等大模型对检测结果给出相关建议并可将检测报告导出为PDF文件。
另外添加可视化界面对检测结果进行可视化显示。
技术栈使用YOLO、DeepSeek、Qwen、Pytorch、SpringBoot、MyBatis-Plus、Vue
Echarts、Ts、element-plus、Flask、Axios、MySQL等技术。
系统还支持分用户管理。
分为管理员和普通用户管理员可查看所有记录并管理用户。
普通用户只可查看自己的记录。
界面简洁、美观。
支持主题色修改、布局样式修改、组件大小修改等。
源码部署教程11基于 YOLO DeepSeek 的农作物病虫害检测系统的完整技术架构、功能解析与详细代码实现含前后端支持✅ 37 类病虫害检测✅ 图片/批量/视频/摄像头检测✅ 结合 DeepSeek / Qwen 提供智能建议✅ 检测结果导出 PDF 报告✅ 用户权限管理管理员/普通用户✅ 数据可视化ECharts✅ 前后端分离SpringBoot Vue3✅
系统概览项目内容系统名称基于 YOLO DeepSeek 的农作物病虫害检测系统核心算法YOLOv8目标检测 DeepSeek / Qwen大模型建议生成检测类别37 类如苹果黑腐病、番茄晚疫病等数据集规模10,000 张标注图像YOLO 格式部署方式Web 端 后端服务 MySQL 数据库技术栈- 前端Vue3 TypeScript Element Plus ECharts Axios- 后端SpringBoot MyBatis-Plus FlaskAI 推理- AI 模型YOLOv8 DeepSeek API / Qwen API- 数据库MySQL- 部署Docker Nginx✅
37 类病虫害分类表[苹果-黑腐病,苹果-健康,苹果-结痂,甜椒-细菌性斑疹,甜椒-健康,木薯-褐条病,木薯-细菌性枯萎病,木薯-绿斑病,樱桃-健康,樱桃-白粉病,玉米-叶斑病,玉米-普通锈病,玉米-健康,葡萄-黑腐病,葡萄-健康,葡萄-叶枯病,木薯-健康,木薯-花叶病毒,玉米-大斑病,柑桔-黄龙病,桃子-桃细菌性穿孔病,桃子-健康,土豆-早疫病,土豆-健康,土豆-晚疫病,水稻-褐斑病,水稻-健康,水稻-稻瘟病,草莓-白粉病,草莓-健康,草莓-角斑病,番茄-细菌性斑疹病,番茄-早疫病,番茄-晚疫病,番茄-健康,番茄-叶霉病,番茄-斑枯病]训练建议使用yolov8s.pt预训练权重数据增强mosaic、mixup提升小病斑检出率。
✅
系统架构图┌────────────────────┐ ┌────────────────────┐ │ 前端 (Vue
│◄───►│ 后端 (SpringBoot) │ │ (Web界面 ECharts) │ │ (API 用户管理) │ └────────────────────┘ └────────────────────┘ ↑ ↑ │ │ │ │ ▼ ▼ ┌────────────────────┐ ┌────────────────────┐ │ AI 推理 (Flask) │◄───►│ 大模型 (DeepSeek/Qwen) │ │ (YOLOv8 OpenCV) │ │ (API 调用) │ └────────────────────┘ └────────────────────┘ ↑ ↑ │ │ │ │ ▼ ▼ ┌────────────────────┐ ┌────────────────────┐ │ MySQL 数据库 │ │ 文件存储 (MinIO) │ └────────────────────┘ └────────────────────┘✅
前端代码Vue3 TypeScript
src/router/index.tsimport{createRouter,createWebHistory}fromvue-routerimportHomefrom/views/Home.vueimportLoginfrom/views/Login.vueimportPredictfrom/views/Predict.vueimportBatchPredictfrom/views/BatchPredict.vueimportVideoPredictfrom/views/VideoPredict.vueimportUserManagefrom/views/UserManage.vueconstroutes[{path:/login,component:Login},{path:/,component:Home,children:[{path:,redirect:/predict},{path:predict,component:Predict},{path:batch,component:BatchPredict},{path:video,component:VideoPredict},{path:user,component:UserManage}]}]constroutercreateRouter({history:createWebHistory(),routes})exportdefaultrouter
src/views/Predict.vue—— 单图检测页面template div classpredict-container h2作物检测/h2 div classupload-area input typefile changehandleImageUpload acceptimage/* / button clickstartDetect开始预测/button button clickexportPDF导出PDF/button /div div classresult-area img v-iforiginalImage :srcoriginalImage alt原图 / img v-ifresultImage :srcresultImage alt检测结果 / div classdetails pstrong识别结果/strong /p pstrong置信度/strong %/p pstrong耗时/strong s/p /div /div /div /template script setup langts import { ref } from vue import axios from axios const originalImage refstring() const resultImage refstring() const resultLabel refstring() const confidence refnumber(
const inferenceTime refnumber(
const handleImageUpload (e: Event) { const file (e.target as HTMLInputElement).files?.[0] if (file) { const reader new FileReader() reader.onload (event) { originalImage.value event.target?.result as string } reader.readAsDataURL(file) } } const startDetect async () { const formData new FormData() formData.append(image, (document.querySelector(input[typefile]) as HTMLInputElement).files![0]) const res await axios.post(/api/predict, formData, { headers: { Content-Type: multipart/form-data } }) resultImage.value data:image/jpeg;base64,${res.data.image_base64} resultLabel.value res.data.label confidence.value parseFloat(res.data.confidence) * 100 inferenceTime.value parseFloat(res.data.inference_time) } /script
src/components/EchartsChart.vue—— 可视化图表template div refchartRef stylewidth: 100%; height: 400px;/div /template script setup langts import { onMounted, ref } from vue import * as echarts from echarts const chartRef refHTMLDivElement | null(null) onMounted(() { const chart echarts.init(chartRef.value!) chart.setOption({ title: { text: 不同用户的平均准确度 }, tooltip: {}, legend: { data: [admin, 111, 123, 222, 333] }, radar: { indicator: [ { name: admin, max: 100 }, { name: 111, max: 100 }, { name: 123, max: 100 }, { name: 222, max: 100 }, { name: 333, max: 100 } ] }, series: [{ name: 准确度, type: radar, data: [ { value: [
9
38,
9
5,
8
41,
9
02,
8
39], name: admin } ] }] }) }) /script✅
后端代码SpringBoot Java
controller/PredictController.javaRestControllerRequestMapping(/api)publicclassPredictController{AutowiredprivatePredictionServicepredictionService;PostMapping(/predict)publicResponseEntityPredictionResultpredict(RequestParam(image)MultipartFileimage)throwsIOException{StringresultpredictionService.predict(image);returnResponseEntity.ok(result);}GetMapping(/predictions)publicResponseEntityListPredictionRecordgetPredictions(){ListPredictionRecordrecordspredictionService.getAllPredictions();returnResponseEntity.ok(records);}}
service/PredictionService.javaServicepublicclassPredictionService{AutowiredprivateFlaskClientflaskClient;AutowiredprivateDeepSeekClientdeepSeekClient;publicPredictionResultpredict(MultipartFileimage)throwsIOException{//
调用 Flask 进行 YOLO 检测PredictionResultyoloResultflaskClient.detect(image);//
调用 DeepSeek 生成建议StringadvicedeepSeekClient.generateAdvice(yoloResult.getLabel());//
保存到数据库PredictionRecordrecordnewPredictionRecord();record.setUserId(admin);record.setLabel(yoloResult.getLabel());record.setConfidence(yoloResult.getConfidence());record.setAdvice(advice);record.setTimestamp(newDate());// 保存记录predictionRepository.save(record);// 返回结果yoloResult.setAdvice(advice);returnyoloResult;}}
flask_client.py—— Flask 推理接口Python# flask_app.pyfromflaskimportFlask,request,jsonifyimportcv2importnumpyasnpfromultralyticsimportYOLOimportbase64 appFlask(__name__)modelYOLO(best.pt)app.route(/detect,methods[POST])defdetect():filerequest.files[image]imgcv
imdecode(np.frombuffer(file.read(),np.uint
,cv
IMREAD_COLOR)resultsmodel(img)result_imgresults[0].plot()# 编码为 base64_,buffercv
imencode(.jpg,result_img)img_base64base
b64encode(buffer).decode()labelresults[0].names[int(results[0].boxes.cls[0])]conffloat(results[0].boxes.conf[0])returnjsonify({label:label,confidence:conf,image_base64:img_base64,inference_time:
123})if__name____main__:app.run(port
✅
大模型建议生成DeepSeek / Qwen# deepseek_client.pyimportrequestsdefgenerate_advice(disease_name):urlhttps://api.deepseek.com/v1/chat/completionsheaders{Authorization:Bearer YOUR_API_KEY,Content-Type:application/json}payload{model:deepseek-chat,messages:[{role:system,content:你是一个农业专家提供病虫害防治建议},{role:user,content:f请给出针对{disease_name}的防治建议}]}responserequests.post(url,headersheaders,jsonpayload)returnresponse.json()[choices][0][message][content]✅
PDF 导出功能使用pdfkit# export_pdf.pyimportpdfkitfromjinja2importTemplatedefexport_to_pdf(result,filename):templateTemplate( html headtitle农作物病虫害检测报告/title/head body h1检测报告/h1 pstrong作物/strong/p pstrong置信度/strong%/p pstrong建议/strong/p /body /html )htmltemplate.render(resultresult)pdfkit.from_string(html,filename)✅
部署教程
启动 Flask 服务cdflask_app python flask_app.py
启动 SpringBoot 服务mvn spring-boot:run
启动 Vue 前端cdfrontendnpmrun serve
Docker 部署可选FROM nginx:alpine COPY dist /usr/share/nginx/html EXPOSE 80 CMD [nginx, -g, daemon off;]✅
用户权限管理角色权限管理员查看所有记录、管理用户普通用户查看自己的记录使用 JWT Spring Security 实现认证。
✅