📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在👉强化学习专栏:
【强化学习】(52)---《语义分割中的强化学习方法》
最近和朋友交流,发现强化学习也可用于语义分割,然后进行了一些调研,在这里记录一下
语义分割中的强化学习方法
目录
语义分割中的强化学习方法
1.语义分割技术介绍
2.基于强化学习的语义分割马尔科夫决策过程
2.1.流程框架
2.2.马尔可夫决策过程(MDP)
3.状态表示和动作表示
4. 一般的建模过程
4.1. 任务建模
4.2. 公式推导
4.2.1. 状态空间
4.2.2. 动作空间
4.2.3. 奖励函数
4.3. 策略优化与算法实现
[Python] 伪代码实现
[Notice] 关键部分说明
5.总结
1.语义分割技术介绍
语义分割旨在对图像中的每个像素进行类别划分并对其分配标签。传统图像语义分割技术有基于阈值、基于边缘、基于区域和基于直方图等。尽管这些方法已在图像处理领域得到了广泛应用,但在实际应用中,由于分割精度和效率的局限,往往难以满足更高的需求。此外,仅依赖单一的传统分割算法难以获得预期的分割效果,限制了其在复杂场景中的应用潜力。
随着深度学习技术,尤其是卷积神经网络(CNN)在语义分割领域的广泛应用,极大推动了语义分割技术的发展。深度图像语义分割模型的出现显著提高了语义分割的性能和准确度,使得这些技术在自动驾驶、医学影像、虚拟现实、增强现实等多个领域发挥重要作用,并展示了广阔的市场应用潜力。代表性的深度图像语义分割模型包括 FCN、U-Net、FPN、SegNet、DeepLab 系列等。
2.基于强化学习的语义分割马尔科夫决策过程
2.1.流程框架
在构建语义分割任务的流程框架:
1.首先需要将一批未经标注的样本构建成未标注样本池。
2.接着,通过一系列查询策略,从这个未标注样本池中选取特定的图像区域进行标注。这一过程中涉及到查询网络的学习,网络负责评估哪些样本区域最需要标注。
3.标注后的样本将被加入已标注样本池,用于迭代训练语义分割模型,直至达到规定的样本预算。在此过程中,为了有效控制标注成本并解决数据集内潜在的类别不平衡问题,采用合适的样本查询策略变得尤为重要。主动学习在选择语义分割任务的查询策略时,不仅需要评估样本的信息量和代表性,还需考虑其对提升模型性能的潜在贡献,以确保在有限的标注预算内最大化语义分割模型的训练效率和准确度通过采用先进的查询网络,可以进一步增强样本选择的智能化和自动化,确保模型在面对复杂多变的视觉场景时,能够更精确地识别并标注关键的语义信息,从而提高语义分割的整体表现。
2.2.马尔可夫决策过程(MDP)
语义分割问题框架转化为一个马尔可夫决策过程(MDP),由五元组<S,A,R,T,Y>构成:
(1)状态空间S:代表了一系列可能的状态值,每个状态ses表示在特定时刻1时智能体的决策环境。这包括当前的语义分割网络状态、已标注样本池和未标注样本池的情况,基于这些信息来决定哪些样本区域需要进行标注。
(2)行动空间A:代表所有可执行的动作集合a=a",由n个子动作构成。每个子动作代表在图像样本上选择一个特定区域进行标注。
(3)奖励集R:表示在每次主动学习迭代之后获得的奖励值,该奖励是根据基于分割网络在数据样本子集D上的性能改进来计算的,用于评估分割网络的性能表现。
(4)状态转移函数T:表示下一时间步的状态集合S,这个函数映射了从当前状态通过执行某个动作转移到下一个状态的过程。
(5)折扣因子y:用于在计算总奖励时平衡即时奖励与未来奖励的重要性,决定了智能体对未来奖励的重视程度。
通过把语义分割任务转化为马尔可夫决策过程,模型能够学习如何优化样本选择策略,进而在有限的标注资源条件下实现模型性能的最大化提升。这种方法不仅提升了标注的效率,而且还增强了模型的适用性和鲁棒性。
整体流程框架
在语义分割框架中,查询网络被建模为强化学习框架中的智能体,而其余部分则构成了强化学习的环境。此外,本研究还构建了状态子集S和奖励集R。
奖励集R是一个用来评估分割网络的性能的独立数据样本子集。
状态子集S是一个包含数据集中各类别代表性样本的数据样本子集,旨在帮助构建和细化状态空间,确保强化学习智能体在学习过程中能够接触到全面且平衡的数据信息。
通过引入状态子集,模型可以更有效地识别不同类别之间的差异,从而在主动学习过程中培养出更高效的查询策略。在训练过程中,智能体通过与环境的互动获得状态表示和动作表示,并利用经验缓冲区中的数据对查询网络进行训练,从而挑选出需要标注的样本区域,并将加入已标注样本池。然后,语义分割网络FPN根据新更新的已标注数据池来优化模型,并利用D,奖励集来计算奖励值。该训练过程会持续迭代,直到达到预定的标注预算为止。
3.状态表示和动作表示
在语义分割任务中,由于需要对样本图像的每个像素进行标签分类,容易造成大量内存资源的占用。采用了一种基于状态子集的方法来构建强化学习的状态表示。该方法通过将状态子集S、中的样本分解为多个区块(patch),并计算每个patch的特征向量,有效减少了内存的使用。在构建状态表示的过程中,首先计算状态子集S、内图像样本的每个像素点的信息熵,然后执行三种池化操作:最大池化、最小池化和平均池化,完成对信息熵的下采样,得到初步的特征向量集合。接下来,通过分割网络预测每个类别的像素数量占比,并将这些预测结果标准化,从而获得第二组特征向量。最后,将这两组特征向量合并,为每一个样本区域生成一个编码,作为该状态的表示。
为了应对主动学习语义分割任务中因逐像素标注导致的大量资源消耗问题,在动作表示的构建过程中采取了有效的策略。首先,在每个时间步中,从未标注样本池中均匀采样一批未标注区域池p",以此来近似代表整体的未标注样本空间。然后,从这些数据池中筛选出候选区域,并对每个类别的预测像素进行归一化处理。接下来,通过计算已标注区域与未标注区域在分割网络中预测的类别分布之间的KI散度,得到两组特征向量。最后,将这些特征向量与状态表示结合,构成了动作表示a"。状态表示和动作表示的构建过程如图 3.2所示。
4. 一般的建模过程
强化学习(Reinforcement Learning, RL)在语义分割中的实现可以通过以下几种方式展开:将分割任务建模为一个强化学习问题,其中 环境 是图像,动作 是分割操作,奖励 则衡量分割的质量。以下是详细的实现步骤以及公式推导。
4.1. 任务建模
在语义分割中,将问题转化为强化学习需要以下几个步骤:
- 状态:输入图像的当前分割结果或分割的中间状态,通常由一个二维矩阵表示,其中每个像素标记属于某个类别。
- 动作:可能的操作,比如对某个区域重新分类或调整分割边界。
- 奖励:根据分割结果的准确性计算,例如采用交并比(Intersection over Union, IoU)作为奖励函数。
- 策略 :在当前状态 下选择动作的概率分布。
- 策略:在当前状态 下选择动作 的概率分布。
4.2. 公式推导
4.2.1. 状态空间
假设输入图像为 ,其分割状态为(时间步 的像素分类矩阵)。每个状态 包括所有像素的分类信息:
其中 和 分别是图像的高度和宽度。
4.2.2. 动作空间
动作 定义为对图像某一区域的操作,可以是:
- 对某像素或像素组重新分类;
- 调整边界位置;
- 扩展或收缩某区域。
对于每个像素 ,动作可以建模为一个离散的类别标签更新。
4.2.3. 奖励函数
奖励函数 衡量动作 对分割结果的影响,通常定义为:
-
基于交并比 (IoU):,其中 是真实分割的 Ground Truth。
-
基于分类准确率: , 是指示函数,表示分类正确性。
4.3. 策略优化与算法实现
强化学习模型通常采用深度强化学习 (Deep RL) 的方法,如 DQN 或 A3C。
[Python] 伪代码实现
"""《强化学习用于语义分割伪代码》时间:2024.12作者:不去幼儿园
"""
# 初始化
Initialize environment `SegmentationEnv` with input image and ground truth mask
Initialize policy network `PolicyNet` with random weights
Initialize optimizer for policy network
Define maximum episodes and steps per episode# 定义语义分割环境
class SegmentationEnv:def __init__(self, image, mask):self.image = image # 输入图像self.mask = mask # 真实分割标签self.segmented_mask = zeros_like(mask) # 初始分割结果self.current_position = (0, 0) # 当前处理的像素位置def reset():Reset `segmented_mask` to zerosReset `current_position` to the top-left cornerreturn current image as the initial statedef step(action):Apply action (e.g., classify pixel as background or foreground) at `current_position`Update `segmented_mask` with the actionMove to the next pixel (row-wise)Compute reward based on similarity between `segmented_mask` and `mask`If all pixels processed:done = Trueelse:done = Falsereturn updated image, reward, done# 强化学习训练循环
for episode in range(max_episodes):# 重置环境state = SegmentationEnv.reset()total_reward = 0for step in range(max_steps):# 使用策略网络预测动作action = PolicyNet.predict(state)# 执行动作并获取新状态和奖励next_state, reward, done = SegmentationEnv.step(action)# 计算损失(基于强化学习算法,如Policy Gradient或Actor-Critic)Compute loss based on action, reward, and policy network predictions# 反向传播更新策略网络Perform backpropagation to update `PolicyNet` weights# 累加奖励total_reward += reward# 检查是否完成if done:break# 更新状态state = next_state# 打印每回合的总奖励Print "Episode:", episode, "Total Reward:", total_reward# 测试模型
Load a test image
Use trained `PolicyNet` to predict the segmentation mask
Evaluate the segmentation result using metrics such as IoU or Dice coefficient
[Notice] 关键部分说明
环境定义:
环境的作用是将语义分割建模为逐像素决策问题。
每个像素的位置对应一个状态,动作则是对该像素的分类(背景或前景,多分类场景则扩展为所有类别)。
奖励设计:
奖励可以基于 IoU(交并比)或 Dice 系数,逐步评估 segmented_mask
与 mask
的相似性。
稀疏奖励可通过增强机制(如每个步骤的微小奖励或累计奖励)改进。
策略网络:
策略网络负责预测每个像素的分类。
常见的策略网络架构是卷积神经网络(CNN),输出对应动作空间的概率分布。
强化学习算法:
可以使用经典的策略梯度方法(如REINFORCE)或更高级的算法(如PPO、A3C)。
如果动作空间较大(如多类别分割),可以通过离散化或连续动作策略优化。
评估与测试:
在测试阶段,使用训练好的 PolicyNet
对新图像逐像素预测分割结果。
使用标准语义分割评价指标(IoU、Dice、Pixel Accuracy)评估模型性能。
由于博文主要为了介绍相关算法的原理和应用的方法,缺乏对于实际效果的关注,算法可能在上述环境中的效果不佳或者无法运行,一是算法不适配上述环境,二是算法未调参和优化,三是没有呈现完整的代码,四是等等。上述代码用于了解和学习算法足够了,但若是想直接将上面代码应用于实际项目中,还需要进行修改。
5.总结
强化学习方法能够优化分割网络性能,显著提升了语义分割的效率和精度性,有效缓解了分割数据集的类别不平衡问题,并证明了该方法在不同语义分割网络上的适用性和有效性。
参考文献:基于强化学习的主动学习语义分割算法研究
博客都是给自己看的笔记,如有误导深表抱歉。文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者,或者添加VX:Rainbook_2,联系作者。✨
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=15nkuo1sqcus