共计 1760 个字符,预计需要花费 5 分钟才能阅读完成。
引言
AffectNet 作为当前最大规模的面部表情识别数据集,包含超过 100 万张标注图像,覆盖 7 类基本表情(anger、contempt、disgust、fear、happy、sad、surprise)。然而实际分析发现,各类别样本量差异显著:happy 类占比高达 42.1%,而 contempt 仅占 1.8%,anger 也只有 4.2%。这种不平衡分布会导致模型偏向多数类,严重影响 minority class 的识别效果。

三类主流解决方案对比
- 过采样(SMOTE)
- 对少数类样本进行插值生成新样本
-
问题:图像数据插值可能生成模糊无效样本,且百万级数据集会导致内存爆炸(实测 16GB 显存仅能处理 5% 数据)
-
欠采样
- 随机丢弃多数类样本
-
缺陷:happy 类从 42 万削减到 1.8 万(与 contempt 持平)时,模型准确率下降 19%
-
加权损失函数
- 基础加权交叉熵:$L = -\sum w_i y_i \log(p_i)$
- 局限:静态权重无法适应训练过程中的分布变化
混合解决方案实现
Class-Balanced Loss 改进
核心公式:
$$w_i = \frac{1 – \beta}{1 – \beta^{n_i}}$$
其中 $n_i$ 为第 i 类样本量,$\beta$ 控制权重衰减速度(建议 0.999)。代码实现关键点:
class CBLoss(nn.Module):
def __init__(self, beta=0.999, num_classes=7):
super().__init__()
self.beta = beta
self.num_classes = num_classes
def forward(self, logits, targets):
# 获取各类别样本数(需预先统计)class_count = torch.tensor([1842, 420000, ...]) # contempt,happy,...
# 计算有效样本数权重
weights = (1 - self.beta) / (1 - torch.pow(self.beta, class_count))
weights = weights / weights.sum() * self.num_classes # 归一化
# 加权交叉熵
loss = F.cross_entropy(logits, targets, weight=weights.to(logits.device))
return loss
轻量级 StyleGAN2 生成
关键配置:
– 输入分辨率:128×128(原图下采样)
– 网络深度:映射网络 4 层,生成器 8 层
– 超参:batch_size=32,lr=0.002,R1 正则系数 γ =10
– 停止条件:FID 分数连续 3epochs<15
生成样本示例:
aug_pipeline = A.Compose([A.HorizontalFlip(p=0.5),
A.RandomBrightnessContrast(p=0.2),
A.GaussNoise(var_limit=(5,20),p=0.3),
A.CoarseDropout(max_holes=8, max_height=16, max_width=16, p=0.5)
])
性能验证
在 ResNet-50 基准模型上的对比结果:
| 方案 | 整体准确率 | F1-score | contempt 召回率 |
|---|---|---|---|
| 原始 | 68.2% | 0.59 | 12.4% |
| 混合 | 73.1% | 0.71 | 37.8% |
混淆矩阵显示:happy 类精度保持 89% 的同时,contempt 召回率提升 3 倍,anger 类 F1-score 从 0.41 升至 0.63。
避坑指南
- 生成样本质量控制
- 每生成 5000 张样本计算一次 FID
-
建议保留 FID<15 的检查点
-
温度参数调优
- 初始设置 $\beta=0.9$ 快速验证
- 最终训练采用 $\beta=0.999$
-
可视化各类别 loss 变化曲线
-
测试集规范
- 必须保持原始分布不变
- 建议从原始验证集拆分 20% 作为测试集
拓展思考
当新增 compound 表情类别(如 happily surprised)时:
1. 需要重新统计类别分布
2. GAN 生成器需追加新类别的少量真实样本微调
3. 加权公式中的 $n_i$ 需包含新类别样本数
4. 可能需要调整温度参数 $\beta$
完整实现代码已开源在 GitHub(伪代码已展示关键部分)。这种混合方案在保证多数类性能的同时,显著提升了 minority class 的识别效果,特别适合医疗表情识别等严肃场景。
