目录
[(一)Binary Cross Entropy(BCE)](#(一)Binary Cross Entropy(BCE))
[(二)Label-wise Attention](#(二)Label-wise Attention)
[(三)Graph-based Label Modeling](#(三)Graph-based Label Modeling)
[(四)Transformer Label Embedding](#(四)Transformer Label Embedding)
[(一)Focal Loss](#(一)Focal Loss)
[(二)Class Weight](#(二)Class Weight)
[(四)标签平滑(Label Smoothing)](#(四)标签平滑(Label Smoothing))
[(一)Hamming Loss](#(一)Hamming Loss)
[(二)Precision / Recall / F1](#(二)Precision / Recall / F1)
[(三)mAP(mean Average Precision)](#(三)mAP(mean Average Precision))
[十三、多标签 vs 多类别 vs 检测任务](#十三、多标签 vs 多类别 vs 检测任务)
在图像分类任务中,我们通常最先接触的是"多类别分类"(Multi-class Classification),即:
一张图片只属于一个类别
例如:
-
一张图是"猫"或"狗"
-
一张医学影像是"正常"或"异常"
但在真实世界中,很多图像并不是"单标签"的。
例如:
一张街景图片
可能同时包含:
-
行人
-
汽车
-
红绿灯
-
建筑物
-
树木
此时,如果仍然使用单标签分类,就会丢失大量信息。
因此引出了一个更贴近现实的问题:
多标签图像分类(Multi-label Image Classification)
本文将系统讲解多标签分类的核心思想、模型结构、损失函数以及主流方法。
二、多标签图像分类的本质
(一)任务定义
多标签分类的目标是:
一张图片可以同时属于多个类别
形式化表示:
y ∈ {0,1}^C
其中:
-
C:类别数量
-
y_i = 1 表示该类别存在
-
y_i = 0 表示不存在
(二)示例
一张图片可能标注为:
猫:1
狗:1
车:0
人:1
说明:
一个样本 → 多个标签
(三)核心区别
| 类型 | 输出关系 | 激活函数 |
|---|---|---|
| 多类别分类 | 互斥 | Softmax |
| 多标签分类 | 非互斥 | Sigmoid |
三、多标签分类与多类别分类的本质区别
(一)概率约束不同
多类别分类
\sum_{i=1}^{C} P(y_i|x)=1
多标签分类
0 \le P(y_i|x) \le 1
每个类别独立判断。
(二)直观理解
多类别:
只能选一个答案
多标签:
可以选择多个答案
四、多标签分类模型基本结构
无论是CNN还是Transformer,多标签分类结构基本一致:
Input Image
↓
Feature Extractor
↓
Classification Head
↓
Sigmoid
↓
Multi-label Output
(一)核心变化点
与多类别分类相比:
Softmax → Sigmoid
五、Sigmoid在多标签分类中的作用
(一)Sigmoid函数
\sigma(x)=\frac{1}{1+e^{-x}}
(二)作用机制
对每个类别独立计算概率:
猫:0.9
狗:0.8
车:0.1
(三)输出特点
每个类别独立判断
不需要归一化。
六、多标签分类损失函数
(一)Binary Cross Entropy(BCE)
L=-\sum_{i=1}^{C}y_i\\log(p_i)+(1-y_i)\\log(1-p_i)
(二)解释
每个类别都是一个:
二分类问题
(三)训练逻辑
例如:
猫 → 是 / 否
狗 → 是 / 否
车 → 是 / 否
七、多标签分类模型结构类型
(一)CNN多标签模型
结构
Image
↓
ResNet / EfficientNet
↓
FC Layer
↓
Sigmoid
特点
稳定
易训练
(二)Transformer多标签模型
结构
Image
↓
Patch Embedding
↓
Transformer Encoder
↓
CLS Token / Patch Tokens
↓
MLP Head
↓
Sigmoid
特点
全局建模能力强
八、多标签分类关键建模方式
(一)Sigmoid分类头
最常见方式:
C个独立输出节点
(二)Label-wise Attention
对每个类别单独学习注意力权重。
(三)Graph-based Label Modeling
构建标签关系图:
猫 ←→ 动物
车 ←→ 交通工具
(四)Transformer Label Embedding
将标签本身也嵌入模型:
Label Embedding + Image Features
九、多标签分类中的核心挑战
(一)标签不平衡
某些标签出现频率极低。
例如:
"飞机"在自然图像中很少出现
(二)标签共现关系复杂
例如:
海滩 + 人 + 阳光
强关联。
(三)标签噪声
数据标注不完整:
图片有猫,但未标注
(四)类别依赖性
标签之间存在:
强相关 / 弱相关 / 互斥
十、多标签分类优化方法
(一)Focal Loss
解决类别不平衡:
FL=-(1-p_t)^\gamma \log(p_t)
(二)Class Weight
对少数类别加权。
(三)数据增强
-
MixUp
-
CutMix
-
RandAugment
(四)标签平滑(Label Smoothing)
减少过拟合。
十一、多标签分类评价指标
(一)Hamming Loss
HL=\frac{1}{N\times C}\sum |y-\hat{y}|
(二)Precision / Recall / F1
适用于多标签平均计算。
(三)mAP(mean Average Precision)
最常用指标:
排序质量评估
十二、多标签分类应用场景
(一)图像标注
例如:
-
Flickr标签系统
-
图像搜索引擎
(二)医疗影像
一个CT可能包含:
-
肿瘤
-
炎症
-
出血
(三)自动驾驶
-
行人
-
车辆
-
信号灯
-
路牌
(四)内容审核
-
色情
-
暴力
-
政治敏感
(五)电商推荐
一张商品图可能包含:
-
衣服
-
男装
-
休闲风
十三、多标签 vs 多类别 vs 检测任务
| 任务 | 输出形式 | 特点 |
|---|---|---|
| 多类别分类 | 单标签 | 互斥 |
| 多标签分类 | 多标签 | 非互斥 |
| 目标检测 | 框 + 类别 | 空间定位 |
十四、PyTorch多标签分类示例
import torch
import torch.nn as nn
class MultiLabelModel(nn.Module):
def __init__(self, num_classes):
super().__init__()
self.backbone = nn.Sequential(
nn.Conv2d(3, 64, 3, stride=2, padding=1),
nn.ReLU(),
nn.AdaptiveAvgPool2d((1,1))
)
self.classifier = nn.Linear(64, num_classes)
def forward(self, x):
x = self.backbone(x)
x = x.view(x.size(0), -1)
logits = self.classifier(x)
return torch.sigmoid(logits)
十五、多标签分类发展趋势
(一)从CNN到Transformer
-
CNN(ResNet)
-
Transformer(ViT)
(二)从独立标签到关系建模
-
Label Graph
-
Attention Dependency
(三)从静态分类到多模态理解
例如:
-
CLIP
-
GPT-4V
-
Gemini
十六、总结
多标签图像分类是比多类别分类更接近真实世界的一类视觉任务,它允许一张图片同时拥有多个语义标签,因此在复杂场景理解中具有极高价值。
本文重点掌握了:
1、多标签分类定义;
2、与多类别分类区别;
3、Sigmoid机制;
4、BCE损失函数;
5、CNN与Transformer结构;
6、标签建模方法;
7、核心挑战;
8、评价指标;
9、应用场景;
10、发展趋势。
可以将多标签分类理解为:
"一个将图像映射到多个独立语义空间的并行判别系统,每个标签都是一个独立的二分类问题。"
正是这种机制,使模型能够更真实地描述复杂世界中的视觉内容,是现代视觉理解系统的重要组成部分。