【传知代码】主动学习实现领域自适应语义分割(论文复现)

news2024/9/20 1:07:40

在当今计算机视觉和人工智能领域,语义分割技术的发展正日益成为实现智能系统感知和理解复杂场景的关键。然而,传统的语义分割模型往往面临着在新领域或不同环境下适应性不足的挑战。为了解决这一问题,主动学习作为一种强大的技术手段,正在引起越来越多研究者的关注和探索。

本文所涉及所有资源均在传知代码平台可获取

目录

概述

核心代码

复现过程

写在最后


概述

        本文讲解并复现一篇CVPR论文 “Towards Fewer Annotations: Active Learning via Region Impurity and Prediction Uncertainty for Domain Adaptive Semantic Segmentation”,该论文基于主动学习实现像素级分割–语义分割,并实现迁移学习–将两个虚拟生成的数据集进行训练,并迁移到真实世界数据集,论文地址为:地址。自训练极大地促进了领域自适应语义分割,在无标签目标数据上迭代生成伪标签并重新训练网络。到目前为止,由于数据集移位,考虑将注释从在给定域(合成数据集)上训练的模型迁移到不同域(真实世界数据集)的工作很少。然而,它在实践中经常发生,但并没有得到完美解决。一般来说,伪标签是有噪声的,而自我训练会着重于高频率的类,而牺牲了在罕见类或小物体上的性能,从而导致不期望的偏差。

在此,让我们简要介绍一下主动学习的目标。主动学习(Active learning)旨在在尽可能减少标记工作量的同时,最大化模型性能。常见的策略包括不确定性抽样和代表性抽样。然而,迄今为止,由于数据集的偏移,训练于特定领域(如合成数据集)的模型在迁移到不同领域(如真实世界数据集)时,面临的挑战很少被解决,但这种情况在实际应用中经常发生,但却尚未得到充分的解决。

对之前关于语义分割的主动域适应方法的性能进行了基准测试,发现使用基于图像或基于点的选择策略的方法是无效的;提出了一种基于区域的自适应语义分割策略,称为RIPU。它利用了区域杂质和预测不确定性识别空间邻接性不同、预测输出不确定的图像区域;实验表明,使用标准的分割模型,即DeepLab-v2和DeepLab-v3+,该方法在两个代表性的域适应基准上带来了显著的性能提升,即 GTAV → Cityscapes, SYNTHIA → Cityscapes

核心代码

下图为模型整体结构图;我们将整个模型运行分为3部分讲解:图像区域生成,主动学习过程,损失函数计算;接下来我们将分别进行详细介绍:

传统的基于区域的主动学习语义分割方法只是将图像分割成互不重叠的矩形或采用超像素算法。作者认为这些固定的区域不灵活或不适合基于区域的选择策略。主要原因是相邻区域的模型预测也需要考虑,本文将像素的k平方邻域视为一个区域,具体来说,将大小为(2k + 1, 2k + 1)的规则形状的正方形视为以每个像素为中心的区域。下图是对传统和本文提出的区域生成方法的对比:

以下是区域选取算法的核心代码,计算当前样本中需要选择的活跃区域数量:

active_regions = math.ceil(num_pixel_cur * active_ratio / per_region_pixels)
            # 选择指定数量的活跃区域
            for pixel in range(active_regions):
                values, indices_h = torch.max(score, dim=0)
                _, indices_w = torch.max(values, dim=0)
                w = indices_w.item()
                h = indices_h[w].item()

                active_start_w = w - active_radius if w - active_radius >= 0 else 0
                active_start_h = h - active_radius if h - active_radius >= 0 else 0
                active_end_w = w + active_radius + 1
                active_end_h = h + active_radius + 1

                mask_start_w = w - mask_radius if w - mask_radius >= 0 else 0
                mask_start_h = h - mask_radius if h - mask_radius >= 0 else 0
                mask_end_w = w + mask_radius + 1
                mask_end_h = h + mask_radius + 1

在实际应用中,语义分割常常面临类别不平衡问题,因为某些类别的出现频率较低。这导致少数类别的性能在训练过程中可能显著下降,因为训练样本不足。为了解决这个问题,可以在训练过程中采用类重新平衡或增强的方法。

主动学习通过在数据收集阶段迭代地选择一批样本进行标注,可以隐式地帮助解决这种类别不平衡的问题。给定预定义的图像区域,本文描述了采集策略,并实现了两种不同的标注机制,即基于区域的标注 Region-based (RA)和基于像素的标注 Pixel-based (PA)。下图是两种传统策略和Region-based策略的对比:

以下我们将以Region-based策略为例,讲解部分核心代码,计算当前样本中需要选择的活跃区域数量,选择指定数量的活跃区域:

for pixel in range(active_regions):
     values, indices_h = torch.max(score, dim=0)
     _, indices_w = torch.max(values, dim=0)
     w = indices_w.item()
     h = indices_h[w].item()

active_start_w = w - active_radius if w - active_radius >= 0 else 0
active_start_h = h - active_radius if h - active_radius >= 0 else 0
active_end_w = w + active_radius + 1
active_end_h = h + active_radius + 1

mask_start_w = w - mask_radius if w - mask_radius >= 0 else 0
mask_start_h = h - mask_radius if h - mask_radius >= 0 else 0
mask_end_w = w + mask_radius + 1
mask_end_h = h + mask_radius + 1

在接下来的文章中,我们介绍一种有效的获取函数,联合捕获区域不纯度(Region Impurity)和预测不确定性(Prediction Uncertainty),提取空间邻接多样性和预测输出不确定性的区域。Region Impurity:给定一个目标图像,我们首先将其传递给网络,然后得到softmax输出。通过最大概率输出可以直接推导出目标伪标签。我们将一个区域划分为C个子集。目前,我们可以收集一个区域的类别统计信息。如果一个区域中有很多类别,我们认为它在标记后有助于训练网络。也就是选择区域内类别最多的区域进行再训练;Prediction Uncertainty:由于预测结果携带语义关系信息,为了衡量不确定性,我们使用每个像素的预测熵作为预测的不确定性;在基于像素的标注(PA)中,每个像素的不确定性就是熵的值;在基于区域的标注(RA)中,用区域内所有像素熵的平均值来评估其预测不确定性。总而言之,也就是选取预测不确定性最大的数据进行再训练:

# 将区域不纯度和预测不确定性相乘获得得分
score = region_impurity * prediction_uncertainty
return score.squeeze(dim=0).squeeze(dim=0), region_impurity.squeeze(dim=0).squeeze(
            dim=0), prediction_uncertainty.squeeze(dim=0).squeeze(dim=0)

Loss函数计算:来自源域和目标域的所有标记数据都用于通过优化标准监督损失来微调网络:使用分类交叉熵损失;同时,加强源图像中某个像素与其邻近像素之间的预测一致性,从而使模型的预测更加平滑,避免对源数据的过拟合:使用区域内所有像素的均值预测;此外,在训练的早期阶段,目标图像的较低输出概率实际上显示了特定的缺席类,称为负伪标签。例如,我们很难判断一个预测值为 [0.49,0.50,0.01] 的像素属于哪个类别,但我们可以清楚地知道它不属于得分为0.01的类别。因此,我们赋予负伪标签,因为τ是负阈值,在这项工作中使τ = 0.05,称为负学习损失:

# 源域监督损失
loss = torch.Tensor([0]).cuda()
loss_sup = sup_criterion(src_out, src_label)
meters.update(loss_sup=loss_sup.item())
loss += loss_sup

# 目标域活动监督损失
if torch.sum((tgt_mask != 255)) != 0:  # 目标域有标记像素
    loss_sup_tgt = sup_criterion(tgt_out, tgt_mask)
    meters.update(loss_sup_tgt=loss_sup_tgt.item())
    loss += loss_sup_tgt

# 源一致性正则化损失
if cfg.SOLVER.CONSISTENT_LOSS > 0:
    consistent_loss = local_consistent_loss(src_out, src_label) * cfg.SOLVER.CONSISTENT_LOSS
    meters.update(cr_loss=consistent_loss.item())
    loss += consistent_loss

# 目标负伪损失
if cfg.SOLVER.NEGATIVE_LOSS > 0:
    negative_learning_loss = negative_criterion(predict) * cfg.SOLVER.NEGATIVE_LOSS
    meters.update(nl_loss=negative_learning_loss.item())
    loss += negative_learning_loss

复现过程

我们可以看到,在GTAV数据迁移到Cityscapes任务中,该模型展示了优越的性能:

同样的,在SYNTHIA数据迁移到Cityscapes任务中,该模型也展现了出色的效果:

对于结果可视化的展示,证明了该模型在语义分割任务中确实可以出色地对照片中所有类别精确地进行分割:

下载所需的库之后开始对数据集进行测试,开始训练如下:

训练固定轮数后继续提取数据:

语义分割结果如下所示:

写在最后

本文深入探讨了主动学习在实现领域自适应语义分割中的关键作用和应用前景。通过分析其在提升模型泛化能力和适应不同数据分布方面的优势,我们理解了这一技术如何有效地解决传统语义分割模型在新领域或不同场景中面临的挑战。

首先,我们探讨了主动学习如何通过有效的样本选择和标签反馈机制,优化模型训练过程,提升语义分割模型的性能和效率。其次,本文详细讨论了领域自适应的重要性,如何通过迁移学习和领域对抗训练等技术,使模型在多样化数据上表现稳健和准确。

在实际应用方面,我们分析了主动学习在医学图像分割、自动驾驶和环境监测等领域的成功案例,展示了其在提升模型鲁棒性和推广能力方面的显著优势。此外,本文还探讨了未来发展的潜力,包括结合深度增强学习和多模态数据融合进一步拓展应用场景,推动智能系统在复杂环境下的应用和进步。

综上所述,主动学习实现领域自适应语义分割不仅是计算机视觉领域的重要创新,更是推动智能算法与实际需求结合的关键技术之一。随着技术的不断演进和应用的拓展,相信这一方法将为解决现实世界中复杂问题提供更为有效和可靠的解决方案。

详细复现过程的项目源码、数据和预训练好的模型可从该文章下方附件获取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1973147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日学术速递8.2

1.A Scalable Quantum Non-local Neural Network for Image Classification 标题: 用于图像分类的可扩展量子非局部神经网络 作者: Sparsh Gupta, Debanjan Konar, Vaneet Aggarwal 文章链接:https://arxiv.org/abs/2407.18906 摘要&#x…

echarts图表--雷达图(参数详解)

这是官网给出的几种雷达图: Examples - Apache ECharts 雷达图(Radar Chart)是一种用于展示多维数据的图表,尤其适合于比较不同样本或观测在多个相同变量上的表现。在使用ECharts或PyEcharts等可视化库绘制雷达图时,…

Prometheus 监控 Nginx

作者:琉璃 一、Nginx_exporter安装 下载链接: https://github.com/discordianfish/nginx_exporter 下载nginx_exporter的docker镜像。 ocker pull fish/nginx-exporter先run一下,执行之后,会hold住,先不要关闭窗口…

IP 地址处理模块IPy

IP 地址处理模块IPy 介绍安装基本操作多网络计算方法 介绍 IP 地址规划是网络设计中非常重要的一个环节,规划的好坏会直接影响路由协议算法的效率,包括网络性能、可扩展性等方面,在这个过程当中,免不了要计算大量的 IP 地址&…

【python】Linux升级版本

目的 迁移项目包路径到服务器上 查看服务器包是否和本地已有项目python版本相同然后发现~嗯不一样 项目上包时用的3.8~ 服务器用的2.7 查看方法: python -version解决方案 一:项目所有包重新下载 二:升级服务器python版本 第二种步骤&…

【虚拟仿真】Unity3D中实现2DUI显示在3D物体旁边

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群:398291828大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 这篇文章来实现2DUI显示在3D物体旁边,当我们需要在3D模型旁边显示2DUI的时候,比如人物的对…

医疗AI新突破!多模态对齐网络精准预测X光生存,自动生成医疗报告!

PS:写在前面,近期感谢很多小伙伴关注到我写的论文解读,我也会持续更新吖~同时希望大家多多支持本人的公主号~ 想了解更多医学图像论文资料请移步公主👸号哦~~~后期将持续更新!! 关注我,让我们一…

智能驾驶学习笔记,第一天

智能驾驶是智能汽车的核心,指基于先进的传感器和计算平台,通过人工智能技术,让汽车具备自主行驶的能力,旨在辅助驾驶员安全、便捷、高效地完成驾驶任务。智能驾驶有助于减少交通事故、改善交通拥堵,并提高行驶安全性和驾乘舒适性。…

LaTeX行间公式内部公式居中,以及行间公式整体居左

文章目录 多行公式居中行间公式整体居左(不靠谱版) 多行公式居中 行间公式默认整体居中,此处多行公式居中指使用$$ $$时内部公式对齐方式. 普通对齐: \begin{aligned}公式 \end{aligned}上述环境只能用&左对齐或右对齐(默认右&#xff0…

【数据结构】排序算法(快速排序、归并排序、排序算法总结)

当你清楚的知道自己想要什么,并且意愿非常强烈的时候,你总会有办法得到的。💓💓💓 目录 ✨说在前面 🍋知识点一:快速排序 • 🌰1.快速排序介绍 • 🌰2.霍尔排序 •🔥三数取中优化 •🔥小区间优化 • 🌰3.前后指针法 • 🌰4.快排非递归方法 🍋…

jvm调优参数

JVM调优是指调整JVM的参数,以优化Java程序的性能。以下是一些常用的JVM调优方法: 1.堆内存大小:通过-Xms和-Xmx参数设置JVM的初始堆内存和最大堆内存。堆内存太小会导致频繁GC,太大则可能导致内存利用率不高。 2.新生代与老年…

Java 设计模式之策略模式 (Strategy Pattern) 详解

Java 设计模式之策略模式 (Strategy Pattern) 详解 策略模式(Strategy Pattern)是一种行为型设计模式,旨在定义一系列算法,将每个算法封装起来,并使它们可以互相替换,从而使得算法的变化不会影响使用算法的…

掩码、反掩码、通配符的区别和计算方式

注:几篇文章合集捋清掩码、反掩码、通配符的区别。 ACL 通配符,子网掩码,反掩码区别和计算方式 192.168.1.1 255.255.255.0 掩码: 1111111111111111000000000 左边永远是 1,右边永远是 0 1 和 0 ,永远不…

UE Spinbox 控件支持Double类型及Float精度问题

UE Spinbox 控件支持Double类型及Float精度问题 问题 众所周知,使用float来表示GIS坐标时,往往由于坐标的有效数字超过7位时,无法表达坐标的小数部分,即精度不够。 方案 1、取区域中心点的局部坐标的形式,使得坐标…

C#列表按照日期进行从大到小排序

C#列表按照日期进行从大到小排序

多路径 bbr mpbbr 公平性推演

mptcp 推出很久了,先看 rfc6356 三原则: 对自己,mptcp 的吞吐不能比用 sp(single path)tcp 时更差;对它者,mptcp 子流对资源的占用不能侵害其它 sptcp 流量;负载分担,要将孬 subflow 流量分担到…

Unity Rigidbody 踩坑记录

1:两个带有刚体的物体碰撞会一直不停的弹 把被动受力的刚提的 Freeze Position 的勾选 去掉(碰到过一次,有一种受力无法释放又返回给目标的 所以一直弹跳的感觉) 2:子物体 和父物体 都有刚体的情况下 子物体 Freeze R…

WEB渗透Web突破篇-PHP文件包含下载读取

php任意文件读取/下载 readfile()、file_get_contents()、fopen()等读文件的函数不严谨,读取文件路径可控,输出内容。 下载配置文件 Redis、Weblogic、ftp、mysql、web配置文件、history文件、数据库配置文件 下载log文件 下载web文件 /1.php?f../../e…

C#实现数据采集系统-配置文件化

系统优化-配置 配置信息ip端口,还有点位信息,什么的都是直接在代码里直接写死,添加点位,修改配置,比较麻烦,每次修改都需要重新生成打包。 所以将这些配置都改成配置文件,这样只需要修改配置文件,程序无须修改,即可更新。 配置代码: 如果我们有100个采集,一个个去…

ReactiveStream

消息传递是响应式核心 ReactiveStream规范核心接口 ReactiveStream发布数据 发布者要保存订阅者 发布者要知道谁要拿他的数据,发布者要知道他把数据要给谁 reactive stream发布订阅的写法 subscribe订阅者 publish发布者 subscription 绑定关系 onXXX事件…