1. 项目背景与核心需求
农业病虫害防治一直是农业生产中的关键环节。传统的人工诊断方式存在效率低、准确性差、依赖经验等问题,尤其对于大规模种植场景,人工巡检的成本和误判风险都较高。随着计算机视觉和深度学习技术的发展,基于图像识别的作物病害诊断系统逐渐成为现代农业的重要辅助工具。
这个毕业设计项目的核心目标是构建一个基于SpringBoot的农作物健康监测平台,主要解决以下几个实际问题:
- 实时病害识别:通过手机或摄像头拍摄的作物叶片图像,自动识别常见的病害类型(如稻瘟病、小麦锈病、玉米大斑病等)
- 防治建议生成:根据识别结果,提供相应的防治方案和用药建议
- 历史数据管理:记录农户的检测记录,形成病害发生的时间空间分布图
- 知识库建设:整合常见作物病害的特征和防治方法,形成可查询的知识库
2. 系统架构设计
2.1 技术选型与整体架构
系统采用经典的B/S架构,整体技术栈如下:
code复制前端:Vue.js + Element UI
后端:SpringBoot 2.7 + MyBatis-Plus
AI模型:Python Flask服务(TensorFlow/PyTorch)
数据库:MySQL 8.0 + Redis
文件存储:MinIO
架构分层设计:
- 表现层:Web前端和移动端H5,负责图像采集和结果展示
- 应用层:SpringBoot核心业务逻辑,包括用户管理、图像处理、记录查询等
- 服务层:AI识别微服务,独立部署的Python服务
- 数据层:结构化数据存储和缓存
提示:选择SpringBoot而非传统SSM框架的主要考虑是其自动配置特性和丰富的starter生态,能显著降低配置复杂度,适合学生项目快速开发。
2.2 核心模块划分
-
用户管理模块
- 农户/管理员角色体系
- JWT token认证
- 权限控制(Spring Security)
-
图像识别模块
- 图像上传预处理(压缩、格式转换)
- 调用AI服务接口
- 结果解析与缓存
-
知识库模块
- 病害特征库
- 防治方案库
- 农药数据库
-
数据统计模块
- 病害发生热力图
- 时间趋势分析
- 区域对比报表
3. 关键技术实现细节
3.1 SpringBoot后端核心配置
基础pom.xml依赖配置示例:
xml复制<!-- Web支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis-Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<!-- 文件处理 -->
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>2.4.1</version>
</dependency>
<!-- Redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
application.yml关键配置:
yaml复制spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 20MB
datasource:
url: jdbc:mysql://localhost:3306/plant_disease?useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
host: 127.0.0.1
port: 6379
3.2 图像识别服务集成
AI服务调用核心代码示例:
java复制@Service
public class AIService {
@Value("${ai.service.url}")
private String aiServiceUrl;
@Autowired
private RestTemplate restTemplate;
public DiseaseResult predictDisease(MultipartFile image) {
try {
// 图像预处理
byte[] processedImage = ImageUtils.compress(image.getBytes());
// 构建请求
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.IMAGE_JPEG);
HttpEntity<byte[]> request = new HttpEntity<>(processedImage, headers);
// 调用AI服务
ResponseEntity<DiseaseResult> response = restTemplate.postForEntity(
aiServiceUrl, request, DiseaseResult.class);
return response.getBody();
} catch (Exception e) {
throw new BusinessException("AI服务调用失败", e);
}
}
}
3.3 数据库设计关键表结构
- 用户表(t_user)
sql复制CREATE TABLE `t_user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(100) NOT NULL,
`role` enum('FARMER','ADMIN') NOT NULL,
`phone` varchar(20) DEFAULT NULL,
`region_code` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 检测记录表(t_detection)
sql复制CREATE TABLE `t_detection` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint NOT NULL,
`image_url` varchar(255) NOT NULL,
`disease_type` varchar(50) NOT NULL,
`confidence` decimal(5,2) DEFAULT NULL,
`detection_time` datetime NOT NULL,
`location` point DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_user` (`user_id`),
KEY `idx_time` (`detection_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 病害知识表(t_disease)
sql复制CREATE TABLE `t_disease` (
`id` bigint NOT NULL AUTO_INCREMENT,
`crop_type` varchar(50) NOT NULL,
`disease_name` varchar(100) NOT NULL,
`symptoms` text,
`prevention` text,
`treatment` text,
`image_samples` json DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_crop` (`crop_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4. 深度学习模型集成方案
4.1 模型选型与训练
对于作物病害识别,推荐采用以下两种主流方案:
-
迁移学习方案
- 基础模型:EfficientNetV2(平衡精度与速度)
- 数据集:PlantVillage公开数据集(约5.4万张叶片图像)
- 训练技巧:
- 数据增强:随机旋转、色彩抖动、mixup
- 学习率:余弦退火调度
- 损失函数:Label Smoothing Cross Entropy
-
轻量化方案(适合移动端)
- 模型架构:MobileNetV3 + 注意力机制
- 量化部署:TensorFlow Lite INT8量化
- 推理速度:<100ms(骁龙865)
注意:实际项目中建议先从小规模数据集开始(如3-5种常见病害),再逐步扩展类别。模型准确率能达到85%以上即可满足毕业设计要求。
4.2 模型服务化部署
Python Flask服务核心代码示例:
python复制from flask import Flask, request, jsonify
import tensorflow as tf
import numpy as np
app = Flask(__name__)
model = tf.keras.models.load_model('efficientnet_model.h5')
@app.route('/predict', methods=['POST'])
def predict():
file = request.files['image']
img = tf.image.decode_image(file.read(), channels=3)
img = tf.image.resize(img, [256, 256])
img = img / 255.0
img = tf.expand_dims(img, axis=0)
preds = model.predict(img)
class_idx = np.argmax(preds[0])
confidence = float(np.max(preds[0]))
return jsonify({
'class': CLASS_NAMES[class_idx],
'confidence': confidence
})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
5. 系统特色功能实现
5.1 病害热力图生成
基于GeoJSON和Leaflet实现区域病害分布可视化:
java复制@GetMapping("/heatmap/{regionCode}")
public Result getHeatMapData(@PathVariable String regionCode) {
List<Detection> detections = detectionService.getRecentDetections(regionCode, 30);
List<HeatMapPoint> points = detections.stream()
.map(d -> new HeatMapPoint(
d.getLocation().getX(),
d.getLocation().getY(),
d.getDiseaseType()
))
.collect(Collectors.toList());
return Result.success(points);
}
前端使用Heatmap.js渲染效果:
javascript复制const heatmap = h337.create({
container: document.getElementById('heatmap-container'),
radius: 25
});
fetch('/api/heatmap/410100').then(res => res.json()).then(data => {
const points = data.map(item => ({
x: item.x * 100,
y: item.y * 100,
value: DISEASE_WEIGHTS[item.type] || 1
}));
heatmap.setData({
max: 10,
data: points
});
});
5.2 防治方案推荐引擎
基于规则引擎的实现方案:
java复制@Service
public class TreatmentServiceImpl implements TreatmentService {
@Autowired
private DiseaseDao diseaseDao;
@Override
public TreatmentPlan generatePlan(String diseaseType, String cropStage) {
Disease disease = diseaseDao.findByType(diseaseType);
if (disease == null) {
throw new NotFoundException("未找到该病害信息");
}
TreatmentPlan plan = new TreatmentPlan();
plan.setDiseaseName(disease.getDiseaseName());
// 根据作物生长阶段调整方案
if ("seedling".equals(cropStage)) {
plan.setChemicalControl(filterLowToxicity(disease.getChemicalTreatments()));
plan.setBiologicalControl(disease.getBiologicalControls());
} else {
plan.setChemicalControl(disease.getChemicalTreatments());
plan.setBiologicalControl(disease.getBiologicalControls());
}
// 添加预防建议
plan.setPreventionTips(disease.getPreventionMethods());
return plan;
}
private List<String> filterLowToxicity(List<String> chemicals) {
return chemicals.stream()
.filter(c -> c.contains("低毒") || c.contains("生物"))
.collect(Collectors.toList());
}
}
6. 项目部署与优化
6.1 生产环境部署方案
推荐使用Docker Compose进行服务编排:
yaml复制version: '3.8'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_DATABASE: plant_disease
volumes:
- mysql_data:/var/lib/mysql
ports:
- "3306:3306"
redis:
image: redis:6.2
ports:
- "6379:6379"
backend:
build: ./backend
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/plant_disease
SPRING_REDIS_HOST: redis
depends_on:
- mysql
- redis
ai-service:
build: ./ai-service
ports:
- "5000:5000"
frontend:
build: ./frontend
ports:
- "80:80"
volumes:
mysql_data:
6.2 性能优化建议
-
图像处理优化:
- 使用WebP格式替代JPEG(节省30%带宽)
- 前端实现图片压缩(使用compressorjs库)
- 启用CDN加速静态资源
-
缓存策略:
- 高频访问的病害知识使用Redis缓存
- 实现两级缓存(Caffeine + Redis)
- 热点数据预加载
-
AI服务优化:
- 使用TensorRT加速模型推理
- 实现批量预测接口
- 监控GPU利用率,自动扩缩容
7. 毕业设计扩展建议
-
移动端扩展:
- 开发微信小程序版本
- 集成GPS定位自动记录检测位置
- 实现离线识别功能(TensorFlow Lite)
-
数据增强:
- 接入气象数据关联分析
- 结合土壤传感器数据
- 建立病害预警模型
-
交互优化:
- 增加AR病害标注功能
- 开发语音问答知识库
- 实现多语言支持
-
学术深化方向:
- 病害严重程度分级
- 多病害复合感染识别
- 基于时间序列的病害预测
提示:实际毕业设计中,建议选择2-3个扩展点深入实现即可,重点展示技术深度而非广度。例如可以重点优化移动端体验或提升模型准确率。
