RIPU 水记(语义分割,小样本 迁移学习 主动学习)
《Towards Fewer Annotations: Active Learning via Region Impurity and Prediction Uncertainty for Domain Adaptive Semantic Segmentation》
论文:https://arxiv.org/abs/2111.12940
项目:https://github.com/BIT-DA/RIPU
讲解:BV1oS4y1e7J5
用主动学习做迁移学习,实现极少标注的语义分割
分三步:
- 准备:一个预训练的语义分割模型
- 用算法挑选需要人工标注的区域,做人工标注
- 用新数据混合原数据,训练模型
其中,二三步交替进行,直到标注量达到预设的上限。
他做的是合成的数据集(GTAV,SYNTHIA)迁移到 真实数据集(Cityscapes)
讲道理我认为这个gap并不大,所以他在迁移的时候还是用了源域数据一起训练,完全只是一个finetune级别的迁移。
我认为在迁移gap比较大的时候是不能用源域数据的,如果遇到这种情况应该怎么用主动学习来处理呢。
只用了负伪标签,不用伪标签。因为伪标签往往会受到类别不平衡的影响。
选取区域
选取的标注区域的方法与一般方法不同,不是超像素、也不是网格划分,而是固定尺寸的滑动窗口(也研究了只标注单个像素的情况,这种情况就直接选中心像素)
遍历所有可能的区域,选取评分最高的区域用于标注
评分有两个指标,区域不纯度 和 预测不确定度。最终的评分是两个指标的乘积
区域不纯度:
计算区域内所有类别所占面积之的比例,然后算熵。简单来说就是区域内类别越多,所占面积越平均,不纯度越高。
预测不确定度:
求出每个像素类别的熵,在区域中求平均(分割模型会输出每个像素的one-hot分类,用这个就能计算出像素级的熵了)。也就是说,分类标签出现多个标签概率相近时,不确定度越高。
如果要做单像素标注,就不用区域内平均了。
训练
min Θ L s u p + α 1 L c r s + α 2 L n l t \min _{\Theta} \mathcal{L}_{s u p}+\alpha_{1} \mathcal{L}_{c r}^{s}+\alpha_{2} \mathcal{L}_{n l}^{t} ΘminLsup+α1Lcrs+α2Lnlt
可以看到损失函数有三部分
第一部分,在原数据集和新数据集上计算标准的交叉熵分类损失。
L s u p = L C E s ( I s , Y s ) + L C E t ( I t , Y ~ t ) \mathcal{L}_{s u p}=\mathcal{L}_{C E}^{s}\left(\mathbf{I}_{s}, \mathbf{Y}_{s}\right)+\mathcal{L}_{C E}^{t}\left(\mathbf{I}_{t}, \tilde{\mathbf{Y}}_{t}\right) Lsup=LCEs(Is,Ys)+LCEt(It,Y~t)
第二部分,在原数据集上,做一致性约束,提高光滑性。
L c r s = 1 ∣ I s ∣ ∑ ( i , j ) ∈ I s ∥ P ( i , j ) − P ‾ ( i , j ) ∥ 1 \mathcal{L}_{c r}^{s}=\frac{1}{\left|\mathbf{I}_{s}\right|} \sum_{(i, j) \in \mathbf{I}_{s}}\left\|\mathbf{P}^{(i, j)}-\overline{\mathbf{P}}^{(i, j)}\right\|_{1} Lcrs=∣Is∣1(i,j)∈Is∑∥ ∥P(i,j)−P(i,j)∥ ∥1
计算当前像素值与其邻域平均值之间的 L1 距离,得到单个像素的一致性损失,然后在整张图上做平均。
第三部分,在新数据集上,计算负学习损失。
负学习损失:
在训练初期,标签中有时候会缺席特定的类别,这称为负伪标签 [25,74] 。
比如,假设有三个类别,概率分别为 0.49 0.5 0.01 ,虽然前两个类别具体选哪个还不好定夺,但是第三个肯定不是正确的类别。
我们定义负伪标签:
当概率小于某一个特定值(本文中为0.05),就认为必定不属于该类,是一个负伪标签。
于是我们定义出负学习损失:
L n l t = − 1 Λ ( I t ) ∑ ( i , j ) ∈ I t ∑ c = 1 C π ( P t ( i , j , c ) ) log ( 1 − P t ( i , j , c ) ) \mathcal{L}_{n l}^{t}=\frac{-1}{\Lambda\left(\mathbf{I}_{t}\right)} \sum_{(i, j) \in \mathbf{I}_{t}} \sum_{c=1}^{C} \pi\left(\mathbf{P}_{t}^{(i, j, c)}\right) \log \left(1-\mathbf{P}_{t}^{(i, j, c)}\right) Lnlt=Λ(It)−1(i,j)∈It∑c=1∑Cπ(Pt(i,j,c))log(1−Pt(i,j,c))
其中, Λ ( I t ) \Lambda\left(\mathbf{I}_{t}\right) Λ(It) 表示所有可用的负伪标签数量, 定义为 Λ ( I t ) = ∑ ( i , j ) ∈ I t ∑ c = 1 C π ( P t ( i , j , c ) ) \Lambda\left(\mathbf{I}_{t}\right)=\sum_{(i, j) \in \mathbf{I}_{t}} \sum_{c=1}^{C} \pi\left(\mathbf{P}_{t}^{(i, j, c)}\right) Λ(It)=∑(i,j)∈It∑c=1Cπ(Pt(i,j,c))