【语义分割研究】Semi-Supervised Semantic Segmentation Using Unreliable Pseudo-Labels 不可靠伪标签的半监督语义分割

本文主要是介绍【语义分割研究】Semi-Supervised Semantic Segmentation Using Unreliable Pseudo-Labels 不可靠伪标签的半监督语义分割,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

论文标题:Semi-Supervised Semantic Segmentation Using Unreliable Pseudo-Labels
作者信息:商汤科技, 上海交通大学, 香港中文大学
录用信息:CVPR 2022 → arXiv:https://arxiv.org/pdf/2203.03884.pdf
代码开源:https://github.com/Haochen-Wang409/U2PL
Project Page:https://haochen-wang409.github.io/U2PL/

背景

半监督学习的核心问题在于有效利用无标注数据,作为有标签样本的补充,以提升模型性能。

  • 通常作法是通过样本筛选等方式降低错误伪标签的影响,然而只选择高置信度的预测结果作为无标签样本的伪标签,这种朴素的 self-training 策略会将大量的无标签数据排除在训练过程外,导致模型训练不充分。
  • 此外,如果模型不能较好地预测某些 hard class,那么就很难为该类别的无标签像素分配准确的伪标签,从而进入恶性循环。

这篇论文的核心思想:低质量伪标签也应当被合理利用

Motivation: Every Pixel Matters

具体来说,预测结果的可靠与否,我们可以通过熵 (per-pixel entropy) 来衡量,低熵表示预测结果可靠,高熵表示预测结果不可靠。我们通过 Figure 2 来观察一个具体的例子,Figure 2(a) 是一张蒙有 entropy map 的无标签图片,高熵的不可靠像素很难被打上一个确定的伪标签,因此不参与到 re-training 过程,在 FIgure 2(b) 中我们以白色表示。
在这里插入图片描述

  • figure.c 中的小孩的置信度很高,证明模型预测结果可行。figure.d 中像素点在 motorbike 和 person 两个类别上都具有不低的预测概率且在数值上较为接近,模型无法给出一个确定的预测结果,符合文中定义的 unralibale prediction。但是显然,不属于 car 或者 train这种类别
  • 即使是不可靠的预测结果,虽然无法打上确定的伪标签,但可以作为部分类别的负样本,从而参与到模型的训练。这样所有的无标签样本都能在训练过程中发挥作用。

Method

在这里插入图片描述

  • 对于有标签的数据,利用 student 进行学习训练。然后利用训练好的模型,将无标签数据中的像素分为 reliable 和 unreliable 两种,然后再在这个基础上进行对比表征学习。单个网络的具体组成主要参考的是 ReCo,具体包括 e n c o d e r h , d e c o d e r f encoder h, decoder f encoderh,decoderf 和表征头 g g g
  • 目标函数如下:
    在这里插入图片描述
    • 损失函数优化上,有标签数据直接基于标准的交叉熵损失函数 L s L_s Ls 进行优化。
    • 无标签数据则先靠 teacher 给出预测结果,然后根据 pixel-level entropy 分成 reliable pixels 和 unreliable pixels 两大部分 最后分别基于 L u L_u Lu L c L_c Lc 进行优化。这个 L c L_c Lc 就是对比表征的InfoNCE Loss

L c L_c Lc中的正负样本

  • 正样本对: 对于有标签样本和无标签样本,筛选的标准是一致的,就是该样本在真值标签类别或伪标签类别上的预测概率大于一个阈值,
  • 负样本对:对于有标签样本,因们明确知道其所属的类别,因此除真值标签外的所有类别都可以作为该像素的负样本类别;而对于无标签样本,由于伪标签可能存在错误,因此我们并不完全却行确信标签的正确性,因而我们需要将预测概率最高的几个类别过滤掉,将该像素认作为剩下几个类别的负样本。

实验结果

网络结构:ResNet-101 + Deeplab v3
数据集合:** Classic VOC, Blender VOC, Cityscapes **

在这里插入图片描述

  • 分数表示标签数据与无标签数据的比例

论文复现

  • 具体思路可以按照github上的readMe来,当然可能有几个点需要修改:

文件目录下载

  • 数据集下载:
    • Download “eftImg8bit_trainvaltest.zip" from: https://www.cityscapes-dataset.com/downloads/
    • Download “gtFine.zip” from: https://drive.google.com/file/d/10tdElaTscdhojER_Lf7XlytiyAkk7Wlg/view?usp=sharing
  • 下载数据集合,然后将其放入项目中,文件目录如下:
    data
    ├── cityscapes
    │   ├── gtFine
    │   └── leftImg8bit
    ├── splits
    │   ├── cityscapes
    │   └── pascal
    

模型训练

要求:由于图片过大,目前batchsize=4的情况下,也需要8个GPU才能跑。训练步骤如下:

  • 迁移学习,下载ImageNet的预训练模型: Baidu Drive Fetch Code: 3p9h

  • for Cityscapes, a model supervised by 744labeled data and 2231unlabeled data can be trained by:

    cd experiments/cityscapes/744/ours
    # use torch.distributed.launch
    sh train.sh <num_gpu> <port># or use slurm
    # sh slurm_train.sh <num_gpu> <port> <partition>
    

    After training, the model should be evaluated by

    sh eval.sh
    

模型测试【以744 Cityscapes数据集为例】

  • 由于模型训练过程要求的硬件太高,可以使用作者提供的预训练模型,直接进行测试。
  • 为了复现作者结果可能需要修改几处代码:
    • 第一处:修改experiments/cityscapes/744/ours/config.yaml 中的dataset的type:
      dataset: # Required.type: cityscapes_semi
      
    • 第二处:下载作者提供的训练好的模型【这里下载744的即可】,将其放在experiments/cityscapes/744/ours/checkpoints
    • 第三处:在experiments/cityscapes/744/ours/eval.sh 中修改加载模型的路径:
      python $ROOT/eval.py \
      --config=config.yaml \
      --base_size 128 \
      --scales 1.0 \
      --model_path=checkpoints/city_744_AEL_U2PL_78.51.pth \
      --save_folder=checkpoints/results \
      2>&1 | tee log/val_last_$now.txt
      
    • 第四处:增加加载语句: 大概率是由于作者提供的训练模型是很早之前的,然后新代码和这个模型的字段还有所不同因此,需要在eval.py 的122行添加一句话:
      .....
      checkpoint = torch.load(args.model_path)
      checkpoint = {'model_state': checkpoint}#需要添加的加载语句
      key = "teacher_state" if "teacher_state" in checkpoint.keys() else "model_state"	`````
      ........
      
  • 开始测试:
    sh cd experiments/cityscapes/744/ours sh eval.sh
    结果如下【实验结果和论文结果基本一致】:
    [2022-11-08 18:07:48,490 INFO eval.py line 77 18926] Namespace(base_size=128, config='config.yaml', crop=False, model_path='checkpoints/city_744_AEL_U2PL_78.51.pth', names_path='../../vis_meta/cityscapes/cityscapesnames.mat', save_folder='checkpoints/results', scales=[1.0])
    [2022-11-08 18:07:48,491 INFO eval.py line 118 18926] => creating model from 'checkpoints/city_744_AEL_U2PL_78.51.pth' ...
    [2022-11-08 18:07:49,253 INFO eval.py line 125 18926] => load checkpoint[model_state]
    [2022-11-08 18:07:51,020 INFO eval.py line 130 18926] Load Model Done!
    [2022-11-08 18:07:51,020 INFO eval.py line 317 18926] >>>>>>>>>>>>>>>> Start Evaluation >>>>>>>>>>>>>>>>
    [2022-11-08 18:07:58,969 INFO eval.py line 348 18926] Test: [10/500] Data 0.161 (0.155) Batch 0.780 (0.795).
    [2022-11-08 18:08:07,000 INFO eval.py line 348 18926] Test: [20/500] Data 0.165 (0.164) Batch 0.782 (0.799).
    [2022-11-08 18:08:15,025 INFO eval.py line 348 18926] Test: [30/500] Data 0.168 (0.167) Batch 0.793 (0.800).
    [2022-11-08 18:08:23,096 INFO eval.py line 348 18926] Test: [40/500] Data 0.160 (0.168) Batch 0.783 (0.802).
    [2022-11-08 18:08:31,215 INFO eval.py line 348 18926] Test: [50/500] Data 0.180 (0.169) Batch 0.819 (0.804).
    [2022-11-08 18:08:39,478 INFO eval.py line 348 18926] Test: [60/500] Data 0.175 (0.169) Batch 0.822 (0.808).
    [2022-11-08 18:08:47,866 INFO eval.py line 348 18926] Test: [70/500] Data 0.169 (0.170) Batch 0.854 (0.812).
    [2022-11-08 18:08:56,149 INFO eval.py line 348 18926] Test: [80/500] Data 0.171 (0.169) Batch 0.834 (0.814).
    [2022-11-08 18:09:04,485 INFO eval.py line 348 18926] Test: [90/500] Data 0.157 (0.169) Batch 0.821 (0.816).
    [2022-11-08 18:09:12,885 INFO eval.py line 348 18926] Test: [100/500] Data 0.162 (0.170) Batch 0.839 (0.819).
    [2022-11-08 18:09:21,369 INFO eval.py line 348 18926] Test: [110/500] Data 0.175 (0.170) Batch 0.877 (0.821).
    [2022-11-08 18:09:29,919 INFO eval.py line 348 18926] Test: [120/500] Data 0.181 (0.170) Batch 0.842 (0.824).
    [2022-11-08 18:09:38,498 INFO eval.py line 348 18926] Test: [130/500] Data 0.153 (0.170) Batch 0.828 (0.827).
    [2022-11-08 18:09:47,131 INFO eval.py line 348 18926] Test: [140/500] Data 0.157 (0.170) Batch 0.836 (0.829).
    [2022-11-08 18:09:55,671 INFO eval.py line 348 18926] Test: [150/500] Data 0.168 (0.170) Batch 0.839 (0.831).
    [2022-11-08 18:10:04,354 INFO eval.py line 348 18926] Test: [160/500] Data 0.167 (0.170) Batch 0.902 (0.833).
    [2022-11-08 18:10:12,982 INFO eval.py line 348 18926] Test: [170/500] Data 0.167 (0.170) Batch 0.848 (0.835).
    [2022-11-08 18:10:21,601 INFO eval.py line 348 18926] Test: [180/500] Data 0.180 (0.170) Batch 0.862 (0.837).
    [2022-11-08 18:10:30,361 INFO eval.py line 348 18926] Test: [190/500] Data 0.165 (0.170) Batch 0.856 (0.839).
    [2022-11-08 18:10:39,035 INFO eval.py line 348 18926] Test: [200/500] Data 0.165 (0.170) Batch 0.857 (0.840).
    [2022-11-08 18:10:47,812 INFO eval.py line 348 18926] Test: [210/500] Data 0.178 (0.170) Batch 0.867 (0.842).
    [2022-11-08 18:10:56,564 INFO eval.py line 348 18926] Test: [220/500] Data 0.178 (0.170) Batch 0.873 (0.843).
    [2022-11-08 18:11:05,361 INFO eval.py line 348 18926] Test: [230/500] Data 0.165 (0.170) Batch 0.861 (0.845).
    [2022-11-08 18:11:14,090 INFO eval.py line 348 18926] Test: [240/500] Data 0.193 (0.170) Batch 0.887 (0.846).
    [2022-11-08 18:11:22,847 INFO eval.py line 348 18926] Test: [250/500] Data 0.165 (0.171) Batch 0.862 (0.847).
    [2022-11-08 18:11:31,592 INFO eval.py line 348 18926] Test: [260/500] Data 0.165 (0.170) Batch 0.850 (0.848).
    [2022-11-08 18:11:40,389 INFO eval.py line 348 18926] Test: [270/500] Data 0.161 (0.170) Batch 0.855 (0.850).
    [2022-11-08 18:11:49,215 INFO eval.py line 348 18926] Test: [280/500] Data 0.187 (0.170) Batch 0.915 (0.851).
    [2022-11-08 18:11:58,026 INFO eval.py line 348 18926] Test: [290/500] Data 0.171 (0.170) Batch 0.899 (0.852).
    [2022-11-08 18:12:06,710 INFO eval.py line 348 18926] Test: [300/500] Data 0.155 (0.170) Batch 0.824 (0.852).
    [2022-11-08 18:12:15,464 INFO eval.py line 348 18926] Test: [310/500] Data 0.180 (0.170) Batch 0.888 (0.853).
    [2022-11-08 18:12:24,274 INFO eval.py line 348 18926] Test: [320/500] Data 0.165 (0.170) Batch 0.869 (0.854).
    [2022-11-08 18:12:33,070 INFO eval.py line 348 18926] Test: [330/500] Data 0.167 (0.170) Batch 0.868 (0.855).
    [2022-11-08 18:12:41,751 INFO eval.py line 348 18926] Test: [340/500] Data 0.180 (0.170) Batch 0.891 (0.855).
    [2022-11-08 18:12:50,462 INFO eval.py line 348 18926] Test: [350/500] Data 0.172 (0.170) Batch 0.876 (0.856).
    [2022-11-08 18:12:59,278 INFO eval.py line 348 18926] Test: [360/500] Data 0.175 (0.170) Batch 0.872 (0.856).
    [2022-11-08 18:13:08,047 INFO eval.py line 348 18926] Test: [370/500] Data 0.149 (0.170) Batch 0.856 (0.857).
    [2022-11-08 18:13:16,831 INFO eval.py line 348 18926] Test: [380/500] Data 0.173 (0.170) Batch 0.879 (0.857).
    [2022-11-08 18:13:25,601 INFO eval.py line 348 18926] Test: [390/500] Data 0.167 (0.170) Batch 0.869 (0.858).
    [2022-11-08 18:13:34,488 INFO eval.py line 348 18926] Test: [400/500] Data 0.171 (0.170) Batch 0.886 (0.859).
    [2022-11-08 18:13:43,271 INFO eval.py line 348 18926] Test: [410/500] Data 0.170 (0.170) Batch 0.851 (0.859).
    [2022-11-08 18:13:52,088 INFO eval.py line 348 18926] Test: [420/500] Data 0.165 (0.170) Batch 0.900 (0.860).
    [2022-11-08 18:14:00,866 INFO eval.py line 348 18926] Test: [430/500] Data 0.168 (0.170) Batch 0.879 (0.860).
    [2022-11-08 18:14:09,642 INFO eval.py line 348 18926] Test: [440/500] Data 0.180 (0.170) Batch 0.848 (0.860).
    [2022-11-08 18:14:18,372 INFO eval.py line 348 18926] Test: [450/500] Data 0.156 (0.170) Batch 0.883 (0.861).
    [2022-11-08 18:14:27,039 INFO eval.py line 348 18926] Test: [460/500] Data 0.166 (0.170) Batch 0.860 (0.861).
    [2022-11-08 18:14:35,745 INFO eval.py line 348 18926] Test: [470/500] Data 0.160 (0.170) Batch 0.854 (0.861).
    [2022-11-08 18:14:44,440 INFO eval.py line 348 18926] Test: [480/500] Data 0.158 (0.170) Batch 0.849 (0.861).
    [2022-11-08 18:14:53,127 INFO eval.py line 348 18926] Test: [490/500] Data 0.153 (0.170) Batch 0.857 (0.861).
    [2022-11-08 18:15:01,846 INFO eval.py line 348 18926] Test: [500/500] Data 0.169 (0.170) Batch 0.848 (0.862
    
  • 可视化结果如下:
    在这里插入图片描述

    原图查看【图片太大可能需要下载】: https://github.com/MRtianyanxiaobai/U2PL/blob/main/data/%E5%9B%BE%E7%89%871.png

这篇关于【语义分割研究】Semi-Supervised Semantic Segmentation Using Unreliable Pseudo-Labels 不可靠伪标签的半监督语义分割的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/234589

相关文章

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

EMLOG程序单页友链和标签增加美化

单页友联效果图: 标签页面效果图: 源码介绍 EMLOG单页友情链接和TAG标签,友链单页文件代码main{width: 58%;是设置宽度 自己把设置成与您的网站宽度一样,如果自适应就填写100%,TAG文件不用修改 安装方法:把Links.php和tag.php上传到网站根目录即可,访问 域名/Links.php、域名/tag.php 所有模板适用,代码就不粘贴出来,已经打

理解分类器(linear)为什么可以做语义方向的指导?(解纠缠)

Attribute Manipulation(属性编辑)、disentanglement(解纠缠)常用的两种做法:线性探针和PCA_disentanglement和alignment-CSDN博客 在解纠缠的过程中,有一种非常简单的方法来引导G向某个方向进行生成,然后我们通过向不同的方向进行行走,那么就会得到这个属性上的图像。那么你利用多个方向进行生成,便得到了各种方向的图像,每个方向对应了很多

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww

生信圆桌x生信分析平台:助力生物信息学研究的综合工具

介绍 少走弯路,高效分析;了解生信云,访问 【生信圆桌x生信专用云服务器】 : www.tebteb.cc 生物信息学的迅速发展催生了众多生信分析平台,这些平台通过集成各种生物信息学工具和算法,极大地简化了数据处理和分析流程,使研究人员能够更高效地从海量生物数据中提取有价值的信息。这些平台通常具备友好的用户界面和强大的计算能力,支持不同类型的生物数据分析,如基因组、转录组、蛋白质组等。

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT,这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频,并利用 SAM 2 进行 3D 空间分割,无需进一步训练或 2D-3D 投影。 我们的框架支持各种提示类型,包括 3D 点、框和掩模,并且可以泛化到不同的场景,例如 3D 对象、室

开题报告中的研究方法设计:AI能帮你做什么?

AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 大家都准备开题报告了吗?研究方法部分是不是已经让你头疼到抓狂? 别急,这可是大多数人都会遇到的难题!尤其是研究方法设计这一块,选定性还是定量,怎么搞才能符合老师的要求? 每次到这儿,头脑一片空白。 好消息是,现在AI工具火得一塌糊涂,比如ChatGPT,居然能帮你在研究方法这块儿上出点主意。是不

研究人员在RSA大会上演示利用恶意JPEG图片入侵企业内网

安全研究人员Marcus Murray在正在旧金山举行的RSA大会上公布了一种利用恶意JPEG图片入侵企业网络内部Windows服务器的新方法。  攻击流程及漏洞分析 最近,安全专家兼渗透测试员Marcus Murray发现了一种利用恶意JPEG图片来攻击Windows服务器的新方法,利用该方法还可以在目标网络中进行特权提升。几天前,在旧金山举行的RSA大会上,该Marcus现场展示了攻击流程,

机器学习之监督学习(三)神经网络

机器学习之监督学习(三)神经网络基础 0. 文章传送1. 深度学习 Deep Learning深度学习的关键特点深度学习VS传统机器学习 2. 生物神经网络 Biological Neural Network3. 神经网络模型基本结构模块一:TensorFlow搭建神经网络 4. 反向传播梯度下降 Back Propagation Gradient Descent模块二:激活函数 activ

Science Robotics 首尔国立大学研究团队推出BBEX外骨骼,实现多维力量支持!

重复性举起物体可能会对脊柱和背部肌肉造成损伤,由此引发的腰椎损伤是工业环境等工作场所中一个普遍且令人关注的问题。为了减轻这类伤害,有研究人员已经研发出在举起任务中为工人提供辅助的背部支撑装置。然而,现有的这类装置通常无法在非对称性的举重过程中提供多维度的力量支持。此外,针对整个人体脊柱的设备安全性验证也一直是一个缺失的环节。 据探索前沿科技边界,传递前沿科技成果的X-robot投稿,来自首尔国立