这个项目是我去年指导计算机专业学生完成的毕业设计作品,核心目标是利用卷积神经网络实现垃圾图像的智能分类。随着城市化进程加快,垃圾分类已成为环保领域的重要课题。传统人工分类方式效率低下且成本高昂,而基于深度学习的自动化识别方案能够显著提升分类准确率和处理速度。
系统采用B/S架构设计,前端使用Vue.js构建交互界面,后端基于Spring Boot框架开发,通过MyBatis Plus实现数据持久化。模型训练环节采用ResNet50网络结构,在自建数据集上达到92.3%的识别准确率。整个项目从数据采集到模型部署历时3个月,最终实现了一套完整的可交互式垃圾分类解决方案。
技术亮点:
- 采用焦点损失函数解决类别不平衡问题
- 实现Web端实时图像分类功能
- 集成Shiro框架保障系统安全
- 响应式设计适配多终端设备
在项目启动阶段,我们对比了三种主流技术方案:
传统CV方案:OpenCV+特征工程
轻量级模型:MobileNetV2
深度卷积网络:ResNet50
后端框架选择Spring Boot而非传统SSM的原因:
系统严格遵循MVC设计模式,各层职责明确:
模型层(Model):
java复制// 垃圾分类实体类示例
@Data
@TableName("garbage_class")
public class GarbageClass {
@TableId(type = IdType.AUTO)
private Long id;
private String className; // 可回收/有害/厨余/其他
private String description;
private String exampleImg;
}
视图层(View):
vue复制<!-- 分类结果展示组件 -->
<template>
<div class="result-card">
<el-image :src="result.imgUrl"></el-image>
<div class="result-info">
<h3>{{ result.className }}</h3>
<el-progress
:percentage="result.confidence*100"
:color="customColors"
></el-progress>
</div>
</div>
</template>
控制层(Controller):
java复制@RestController
@RequestMapping("/api/classify")
public class ClassifyController {
@Autowired
private ClassifyService classifyService;
@PostMapping("/upload")
public ResultModel classify(@RequestParam MultipartFile file) {
try {
ClassificationResult result = classifyService.processImage(file);
return ResultModel.success(result);
} catch (Exception e) {
return ResultModel.error(500, e.getMessage());
}
}
}
模型训练关键步骤:
数据准备阶段
python复制train_datagen = ImageDataGenerator(
rotation_range=30,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest'
)
模型构建
python复制base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224,224,3))
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu')(x)
predictions = Dense(4, activation='softmax')(x)
model = Model(inputs=base_model.input, outputs=predictions)
焦点损失函数实现
python复制def focal_loss(gamma=2., alpha=0.25):
def focal_loss_fixed(y_true, y_pred):
pt_1 = tf.where(tf.equal(y_true, 1), y_pred, tf.ones_like(y_pred))
pt_0 = tf.where(tf.equal(y_true, 0), y_pred, tf.zeros_like(y_pred))
return -K.mean(alpha * K.pow(1. - pt_1, gamma) * K.log(pt_1)) - \
K.mean((1-alpha) * K.pow(pt_0, gamma) * K.log(1. - pt_0))
return focal_loss_fixed
训练参数配置:
- 优化器:Adam(lr=0.0001)
- Batch Size:32
- Epochs:50
- 早停机制:val_loss连续3次不下降
模型部署采用ONNX运行时提升推理效率:
python复制torch.onnx.export(
model,
dummy_input,
"garbage_resnet50.onnx",
verbose=True,
input_names=['input'],
output_names=['output']
)
java复制public class ONNXRuntimeService {
private OrtEnvironment env;
private OrtSession session;
public ONNXRuntimeService(String modelPath) throws Exception {
env = OrtEnvironment.getEnvironment();
session = env.createSession(modelPath, new OrtSession.SessionOptions());
}
public float[] predict(float[] input) throws Exception {
OnnxTensor tensor = OnnxTensor.createTensor(env, FloatBuffer.wrap(input), new long[]{1,3,224,224});
try (OrtSession.Result results = session.run(Collections.singletonMap("input", tensor))) {
return ((float[][])results.get(0).getValue())[0];
}
}
}
我们采用分层测试策略:
单元测试覆盖率:
java复制@Test
public void testImagePreprocess() {
// 测试图像预处理
File testFile = new File("src/test/resources/test.jpg");
float[] result = imageService.preprocess(testFile);
assertEquals(150528, result.length); // 224*224*3
assertTrue(result[0] >= -1 && result[0] <= 1);
}
压力测试结果:
遇到的典型问题及解决方案:
内存泄漏问题
响应延迟问题
并发瓶颈
推荐服务器配置:
Docker部署方案:
dockerfile复制FROM openjdk:11-jre
WORKDIR /app
COPY target/garbage-classification.jar .
COPY src/main/resources/static/model.onnx ./model/
EXPOSE 8080
ENTRYPOINT ["java","-jar","garbage-classification.jar"]
Nginx配置要点:
nginx复制server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
}
location /static/ {
alias /path/to/static/files/;
expires 30d;
}
}
模型加载失败
分类结果异常
并发性能下降
在实际应用过程中,我们发现以下几个有价值的改进方向:
多模态识别
边缘计算方案
数据闭环系统
这个项目从技术验证到完整实现共迭代了5个版本,最大的收获是认识到工业级应用与学术研究的差异。比如在实际部署时发现,相比追求最高准确率,更重要的是保证系统的稳定性和响应速度。我们最终将模型从ResNet50替换为更轻量的EfficientNet,虽然准确率下降1.2%,但推理速度提升了3倍,这个trade-off在实际业务中是完全值得的。