1. 项目概述:基于CNN的鞋子颜色识别系统
作为一名长期从事计算机视觉开发的工程师,最近指导了几位本科生完成了一个极具实用价值的课程设计项目——基于Python和CNN的鞋子颜色识别系统。这个项目不仅涵盖了深度学习的基础知识,还完整实现了从数据采集到模型部署的全流程,非常适合作为计算机视觉领域的入门实践。
在电商平台和智能仓储系统中,商品颜色识别一直是个重要但具有挑战性的任务。传统方法依赖人工标注或简单的颜色阈值分割,准确率低且适应性差。我们这个项目采用卷积神经网络(CNN)来自动识别鞋子颜色,准确率达到了92%以上,远超传统方法。
2. 系统架构设计
2.1 技术选型与整体架构
系统采用经典的前后端分离架构,前端使用Vue.js构建用户界面,后端基于Spring Boot框架开发,CNN模型使用Python的TensorFlow/Keras实现。这种架构选择主要基于以下考虑:
-
前端技术栈 :
- Vue.js:轻量级、组件化,适合快速开发交互式界面
- Element UI:提供丰富的UI组件,加速开发
- Axios:处理HTTP请求,与后端API通信
-
后端技术栈 :
- Spring Boot:简化配置,快速构建RESTful API
- MyBatis-Plus:增强的ORM框架,简化数据库操作
- Redis:缓存模型预测结果,提高响应速度
-
深度学习部分 :
- TensorFlow 2.x:主流深度学习框架
- Keras:高层API,简化模型构建
- OpenCV:图像预处理
提示:在实际部署时,我们将Python模型服务封装为gRPC微服务,与Java后端通过gRPC协议通信,这种方案比传统的REST API更适合传输图像数据。
2.2 数据库设计
系统使用MySQL存储用户信息、鞋子图片元数据和识别记录。核心表结构如下:
用户表(users)
CREATE TABLE `users` (
`id` int NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(100) NOT NULL,
`role` varchar(20) NOT NULL DEFAULT 'user',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
鞋子图片表(shoe_images)
CREATE TABLE `shoe_images` (
`id` int NOT NULL AUTO_INCREMENT,
`user_id` int NOT NULL,
`image_path` varchar(255) NOT NULL,
`upload_time` datetime DEFAULT CURRENT_TIMESTAMP,
`predicted_color` varchar(50) DEFAULT NULL,
`confidence` float DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
CONSTRAINT `shoe_images_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. CNN模型设计与实现
3.1 数据集准备与预处理
我们收集了包含10种常见鞋子颜色的数据集,每种颜色约500张图片,总计5000张。数据来源包括:
- 公开数据集:从Kaggle等平台获取的鞋子图片
- 网络爬取:使用Python爬虫从电商网站获取
- 自行拍摄:使用手机拍摄不同角度、光照条件下的鞋子
数据预处理流程:
import cv2
import numpy as np
def preprocess_image(image_path, target_size=(224, 224)):
# 读取图像
img = cv2.imread(image_path)
# 转换为RGB格式
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 调整大小
img = cv2.resize(img, target_size)
# 归一化
img = img.astype(np.float32) / 255.0
return img
注意:数据增强是提高模型泛化能力的关键。我们使用了以下增强技术:
- 随机旋转(-20°到20°)
- 水平翻转
- 亮度调整(±30%)
- 对比度调整(±20%)
3.2 CNN模型构建
我们基于ResNet50架构进行迁移学习,模型结构如下:
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D
from tensorflow.keras.models import Model
def build_model(num_classes=10):
# 加载预训练的ResNet50模型,不包括顶层
base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
# 冻结基础模型的所有层
for layer in base_model.layers:
layer.trainable = False
# 添加自定义顶层
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu')(x)
predictions = Dense(num_classes, activation='softmax')(x)
# 构建完整模型
model = Model(inputs=base_model.input, outputs=predictions)
return model
模型训练配置:
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
history = model.fit(
train_generator,
steps_per_epoch=len(train_generator),
epochs=20,
validation_data=validation_generator,
validation_steps=len(validation_generator)
)
3.3 模型优化技巧
在实际训练过程中,我们发现了几个关键优化点:
-
学习率调整 :使用余弦退火学习率调度
from tensorflow.keras.callbacks import LearningRateScheduler import math def cosine_decay(epoch): initial_lr = 0.001 decay_steps = 20 alpha = 0.0 step = min(epoch, decay_steps) cosine_decay = 0.5 * (1 + math.cos(math.pi * step / decay_steps)) decayed = (1 - alpha) * cosine_decay + alpha return initial_lr * decayed lr_scheduler = LearningRateScheduler(cosine_decay) -
类别不平衡处理 :使用加权交叉熵损失
from sklearn.utils.class_weight import compute_class_weight class_weights = compute_class_weight('balanced', classes=np.unique(train_labels), y=train_labels) class_weight_dict = dict(enumerate(class_weights)) -
早停机制 :防止过拟合
from tensorflow.keras.callbacks import EarlyStopping early_stopping = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
4. 系统集成与部署
4.1 前后端交互设计
前端通过HTTP接口与后端交互,主要API包括:
-
用户认证 :
- POST /api/auth/login - 用户登录
- POST /api/auth/register - 用户注册
-
图像处理 :
- POST /api/image/upload - 上传鞋子图片
- GET /api/image/history - 获取识别历史
-
模型管理 :
- POST /api/model/retrain - 触发模型重新训练
- GET /api/model/performance - 获取模型性能指标
4.2 模型服务化
我们将训练好的CNN模型封装为gRPC服务,核心代码如下:
protobuf定义(color_detection.proto) :
syntax = "proto3";
service ColorDetection {
rpc Predict (ImageRequest) returns (PredictionResponse);
}
message ImageRequest {
bytes image_data = 1;
}
message PredictionResponse {
string color = 1;
float confidence = 2;
}
Python服务端实现 :
import grpc
from concurrent import futures
import color_detection_pb2
import color_detection_pb2_grpc
import numpy as np
from PIL import Image
import io
class ColorDetectionServicer(color_detection_pb2_grpc.ColorDetectionServicer):
def __init__(self, model):
self.model = model
def Predict(self, request, context):
# 将字节数据转换为图像
img = Image.open(io.BytesIO(request.image_data))
img = preprocess_image(img)
img = np.expand_dims(img, axis=0)
# 进行预测
preds = self.model.predict(img)
pred_idx = np.argmax(preds)
confidence = float(preds[0][pred_idx])
# 获取颜色标签
color = COLOR_LABELS[pred_idx]
return color_detection_pb2.PredictionResponse(
color=color,
confidence=confidence
)
def serve(model_path):
model = load_model(model_path)
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
color_detection_pb2_grpc.add_ColorDetectionServicer_to_server(
ColorDetectionServicer(model), server)
server.add_insecure_port('[::]:50051')
server.start()
server.wait_for_termination()
4.3 性能优化实践
在实际部署中,我们发现以下几个优化点显著提高了系统性能:
-
图像尺寸调整 :将输入图像从原图缩小到256x256再进行中心裁剪为224x224,减少传输和处理时间。
-
批量预测 :当有多个预测请求时,先将它们收集到队列中,然后进行批量预测,显著提高GPU利用率。
-
缓存机制 :对相同图片的重复请求,直接从Redis缓存返回结果,减少模型计算。
-
异步处理 :对于模型重新训练等耗时操作,使用Celery进行异步任务处理,避免阻塞主线程。
5. 系统测试与评估
5.1 模型性能测试
我们在测试集上评估了模型的性能,结果如下:
| 颜色类别 | 准确率 | 召回率 | F1分数 |
|---|---|---|---|
| 红色 | 94.2% | 93.8% | 94.0% |
| 蓝色 | 92.5% | 91.7% | 92.1% |
| 黑色 | 96.1% | 95.3% | 95.7% |
| 白色 | 90.8% | 92.1% | 91.4% |
| 绿色 | 88.7% | 89.5% | 89.1% |
| 平均值 | 92.5% | 92.5% | 92.5% |
5.2 系统功能测试
我们对系统主要功能进行了全面测试,部分测试用例:
图像上传与识别测试
- 测试正常上传JPEG格式图片
- 测试上传PNG格式图片
- 测试上传非图片文件
- 测试上传超大图片(>10MB)
- 测试上传低分辨率图片(<100x100)
用户管理测试
- 测试用户注册流程
- 测试用户登录流程
- 测试密码重置功能
- 测试用户权限控制
- 测试用户历史记录查询
5.3 性能压力测试
使用Locust工具模拟多用户并发访问,测试结果:
| 并发用户数 | 平均响应时间 | 错误率 | 吞吐量(reqs/s) |
|---|---|---|---|
| 50 | 120ms | 0% | 420 |
| 100 | 180ms | 0% | 550 |
| 200 | 320ms | 0.5% | 620 |
| 500 | 680ms | 2.1% | 730 |
6. 项目总结与扩展方向
这个基于CNN的鞋子颜色识别系统完整实现了从数据收集、模型训练到系统部署的全流程。在项目开发过程中,我们积累了一些宝贵经验:
-
数据质量至关重要 :初期由于数据集中存在标注错误和类别不平衡问题,模型性能较差。通过数据清洗和增强后,准确率提升了15%。
-
模型轻量化 :在实际部署中发现ResNet50计算量较大,后续可以尝试MobileNet或EfficientNet等轻量级模型。
-
边缘计算 :考虑将模型部署到边缘设备(如树莓派)上,减少网络传输延迟。
-
多模态融合 :结合鞋子款式、材质等信息,进一步提升颜色识别准确率。
这个项目不仅适用于鞋子颜色识别,其技术框架可以轻松扩展到其他商品颜色识别场景,如服装、箱包等。对于想要学习计算机视觉和深度学习的学生来说,这是一个非常全面的实践项目。



1335

被折叠的 条评论
为什么被折叠?



