1. 项目概述
云层分类是气象观测和天气预报中的基础性工作。传统的人工目测方法效率低下且主观性强,而卫星遥感产生的海量数据又需要自动化处理方案。这个项目基于ResNet18卷积神经网络构建了一个云层图像分类模型,能够自动识别7种常见云层类型。
选择ResNet18作为基础架构主要基于三点考虑:首先,其残差连接结构能有效缓解深层网络的梯度消失问题;其次,相比更深的ResNet50/101等模型,ResNet18仅有约1100万参数,计算量更适合实际部署;最后,ImageNet预训练权重提供了良好的特征提取基础。
2. 数据集准备与探索
2.1 数据集概况
项目使用的数据集来自Kaggle,包含961张标注的云层图像,分为7个类别:
- 高积云(Altocumulus)
- 积云(Cumulus)
- 卷云(Cirrus)
- 层积云(Stratocumulus)
- 晴空(Clear)
- 层云(Stratus)
- 积雨云(Cumulonimbus)
数据集存在明显的类别不平衡问题,例如积雨云样本仅占总量的约8%,这在后续模型训练中需要特别注意。
2.2 数据预处理流程
图像预处理采用标准的计算机视觉流程:
python复制train_tfms = transforms.Compose([
transforms.Resize((224, 224)), # 统一分辨率
transforms.RandomHorizontalFlip(), # 数据增强
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], # ImageNet统计量
std=[0.229, 0.224, 0.225]),
])
关键细节说明:
- 统一缩放到224×224分辨率以适应ResNet输入要求
- 随机水平翻转作为唯一的数据增强手段(云层通常没有方向性)
- 使用ImageNet的均值和标准差进行归一化,这与预训练权重匹配
2.3 数据集划分策略
采用分层抽样保证各类别比例一致:
python复制sss = StratifiedShuffleSplit(n_splits=1, test_size=0.1, random_state=42)
tr_idx, va_idx = next(sss.split(np.zeros(len(y)), y))
这种划分方式确保了训练集和验证集中各类别的比例与原始数据集保持一致,避免了因随机划分导致的类别分布偏差。
3. 模型架构与训练
3.1 ResNet18迁移学习实现
模型实现的关键代码:
python复制model = models.resnet18(weights=models.ResNet18_Weights.IMAGENET1K_V1)
model.fc = nn.Linear(model.fc.in_features, len(classes))
# 冻结除全连接层外的所有参数
for name, p in model.named_parameters():
p.requires_grad = name.startswith("fc.")
迁移学习策略解析:
- 保留ResNet18在ImageNet上预训练的特征提取器
- 仅微调最后的全连接层(fc)
- 这种策略在小数据集上特别有效,可以防止过拟合
3.2 训练配置细节
优化器选择AdamW而非标准Adam:
python复制optimizer = optim.AdamW(filter(lambda p: p.requires_grad, model.parameters()),
lr=1e-3, weight_decay=1e-4)
AdamW将权重衰减与梯度更新解耦,能带来更稳定的训练效果。
学习率调度采用余弦退火:
python复制scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=10)
这种调度方式让学习率在10个epoch内从初始值平滑下降到0,有助于模型跳出局部最优。
3.3 损失函数改进
使用标签平滑的交叉熵损失:
python复制criterion = nn.CrossEntropyLoss(label_smoothing=0.05)
标签平滑通过给非目标类别分配少量概率(这里设为0.05),可以减轻模型过拟合和过度自信的问题。
4. 模型评估与分析
4.1 K折交叉验证结果
5折交叉验证显示模型表现稳定:
- 平均验证准确率:89.2%
- 标准差:2.1%
这表明模型在不同数据划分下性能波动较小,具有良好的泛化能力。
4.2 混淆矩阵分析
从混淆矩阵可以看出:
- 积云(Cumulus)和层积云(Stratocumulus)容易混淆
- 晴空(Clear)分类准确率最高(98%)
- 积雨云(Cumulonimbus)由于样本较少,准确率相对较低(83%)
4.3 训练曲线解读
训练过程显示:
- 训练损失和验证损失收敛良好,没有明显过拟合
- 验证准确率在15个epoch后趋于稳定
- 最终测试集准确率达到88.7%,与验证集表现一致
5. 实际应用建议
-
数据增强扩展:可以增加随机旋转、亮度/对比度调整等增强方式,特别是在样本较少的类别上。
-
类别不平衡处理:尝试使用加权损失函数或过采样技术改善少数类表现。
-
模型轻量化:如需部署到边缘设备,可以考虑量化或剪枝技术减小模型体积。
-
误分类分析:收集模型预测错误的样本进行人工分析,找出系统性错误模式。
这个云层分类模型可以集成到气象观测系统中,实现自动化云量统计和云型识别。相比传统方法,它能处理更大规模的数据,并提供更一致的结果。后续可以考虑扩展到更多云类或结合时序信息进行动态分析。
