这个毕业设计项目构建了一个基于卷积神经网络(CNN)的中药图像识别系统。系统采用B/S架构,前端使用Vue.js框架实现响应式界面,后端基于Spring Boot框架开发,通过MyBatis Plus与MySQL数据库交互,整体采用MVC设计模式实现业务逻辑分层。
在深度学习模型方面,项目使用Python搭建CNN网络,利用TensorFlow/Keras框架进行模型训练。系统能够对输入的中药图片进行特征提取和分类识别,准确率可达85%以上。项目不仅实现了核心的识别功能,还配套开发了完整的用户管理系统,包括注册登录、权限控制等基础模块。
选择Vue.js作为前端框架主要基于以下考虑:
实际开发中使用了Element UI组件库,显著提升了界面开发效率。对于图片上传和预览功能,采用了vue-cropper组件实现图片裁剪。
Spring Boot作为后端框架的优势:
特别针对图片处理需求,引入了Thumbnailator库进行图片压缩和尺寸调整,确保上传的中药图片符合模型输入要求。
MySQL关系型数据库的选择理由:
数据库设计中特别注意了图片存储方案,实际采用文件系统存储图片,数据库中只保存图片路径的方式,避免直接存储大文件影响性能。
系统严格遵循MVC模式进行分层:
分层架构使得各层职责明确,便于团队协作和后期维护。例如,中药识别功能的调用流程为:前端上传图片→Controller接收请求→Service调用模型识别→DAO保存记录→返回结果给前端。
采用前后端分离设计带来以下优势:
前后端通过RESTful API进行通信,使用JWT进行身份认证。跨域问题通过Spring Boot的@CrossOrigin注解解决。
虽然当前项目采用单体架构,但在设计时已考虑微服务扩展性:
未来如需扩展,可将中药识别功能拆分为独立服务,通过Spring Cloud实现服务治理。
针对中药识别任务,设计了如下CNN网络结构:
python复制model = Sequential([
Conv2D(32, (3,3), activation='relu', input_shape=(150,150,3)),
MaxPooling2D(2,2),
Conv2D(64, (3,3), activation='relu'),
MaxPooling2D(2,2),
Conv2D(128, (3,3), activation='relu'),
MaxPooling2D(2,2),
Flatten(),
Dense(512, activation='relu'),
Dense(num_classes, activation='softmax')
])
模型特点:
中药图像数据集构建过程:
数据增强代码示例:
python复制train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest')
训练过程中的关键参数:
采用早停法(EarlyStopping)防止过拟合,当验证集准确率连续5轮不再提升时停止训练。最终模型在测试集上达到87.3%的准确率。
使用Flask将CNN模型封装为REST API:
python复制@app.route('/predict', methods=['POST'])
def predict():
file = request.files['image']
img = Image.open(file.stream)
img = img.resize((150,150))
img_array = np.array(img)/255.0
img_array = np.expand_dims(img_array, axis=0)
predictions = model.predict(img_array)
predicted_class = np.argmax(predictions[0])
return jsonify({
'class': class_names[predicted_class],
'confidence': float(predictions[0][predicted_class])
})
前端调用识别接口的关键代码:
javascript复制async submitImage() {
let formData = new FormData();
formData.append('image', this.imageFile);
try {
const res = await axios.post('/api/predict', formData, {
headers: {'Content-Type': 'multipart/form-data'}
});
this.result = res.data;
} catch (err) {
console.error(err);
}
}
识别结果页面展示:
数据库设计相关表:
在实际开发过程中,总结了以下几点重要经验:
数据质量决定模型上限:前期花费大量时间清洗和增强数据非常必要。发现某些中药类别因拍摄角度单一导致模型识别率低,通过增加数据多样性得到改善。
接口设计要规范:前后端约定好统一的返回格式和错误码,可以大幅减少联调问题。我们定义了包含code、message、data的标准响应结构。
版本控制很重要:使用Git进行代码管理,每个功能开发创建独立分支,通过Merge Request进行代码审查,有效保证了代码质量。
文档不可或缺:除了代码注释,我们还维护了API文档、部署手册和用户指南,这对项目交接和后期维护帮助很大。
性能测试要尽早:在开发中期就应进行压力测试,我们发现图片上传接口在高并发时会内存溢出,通过引入文件分块上传解决了这个问题。
这个项目让我深刻体会到,一个完整的AI应用系统不仅需要好的算法模型,还需要考虑工程实现、用户体验和运维部署等全方位因素。特别是在模型服务化过程中,如何平衡响应速度和资源消耗是需要反复调优的重点。