1

半监督浅显入门

 2 years ago
source link: https://yuanjie-ai.github.io/2022/01/30/semi-intro/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

半监督浅显入门

发表于

2022-01-30

阅读次数: 3 本文字数: 2.5k 阅读时长 ≈ 2 分钟

寒假开始前还是把在学校里遗留的工作先搞完,所接项目的目标是实现半监督语义分割。既然是半监督,就先来看一下半监督的经典论文,我选了经典的、结构相似的三篇论文。

第一篇是:NIPS 2017 的 Mean teachers are better role models: Weight-averaged consistency targets improve semi-supervised deep learning results,因为我发现伪标签相关的论文或多或少有它的影子。

第二篇是:ICCV 2021 的 End-to-End Semi-Supervised Object Detection with Soft Teacher,微软出品的半监督目标检测,质量上还是比较让人相信的,且语义分割也可以借鉴目标检测的东西。

第三篇是:ECCV 2021 的 Semi-supervised Semantic Segmentation via Strong-weak Dual-branch Network,因为搜半监督语义分割,最新的进展论文就是它了。

文章最后有代码实现。才发现好久没更新博客了。

因为现实世界标注数据比较昂贵,但无标注的数据很容易获得,那么基于少量标注数据和大量无标注数据的训练,也就是半监督训练也成为了研究的热门。简单来说,半监督分为两类:

  • 伪标签,用有标签数据训练一个分类器,然后用这个分类器对无标签数据进行分类,这样就会产生伪标签(pseudo label),挑选其中认为分类正确的无标签样本,把选出来的无标签样本用来训练分类器,这样就使用了无标签数据。
  • 协同训练,假设每个数据可以从不同的视角(对应到 torch 的话,就是不同的 torchvision.transform)进行分类。不同视角可以训练出不同的分类器,分类器对不同视角的图片分类结果应该相同。然后用这些从不同视角训练出来的分类器对无标签样本进行分类,再选出认为可信的无标签样本加入训练集中。由于这些分类器从不同视角训练出来的,可以形成一种互补,而提高分类精度,就如同从不同视角可以更好地理解事物一样。

半监督图像分类

这篇论文还是很简单的:

HC2TpQ.png

但论文中的训练过程写的不是很清楚,看了代码了解了完整的训练流程:

  • 有标签输入学生的预测输出和 one-hot label 进行对比,这个是分类损失;和教师的输出使用 consistency cost 进行对比,论文中用的是两个模型输出的二阶范数,代码提供了 msekl 散度两个损失。第二个 loss 根据 epoch 调整权重,epoch 越大,权重越大。
  • 两个权重相加,反向传播更新学生的模型,exponential moving average (EMA) 更新教师模型,能在每个 batch 后聚合信息而不是每个 epoch 后才聚合信息,这样能获取更好的表示。
  • 最后使用教师模型进行预测。

至于无标签数据部分,就是一批数据作两次变换,第一组视为有标签,第二组数视为无标签。

这篇论文的思想可以总结为:作为教师,用来产生学生学习时的目标;作为学生,则利用教师模型产生的目标来进行学习。

半监督目标检测

如果说分类图像的数据难以标注,那么目标检测的数据更加难以标注。

半监督目标检测的重点是:提升伪标签质量,伪标签质量好了也利于后续的训练。传统的半监督目标检测是多阶段方法:使用标签数据训练一个检测器,之后对无标签数据生成伪标签,再次训练检测器。但是也很容易受到限制:如何保证伪标签的质量?标签数据和无标签数据分布不一致怎么办?且不是端到端的,多年前写 MTCNN 的时候就感觉不是端到端就很不方便。

同样类似 mean teacher 的结构,创建两个模型,并使用 EMA 更新教师模型。教师模型指导学生模型的训练,而不是简单的提供伪标签就结束了。在获取学生模型生成的预测后,得分大于某个阈值的视为前景,以此保证伪标签的质量,但即使这样仍然有很多预测结果是背景,后文会给出解决方案。

对于无标签数据,控制标签数据和无标签数据在一个 batch 中的比率,从 0.5 开始,衰减到最后的 epoch 为 0。

HC2bXn.png

在图里可以看到:教师模型对无标签数据进行弱数据增强,并生成盒子的伪标签和类别的伪标签。学生模型读入有标签数据,得到一个损失 Lu ,对无标签数据使用强数据增强,预测结果和教师模型生成的伪标签对比,又得到一个损失 Ls 。最后的损失为 Ls+αLu。

对于 Lu 的分类部分,与半监督分类的一致性分布损失相反,目标检测的伪标签相对复杂,无标签数据上能检测出上千个盒子,即使 NMS 之后也会留下很多盒子,所以选择前景分数大于某个阈值的作为盒子,但是阈值高导致召回率低,也就是说,学习模型的前景被匹配为背景。为了避免这个问题,在得到学生模型计算出的前景和背景后,前景直接和伪标签进行对比,背景使用可靠性分数进行加权。

对于 Lu 的盒子部分,前景得分并没有提供很好的定位信息,也就是说使用得分作为阈值筛选教师提供的盒子伪标签没啥用,那么如何使盒子的定位信息更加可靠呢?论文是这么做的,在教师生成的标签盒子周围附近进行随机采样,再次得到预测的盒子,重复这个过程N(实验部分取 10)次得到多个盒子,计算这些盒子的标准差,标准茶大于 0.5 的才视为前景的盒子。

代码是用 mmdetection 写的,几年前我用过这个东西,暂时不考虑精读代码,这个并不是大众用户的东西,暂时不考虑精读代码。

半监督语义分割

HC2xtU.png

这篇论文的结构和上面两篇论文的结构很像,在这一瞬间仿佛世界线收束了,虽然这个论文没提供代码,但个人感觉这个方法是靠谱的。

它在语义分割的时候分为有标签样本和弱标签样本,弱标签样本是用别的方法生成的,我没有细看生成的方法。因为我准备在这篇论文的结构上在加一个教师网络,用教师网络生成伪标签,剩下的东西和半监督图像分类差不多了。

代码用的 segmentation model pytorch,我看了下代码,魔改成半监督的话还是比较简单的,思路有了,代码都好说。会在不久的将来开源程序和结果,预计三月初。

半监督目标检测 MMdetection 实现


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK