尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
基于Python与CNN卷积神经网络的不同衣服颜色识别实战全流程
做“深度学习毕设”最怕的不是模型复杂而是题目看着简单、跑起来全是坑。就拿“衣服颜色识别”这个方向来说很多人第一反应是这不就是图像分类吗直接丢进卷积神经网络训练一顿就行。实际上手才发现纯色衣服和花衬衫混在一起、背景和衣服颜色相近、室内灯光偏暖导致白衣服变成“黄衣服”各种问题能把人磨到怀疑人生。这篇文章以“基于Python CNN卷积神经网络的不同衣服颜色识别”为实战主线从任务拆解、数据集构建、模型设计到训练调优全流程复盘希望能给正在做相关毕设或者入门深度学习的同学一份真正能照着走的路线图。1. 项目定位与任务拆解1.1 这个毕设的本质是什么把题目拆开看它本质上是一个“细粒度图像分类”任务而不是普通的“物体识别”任务。普通图像分类判断的是“这是什么物体”比如猫、狗、汽车衣服颜色识别判断的是“这个物体的属性是什么”。这意味着网络不仅要找到衣服这个区域还要从该区域中提取出颜色特征并忽略背景、光照、纹理等因素的干扰。很多同学把这三个层次混在一起做结果模型既要学会找衣服、又要学会判颜色难度直接翻倍最终准确率卡在60%上不去。从“颜色识别”的角度看模型的输入是一张RGB图像输出是若干个预定义的颜色类别。我一般建议把类别控制在6到8种比如黑色、白色、红色、蓝色、绿色、黄色再加上橙色、紫色这样既覆盖了日常常见色又不会因为类别过细导致混淆严重。核心难点在于颜色是一种全局性的低层视觉特征理论上不需要特别深的网络就能学好但颜色感知又极度依赖光照条件、物体材质、背景色这就让项目关键点从“堆网络层级”转移到了“数据质量”和“特征鲁棒性”上。1.2 为什么选CNN而不是传统方法早期的颜色识别很多走的是传统计算机视觉路线先把图片转到HSV颜色空间统计色相H和饱和度S的直方图再用阈值区间或者训练一个SVM分类器。这套做法在受控环境下能跑通但有一个致命短板它对光照变化、阴影、高光反射几乎没有任何免疫力。比如一件深蓝色衣服在暖光下拍出来HSV直方图可能和黑色非常接近阈值根本切不开。CNN的方案是让模型自己学习“什么样的颜色分布模式应该归为哪一类”它不直接看单个像素值而是通过多层卷积逐级提取图像的颜色块、边缘、纹理等特征再组合出高层语义。打个不严谨的比方传统方法像用尺子量颜色属于拿着固定公式去套CNN像让模型自己总结规律你给它足够多标注好的图片它自己知道该看哪些区域、忽略哪些干扰。对毕设来说CNN还有一个额外好处结构透明每一层在做什么可以用特征图可视化讲清楚答辩时更容易把“为什么这么设计”说明白。1.3 给毕设做减法把识别范围先定死毕设不是工业项目不是功能越多越好。我见过太多同学一开始就想着“我要识别各种场景下的衣服颜色包括复杂背景、多人、各种款式”结果数据收集阶段就崩溃了。我的建议是先把任务范围收缩为单件纯色上衣、图片以平铺图或挂拍图为主、固定8个颜色类别。这样工作量可控、可复现性强、论文的边界也清晰。为什么要强调“做减法”因为一旦加入多种款式的混搭、复杂花纹、多人场景模型同时要解决目标检测、遮挡、纹理干扰等问题任何一环崩了都会把锅甩到“颜色识别”上到最后你根本说不清是模型问题还是数据问题。先把一个简单场景做到90%准确率再以对比实验的方式加入复杂样本分析模型在哪些场景下失效这种“从简单到复杂”的演进反而更能撑起论文深度。2. 环境准备与数据集构建2.1 环境依赖与工具链选型我做这个项目时用的是Python 3.8配合Anaconda创建虚拟环境避免把机器上其他项目的依赖搞乱。深度学习框架选的PyTorch原因很简单代码直观、调试友好、pip安装就能用且torchvision里自带常用预处理方法和预训练模型对毕设周期非常友好。当然用TensorFlow 2.x也完全没问题核心思想是一样的只是在数据接口和训练循环写法上有差异。依赖清单不需要追求最新版本稳定就行。我常用的组合是torch1.10 torchvision0.11 opencv-python numpy scikit-learn matplotlib tqdm pillow pandas其中scikit-learn主要用来计算precision、recall、F1和绘制混淆矩阵matplotlib负责画loss曲线和样本图opencv偶尔用来做图像裁剪检查。如果电脑没有独立显卡CPU训练也能跑只是需要把输入图像缩小到128x128、模型轻量化一些如果有一块4GB显存的显卡下面的模型规模完全够用。2.2 数据集从哪来怎么自建衣服类的公开数据集我调研过一些大多数以人体检测、姿态估计、衣服类别检索为主真正带“颜色标签”的成品数据集很少见而且标注体系未必符合你的类别定义。更可控的做法是自建数据集这也是毕设里最容易被低估工作量的环节。我的收集流程分三步。第一步确定颜色类别清单比如black、white、red、blue、green、yellow、orange、purple这8类。第二步每类收集300到500张图片总数据量控制在2500到4000张左右。图片来源优先选电商平铺图、挂拍图也可以用图片搜索批量下载后人工清洗。第三步对下载的图片做一轮严格筛选去掉那些含有多件衣服、大面积皮肤裸露、背景与衣服颜色融为一体、清晰度太差的样本。清洗这一步直接决定模型上限。我踩过的典型坑是某一类图片里如果总带同一品牌的logo或者统一背景板模型会学到“看到这个logo就输出该颜色”的捷径等测试集换成其他背景准确率立刻崩掉。因此我在划分数据集时也没有简单随机切分而是尽量按图片来源划分训练集、验证集、测试集一般比例6:2:2。这样验证结果更能反映模型的真实泛化能力。2.3 预处理和归一化的细节颜色识别任务里预处理最容易被忽略的就是背景干扰。如果训练图片背景大面积为白色那么模型对“白色”的判断很可能会依赖整张图的高亮度区域而不是衣服本身测试时一旦背景变成灰色模型就可能乱掉。我的做法是收集阶段直接优先选平铺图、挂拍图并在预处理阶段统一做一次中心裁剪让衣服主体占据画面主体。输入尺寸方面我建议统一缩放到224x224。虽然颜色是全局特征用更小的输入也能训练但224x224能保留更多衣服纹理和局部细节对区分“黑色牛仔裤”和“黑色毛衣”这种同色不同材质的情况有帮助。归一化上采用通用的mean和std即可这样后续如果要切换到预训练模型做对比实验不需要再改数据管线。如果不做归一化直接喂原始像素值模型对图像整体亮度变化会异常敏感收敛速度也会变慢。尤其在使用迁移学习做对比实验时预训练模型本身就默认输入是按特定均值方差标准化过的数据管线保持一致才能保证公平对比。2.4 数据增强的正确打开方式数据增强是提升颜色识别鲁棒性的关键但这里有一个和其他图像分类任务非常不一样的地方ColorJitter的调节幅度必须克制。普通物体分类可以放心把亮度、对比度、饱和度、色相都调得比较大来增加多样性但在颜色识别任务里色相hue参数过大会把红色增强成粉色、把蓝色增强成紫色这相当于改写了标签模型会被错误样本带偏。我实测下来的安全区间是brightness扰动0.2到0.3、contrast扰动0.2到0.3、saturation扰动0.2到0.3而hue扰动不要超过0.05。这样既能模拟不同光照条件又不会把类别界限抹掉。另一个重点是只做水平翻转不做垂直翻转——衣服在图片里左右对称不会改变颜色但上下颠倒会破坏正常的衣服形态容易引入无意义的训练噪声。此外RandomResizedCrop我建议把scale下限设到0.7以上。如果裁剪区域太小模型训练时只看到衣服的一角颜色信息就不完整等于人为制造了难以分类的样本。这些细节看起来小但叠加在一起就是准确率差三到五个百分点的差距。3. CNN模型架构设计与代码实现3.1 自建CNN还是迁移学习这是做毕设必须回答的问题。我的建议是自建轻量CNN作为baseline再用迁移学习做一组对比实验这比二选一更有价值。迁移学习的思路是用在大规模通用图像数据集上预训练好的resnet18或类似模型冻结浅层参数、只微调分类头优点是收敛快、特征表达能力强。但它有一个容易被忽略的问题预训练模型学到的大多是纹理、形状、边缘特征对“颜色”这种低层属性并不敏感甚至可能在迁移时把纹理偏好带进来导致模型在纯色衣服上表现不如自建网络。自建网络的优势在于可控和可解释。你可以在论文里把每一层的作用写清楚第一层卷积提取颜色块和基础边缘第二层组合出局部纹理模式第三层形成对衣服区域整体色调的感知。答辩时被问到结构设计原因你能从感受野、池化、参数量的角度详细解释这比“我用了预训练模型所以效果不错”更有说服力。3.2 参考模型结构与参数量估算我推荐一个非常轻量、适合CPU训练的小模型输入224x224x3的RGB图片经过三层卷积块每个卷积块包含一个3x3卷积、批归一化、ReLU激活和2x2最大池化输出通道依次是32、64、128。经过三层池化后特征图尺寸从224缩小到28最后使用全局平均池化把128个特征图各压成一个数值得到128维向量再送入两层全连接分类器。这里选择全局平均池化而不是直接展平是有意的设计。展平会把28x28x128的空间信息全部保留进入全连接层后参数量非常大容易过拟合而全局平均池化输出的是整张特征图的平均值恰好匹配“颜色是全局属性”这个任务特点。模型的总参数量大约16万左右4GB显存随便跑CPU训练一轮几十张图也就几秒钟。以第一层卷积为例参数量计算方式为输入通道3、输出通道32、卷积核3x3再加偏置计算公式是32×(3×3×31)896整个模型的参数规模可以清晰地写进论文实验部分。3.3 训练配置的关键选择损失函数用CrossEntropyLoss这是多分类图像的默认选择。优化器有两个方案Adam默认学习率1e-3前期收敛快适合快速验证数据链路是否正常SGD加Momentum0.9、学习率0.01收敛更稳后期精度通常更好。我习惯先用Adam跑几个epoch确认loss在下降再切到SGD精调但这并不是必须流程。如果图省事全程用Adam也能出一个不错的结果。学习率调度我建议用StepLR或CosineAnnealingLR每过若干个epoch把学习率乘以0.1让训练后期在更小步长下精细调整。batch_size取32即可epoch设置为50同时配合EarlyStopping验证集准确率连续10个epoch不提升就停止训练避免浪费时间。最后如果某些颜色类别的样本数量明显偏少要在CrossEntropyLoss里传入weight权重向量让模型对少量类别的错误更敏感。3.4 核心代码实现从数据到训练自定义数据读取类很好写。核心是返回图片张量和对应的颜色索引注意图片要统一转成RGB模式避免因为灰度图或带透明通道的PNG导致通道数不一致。完整代码参考import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import Dataset, DataLoader from torchvision import transforms from PIL import Image import os class ClothesColorDataset(Dataset): def __init__(self, root_dir, transformNone): self.classes sorted(os.listdir(root_dir)) self.class_to_idx {cls: idx for idx, cls in enumerate(self.classes)} self.paths [] self.labels [] for cls in self.classes: cls_dir os.path.join(root_dir, cls) for fname in os.listdir(cls_dir): if fname.lower().endswith((.jpg, .jpeg, .png)): self.paths.append(os.path.join(cls_dir, fname)) self.labels.append(self.class_to_idx[cls]) self.transform transform def __len__(self): return len(self.paths) def __getitem__(self, idx): image Image.open(self.paths[idx]).convert(RGB) label self.labels[idx] if self.transform: image self.transform(image) return image, label模型定义参考class ClothesColorCNN(nn.Module): def __init__(self, num_classes8): super().__init__() self.features nn.Sequential( nn.Conv2d(3, 32, kernel_size3, padding1), nn.BatchNorm2d(32), nn.ReLU(inplaceTrue), nn.MaxPool2d(2), nn.Conv2d(32, 64, kernel_size3, padding1), nn.BatchNorm2d(64), nn.ReLU(inplaceTrue), nn.MaxPool2d(2), nn.Conv2d(64, 128, kernel_size3, padding1), nn.BatchNorm2d(128), nn.ReLU(inplaceTrue), nn.MaxPool2d(2), ) self.avgpool nn.AdaptiveAvgPool2d(1) self.classifier nn.Sequential( nn.Linear(128, 512), nn.ReLU(inplaceTrue), nn.Dropout(0.5), nn.Linear(512, num_classes), ) def forward(self, x): x self.features(x) x self.avgpool(x) x torch.flatten(x, 1) x self.classifier(x) return x训练函数这样写def train_one_epoch(model, loader, optimizer, criterion, device): model.train() total_loss, correct, total 0.0, 0, 0 for images, labels in loader: images, labels images.to(device), labels.to(device) optimizer.zero_grad() outputs model(images) loss criterion(outputs, labels) loss.backward() optimizer.step() total_loss loss.item() * images.size(0) preds outputs.argmax(dim1) correct (preds labels).sum().item() total labels.size(0) return total_loss / total, correct / total验证函数结构相似核心区别是用torch.no_grad()包裹推理过程还要把model切换到eval()模式关掉Dropout和BatchNorm的统计更新。一个容易踩的坑是Windows下DataLoader的num_workers参数设成大于0会报错或卡住我通常直接设成0图省心。4. 训练过程与调优实录4.1 训练曲线怎么盯训练时不要只看最终的测试准确率而要同时盯三条信号训练loss是否持续下降、验证集准确率是否同步提升、训练集和验证集之间的差距是否越拉越大。正常过程是训练loss稳步下降验证准确率前期快速上升后期进入平台期。如果train loss下降但val准确率不涨优先怀疑过拟合或者验证集和训练集分布差异过大如果两边完全不动问题多半不在模型而在数据链路比如标签顺序错乱、图像加载出错。我在训练时会顺便画两张图一张是train/val loss曲线另一张是验证集每个类别的准确率柱状图。这样做的好处是能快速暴露“黑色预测对了但紫色一直在50%徘徊”这类问题而不是被总体准确率蒙混过去。4.2 评估指标不能只看准确率分类准确率在颜色识别任务里容易产生误导。假设数据集中黑色样本占三分之一一个全预测黑色的模型也能达到30%以上的准确率看起来没那么差但实际上毫无可用性。毕设实验部分至少要把每类的precision、recall、F1全部列出来最好再附上混淆矩阵。混淆矩阵的价值在于定位“混淆对”。最常见的模式有两类白色和灰色混淆通常说明模型对亮度明暗更敏感藏青色和黑色混淆说明模型没学到足够区分两类的色调特征。拿到混淆矩阵后我会反过去检查数据看看是不是训练集里的藏青样本本身就偏少或者两张相近颜色在收集时标签贴反了。这个检查流程写在论文里比单纯说“调参后精度提高”要扎实得多。4.3 颜色识别特有的几大难点实操下来颜色识别有几个其他分类任务很少碰到的坑。第一是光源色温偏移室内暖光灯会把白衣服拍成偏黄色浅蓝衣服拍成灰绿色所以数据增强里的brightness和color扰动必须做得足够强。第二是材质高光丝绸、皮革、防水面料在拍摄时会产生大面积反光区域反光处颜色接近光源色而不是布料本身模型容易把高光当作判定依据。第三是肤色干扰圆领、V领衣物会露出脖子和面部肤色和杏色、裸色、粉色跨度极近如果不做主体裁剪模型可能把肤色特征也学进去。还有一个很隐蔽的数据bug多色衣服。如果数据集清洗不彻底混入几件条纹衫或碎花裙且这些图片被分进了“单色”类别模型会学到“多纹理杂色某一个具体类别”这种错误规则。我在实操中会在清洗阶段就坚决剔除多色面积占比超过30%的图片宁可少一点数据也要保证标注干净。4.4 过拟合和鲁棒性处理顺序训练集只有几千张时过拟合几乎是必然现象。处理优先级建议是先给模型加Dropout或者降低全连接层宽度再增强数据最后加weight_decay。不要一上来就调学习率学习率对过拟合的影响是间接的调整不当只会让训练震荡。我的模型里已经在分类器前加了一层Dropout(0.5)这个比例对轻量CNN是安全的。另一个提升鲁棒性的思路是加一个“其他/未知”类别。这个类专门收集迷彩服、渐变色外套、荧光色等难以归入固定8类的样本。测试时如果输入一张不常见的衣服图模型可以输出“其他”而不是强行归于某个错误颜色。答辩时这个设计其实是加分项因为它体现出了对真实世界边界的理解。5. 毕设实操常见问题排查速查表5.1 准确率上不去的排查顺序很多同学一遇到准确率上不去就开始改网络结构这是最浪费时间的方式。正确的排查顺序应该是先查数据再看预处理然后观察训练状态最后才动模型。数据层面主要看标签是否贴反、重复图片是否残留、类别分布是否严重不平衡预处理层面看归一化是否写错、图像通道数量是否为3训练状态看loss曲线和验证集曲线是否有明显gap这些都没问题再考虑模型容量是否不足或者学习率是否不合适。我遇到过最典型的例子是“所有图片都能被模型分成两类val准确率稳定在50%”最后发现是自定义Dataset里返回的label没有对齐到class_to_idx排序用os.listdir在个别机器上不保证稳定顺序。这个坑看起来低级但确实会让人查很久。5.2 loss出现NaN和显存不足的预案loss出现NaN第一时间不是去换模型而是按顺序检查三步学习率是否过大比如Adam超过1e-3就容易爆数据里是否有纯黑或纯白异常图像导致归一化后特征值离谱标签索引是否超过了分类数比如类别数是8但label传了9。排除这三项后再把batch_size调小试试大概率能解决。显存不足在毕设机器上很常见。优先把batch_size从64降到32甚至16其次把输入图片尺寸从224降到128。颜色识别对分辨率其实不太敏感128x128在很多场景下已经够用。如果还不行就用CPU训练轻量模型慢不到哪里去一晚也能出结果。5.3 Demo演示与模型导出训练完成后要导出模型权重保存方式有两种torch.save(model.state_dict(), clothes_color_cnn.pth)只保存参数加载时需要手动定义好相同结构的模型如果想把结构和参数打包一起保存可以用torch.save(model, model_full.pth)但这种方式在PyTorch版本升级后容易不兼容我不太推荐。做演示时加载模型后一定要加上这行代码model.load_state_dict(torch.load(clothes_color_cnn.pth, map_locationcpu)) model.eval()eval()模式会关闭Dropout和BatchNorm的动态统计推理结果稳定。如果不加这行同一个batch里预测结果可能出现抖动。演示界面我用Streamlit写过几行就能搭一个上传图片返回预测类别和置信度的页面中间不需要写复杂的前后端逻辑。置信度输出还会顺手打印每类概率让别人直观看到“红色0.85橙色0.09”这样的结果观感比只输出一个标签好很多。6. 写在最后从实战中沉淀的几点经验这个项目做下来我最深的体会是“颜色识别成败不在模型而在数据边界”。任务范围定得越清楚数据清洗做得越狠后续训练和论文写作就越顺。很多同学代码能力并不差差在不敢砍需求总想把所有情况都纳入模型最后每类都做不好。颜色识别还可以继续扩展比如把单标签升级成多标签分类同时预测“红色条纹”也可以把颜色特征和衣服类型特征拼在一起做服装属性检索。对我个人而言把一个简单模型做到每个指标都能解释、每个坑都能说出原因比堆一个自己也说不清的黑盒模型有价值得多。
RELATED

相关推荐

HeidiSQL 9.2.0.4947 连接 MySQL 8.0+ 实操指南

HeidiSQL 9.2.0.4947 连接 MySQL 8.0+ 实操指南

简介:HeidiSQL_9.2.0.4947_Setup 是一款面向数据库初学者、Web 开发者及后端工程师的轻量级开源数据库管理工具安装包,专为高效连接与可视化操作 MySQL、MariaDB、SQL Server、PostgreSQL 等主流数据库而设计,有效替代命令行操作,…

📅 2026/10/18 11:07:37
Fabric工作流审批毕设拆解:网络编排、链码状态机与避坑指南

Fabric工作流审批毕设拆解:网络编排、链码状态机与避坑指南

简介:基于Hyperledger Fabric区块链的工作流审批应用毕业设计项目,面向软件工程、计算机科学与技术、自动化、电子信息等专业的学生与开发者。项目将区块链不可篡改、可追溯特性与审批流程结合,适用于企业审批场景的课程设计、毕业设计及区块…

📅 2026/10/18 11:07:37
ibaAnalyzer v7.3.5 放疗剂量分析实战指南:Gamma验证与自动化QA集成

ibaAnalyzer v7.3.5 放疗剂量分析实战指南:Gamma验证与自动化QA集成

简介:ibaAnalyzer_v7.3.5 是一款面向IT运维工程师、网络性能分析人员及系统监控技术人员的专业级数据分析工具,专注于网络流量解析、日志深度挖掘与系统性能瓶颈诊断。该版本提供完整的64位与32位Windows安装支持,兼顾新旧环境部署需求&#…

📅 2026/10/18 11:07:37
MORE NEWS

更多资讯

📰

Flutter跨平台鸿蒙开发实战:成语闯关应用全记录

Flutter 框架跨平台鸿蒙开发,这句话放在两年前还是个争议话题,但这几年已经有团队真正把 Flutter 代码跑到了鸿蒙手机上。我最近用一个在线成语闯关应用完整验证了一遍:一套 Dart 代码,安卓能跑,iOS 能跑,鸿…

📰

ArtCraft项目实战:从设计思路到代码实现,打造艺术与工程结合的作品

1. 从“artcraft”这个名字说起:它到底想解决什么问题第一次看到“artcraft”这个标题,我脑子里蹦出来的第一反应是“艺术”加“手艺”的组合词。直觉告诉我,这不是一个纯技术框架的名字,也不是某个具体产品的品牌名,它…

📰

钢表面缺陷检测数据集实操:VOC/COCO/YOLO三格式全解析

简介:YOLO钢表面缺陷检测数据集是一套面向工业视觉质检场景的目标检测训练资源,适合需要训练钢表面缺陷识别模型的开发者、研究生和工业算法工程师,能够解决真实缺陷样本难获取、标注格式不统一等痛点。压缩包共2000个文件,大小约…

📰

峰谷分时电价引导下的电动汽车充电负荷优化:建模、调度与工程实践

我接手这个方向的第一印象,来自一个冬天的晚上九点。当时我在整理某区域配电网的负荷数据,无意间把一条台区日负荷曲线拉了出来,晚高峰原本应该往下走的尾巴,却硬生生多了一块。连续三天,每天都一样,那块凸…

📰

别再“熬过去”了:用任务系统思维跳出越忙越忙的陷阱

最近总有朋友跟我抱怨同一件事:连续加了两个星期班,好不容易熬到项目收尾,想着总算能喘口气了。结果假期还没开始,新需求、新会议、新问题就一窝蜂涌上来。那种感觉就像刚爬上一个坡顶,还没来得及看风景,发…

📰

从Vue2到Vue3:底层重构、响应式与迁移实践全方位解析

1. 从 Vue2 到 Vue3:一次迟到了好几年的底层重构但凡写过两年以上 Vue 的开发者,这两年多少都经历过类似场景:公司新项目启动,技术选型会上有人把 Vue3 摆上桌,然后立刻被问一句——“Vue2 还能用,为什么非…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬