论文阅读:Guided Linear Upsampling

今天介绍一篇有趣的文章,Guided Linear Upsampling,基于引导的线性上采样,这是发表在 ACM transaction on Graphic 的一篇工作。

Abstract

引导上采样是加速高分辨率图像处理的一种有效方法。在本文中,文章作者提出了一种简单而有效的引导上采样方法。高分辨率图像中的每个像素表示为两个低分辨率像素的线性插值,其索引和权重经过优化以最小化上采样误差。下采样可以联合优化,以防止遗漏小的孤立区域。该方法可以从颜色线模型和局部颜色变换推导得出。与以前的方法相比,该方法可以更好地保留细节效果,同时抑制诸如渗色和模糊等伪影。它高效、易于实现且没有需要仔细微调的参数。我们使用广泛的图像运算符评估所提出的方法,并通过定量和定性分析展示其优势。我们展示了我们的方法在交互式图像编辑和实时高分辨率视频处理方面的优势。特别是对于交互式编辑,联合优化可以预先计算,因此无需硬件加速即可实现即时反馈。
在这里插入图片描述

Method

给定一个图像运算符 f f f 和具有 RGB 颜色的高分辨率输入图像 I I I,我们的目标是获得原始输出 𝑇 = 𝑓 ( 𝐼 ) 𝑇 = 𝑓(𝐼) T=f(I) 的近似值 T ^ \hat{T} T^。使用引导上采样方法,我们首先将 f f f 应用于下采样图像 𝐼↓,然后在 I I I 的引导下将结果 𝑇↓上采样到高分辨率输出 T ^ \hat{T} T^。我们需要优化下采样和上采样过程,以最小化 T ^ \hat{T} T^ T T T 之间的差异。

Guided Linear Upsampling


我们首先假设下采样后的输入图像 𝐼↓ 是给定的,或者默认情况下使用规则网格下采样生成。如图 2 所示,为了优化上采样,我们的基本假设是高分辨率目标图像 T T T 的每个像素 p p p 可以通过一对低分辨率像素 ( a , b ) (a,b) (a,b) 的线性插值很好地近似,如下所示:

T ^ p = w a b T a ↓ + ( 1 − w a b ) T b ↓ s . t . a , b ∈ Ω p ↓ (1) \hat{T}_p = w_{ab} T_{a}^{↓} + (1 - w_{ab}) T_{b}^{↓} \quad s.t. \quad a,b \in \Omega_{p↓} \tag{1} T^p=wabTa+(1wab)Tbs.t.a,bΩp(1)

其中, w a b w_{ab} wab 是加权函数,p↓ 是 p p p 的下采样坐标, Ω p \Omega_{p} Ωp 是 p↓ 的一个小邻域。 T ^ p \hat{T}_p T^p 是原始输出 T p T_p Tp 的估计值。公式(1)包含三个参数 w a b , a , b w_{ab}, a, b wab,a,b,为了最小化上采样误差,需要对这些参数进行优化。用 Θ p = { a , b , w a b } \Theta_{p} = \{a, b, w_{ab} \} Θp={a,b,wab} 表示像素 p p p 的参数,那么 Θ \Theta Θ 是一个 3 × H × W 3 \times H \times W 3×H×W 的张量,包含 T T T 的所有像素的参数。给定 Θ \Theta Θ ,相应的高分辨率输出 T ^ ( Θ ) \hat{T}(\Theta) T^(Θ) 可以很容易地用公式(1)计算出来。

与之前的局部颜色变换方法 [Chen et al. 2016; He et al. 2012; Levin et al. 2007] 一样,文章也假设目标图像可以局部表示为源图像的仿射变换。正如在后面将要解释的那样,在这种情况下,源图像和目标图像可以用同一组参数进行最佳上采样。换句话说,如果对于源图像是最优的,那么它对于目标图像也应该是最优的。因此,为了最小化其上采样误差,可以仅针对源图像求解最优参数。

Θ = arg min ⁡ Θ ∥ I ^ ( Θ ) − I ∥ (2) \Theta = \argmin_{\Theta} \left \| \hat{I}(\Theta) - I \right \| \tag{2} Θ=Θargmin I^(Θ)I (2)

其中, I ^ ( Θ ) \hat{I}(\Theta) I^(Θ) 表示源图的上采样结果,假设 Θ p \Theta_{p} Θp 是相互独立的,那么每个像素的参数可以独立优化:

Θ p = arg min ⁡ Θ p ∥ w a b I a ↓ + ( 1 − w a b ) I b ↓ − I p ∥ (3) \Theta_{p} = \argmin_{\Theta_p} \left \| w_{ab} I_{a}^{↓} + (1 - w_{ab}) I_{b}^{↓} - I_{p} \right \| \tag{3} Θp=Θpargmin wabIa+(1wab)IbIp (3)

这是一个组合优化问题,通常很难解决。幸运的是,在文章中, Ω p ↓ \Omega_{p↓} Ωp 是一个小邻域(在我们的实验中是一个 3×3 的窗口),所以很容易枚举所有可能的像素对。对于每个选定的像素对 ( a , b ) (a,b) (a,b),权重参数可以表示为:

w a b = ( I p − I b ↓ ) ( I a ↓ − I b ↓ ) ∥ I a ↓ − I b ↓ ∥ 2 + ϵ (4) w_{ab} = \frac{(I_{p} - I_{b}^{↓})(I_{a}^{↓} - I_{b}^{↓})}{\left\| I_{a}^{↓} - I_{b}^{↓} \right\|^{2} + \epsilon} \tag{4} wab= IaIb 2+ϵ(IpIb)(IaIb)(4)

  • 图 3
    在这里插入图片描述
    图 3 展示了一个从下采样图像上采样回原图像的示例。上述简单方法取得了惊人的好结果。即使对于像 32 倍这样的大比例,原始图像的细节也几乎可以完美地重建。相比之下,即使对于较小的比例,JBU(联合双边上采样)的结果也明显模糊。
Efficient Computation

上述优化算法的复杂度和局部邻域的像素数量成平方关系,对于一个 3 × 3 3 \times 3 3×3 的局部邻域,需要检查的像素对有 36 对,对于一个高分辨率的图像来说,这个算法的复杂度依然很高,为了进一步提升运算效率,文章发现没有必要枚举所有的像素对 ( a , b ) (a, b) (a,b)。相反,我们可以首先将 a a a 固定为与 I p I_p Ip 颜色最相似的像素,然后仅针对公式(3)优化 b , w a b b, w_{ab} b,wab。这样,复杂度可以降低到与 ∣ Ω p ↓ ∣ |\Omega_{p↓}| Ωp 成线性关系。由于 a a a 在颜色空间中与 I p I_{p} Ip 接近,所以对于在颜色线上的投影,近似误差应该很小。很容易看出,如果 I p I_p Ip 在由 I a ↓ I_{a↓} Ia I b ↓ I_{b↓} Ib 确定的颜色线上,那么公式(4)中的插值权重就简化为:

w a b = ∥ I p − I b ↓ ∥ ∥ I p − I a ↓ ∥ + ∥ I p − I b ↓ ∥ + ϵ (5) w_{ab} = \frac{ \left \| I_{p} - I_{b}^{↓} \right \|} { \left \| I_{p} - I_{a}^{↓} \right \| + \left \| I_{p} - I_{b}^{↓} \right \| + \epsilon} \tag{5} wab= IpIa + IpIb +ϵ IpIb (5)

这可以更有效地计算,并且结果保证在 [0,1] 范围内。由于不经过的颜色线被选中的可能性较小,所以上述近似对我们方法的质量影响很小。如图 3 所示,与我们的原始方法相比,上述加速方法不会引入明显的差异,但复杂度要低得多。因此,在下面的内容中,我们将默认使用加速后的方法。

最终的上采样方法如算法 1 所述。它非常简单且高效。 Ω p ↓ \Omega_{p↓} Ωp 通常选择为一个 3×3 的窗口,所以对于每个像素,只需要检查 9 个像素对。如果我们固定 w a b w_{ab} wab 为 1,那么第 3 行的优化就不必要了,并且 T ^ p \hat{T}_p T^p 将等于 T a ↓ T_{a}^{↓} Ta 。我们将这种特殊情况的方法称为引导最近邻上采样(Guided Nearest Upsampling,GNU)。如图 4 所示,GNU 缺乏恢复自然图像的斜坡边缘和平滑变化的能力,从而产生块状效果和错误轮廓,而使用 GLU(我们的方法)可以有效地消除这些问题。

  • 算法 1
    在这里插入图片描述
  • 图 4
    在这里插入图片描述
Downsample Optimization
  • 图 5
    在这里插入图片描述

对于大的下采样比例,由于规则网格下采样,孤立的细结构和小区域可能会完全丢失。在这种情况下,上采样过程将不可能恢复原始内容。图 5 展示了这样一种情况。给定 GLU 上采样器 Ψ ( I ↓ , Θ ) \Psi(I^{↓},\Theta) Ψ(I,Θ),我们可以将下采样过程表述为一个优化问题,旨在最小化源图像的自上采样误差。实际上,由于是未知的,下采样和上采样需要联合优化。

I ↓ , Θ = arg min ⁡ I ↓ , Θ ∥ I − Ψ ( I ↓ , Θ ) ∥ (6) I^{↓},\Theta = \argmin_{I^{↓},\Theta} \left \| I - \Psi( I^{↓},\Theta ) \right \| \tag{6} I,Θ=I,Θargmin IΨ(I,Θ) (6)

公式 (6) 使得下采样图像 I ↓ I^{↓} I 的每一个像素,都来自原始图像 I I I,在以前的方法中, I ↓ I^{↓} I 的每个像素通常是从 I I I 的多个像素中滤波得到的,以减少混叠伪影。对于我们的方法,下采样中的滤波可能会使上采样后的图像明显模糊,因为它会收缩颜色线的端点,这对图像细节是不利的。

公式(6)可以通过迭代优化 I ↓ I^{↓} I Θ \Theta Θ 来求解。给定 I ↓ I^{↓} I,上采样参数 Θ \Theta Θ 可以按照算法 1 求解。为了优化下采样,我们首先计算像素级误差图 E E E, $E_{p} = \left | I_{p} - \hat{I}_{p} \right | $。显然,误差大的像素一定是那些不能被 I ↓ I^{↓} I 很好地表示的像素,因此需要通过替换一些现有的像素将它们添加到 I ↓ I^{↓} I 中。由于 I ↓ I^{↓} I 中的每个像素可能用于插值 I I I 的多个像素,上述操作可能不会减少总误差。因此,我们采用试错法,如果替换 I ↓ I^{↓} I 中的一些像素不能减少总误差,被替换的像素将被回滚。

  • 图 6
    在这里插入图片描述

图 6 说明了我们方法的过程,更多细节在算法 2 中描述。试错过程针对具有大误差 ε \varepsilon ε 的像素的每个连通区域 C i C_{i} Ci 执行。具有大误差的像素尝试被添加到下采样图像中,如果该操作可以减少总误差,则该操作将被接受,否则将被回滚。对于映射到相同低分辨率像素位置$q \in I^{↓} $的多个高分辨率像素,选择具有最大误差的像素来替换 q q q 的原始颜色。

如图 5 所示,上述方法可以有效地防止细结构和小区域的丢失。在大多数情况下,它只需要 1 或 2 次迭代就可以收敛,并且在初始化后,只有具有大误差的像素才会被进一步处理,所以只需要稍微多一点的计算量。

  • 算法 2
    在这里插入图片描述
Theoretical Derivation

颜色线模型告诉我们,小区域内像素的颜色在颜色空间中应该大致在同一条线上。因此,该区域中每个像素的颜色必须通过颜色线的两个端点 [ a , b ] [a, b] [a,b] 的线性插值来很好地近似。下采样后,由于高分辨率图像中的信息冗余,可以预期 [ a , b ] [a, b] [a,b] 仍然可以由下采样后的区域中的两个像素很好地表示。结果,原始区域中的每个像素颜色也可以由下采样后的区域中的两个像素进行线性插值,如公式 (1) 所示。

局部颜色变换方法假设输出图像可以局部表示为输入图像的仿射变换,即 T p = A p I p T_{p} = A_{p}I_{p} Tp=ApIp,其中 A p A_{p} Ap 是在图像空间中平滑变化的仿射变换。此外,我们要求运算符近似具有尺度不变性: T p ↓ = A p I p ↓ T_{p}↓ = A_{p}I_{p}↓ Tp↓=ApIp。因此,如果使用可以线性插值表示原始图像:

I p = w a b I a ↓ + ( 1 − w a b ) I b ↓ (7) I_{p} = w_{ab} I_{a}^{↓} + (1 - w_{ab}) I_{b}^{↓} \tag{7} Ip=wabIa+(1wab)Ib(7)

那么变换后的图像也可以满足:

T p = w a b A p I a ↓ + ( 1 − w a b ) A p I b ↓ = w a b T a ↓ + ( 1 − w a b ) T b ↓ (8) {T}_p = w_{ab}A_p I_{a}^{↓} + (1 - w_{ab}) A_{p} I_{b}^{↓} = w_{ab} T_{a}^{↓} + (1 - w_{ab}) T_{b}^{↓} \tag{8} Tp=wabApIa+(1wab)ApIb=wabTa+(1wab)Tb(8)

Edge Recovery

在这里插入图片描述

典型的图像边缘可以分为三种类型:阶跃边缘、斜坡边缘和屋脊边缘 [Koschan 和 Abidi 2005;Yin 等人 2019]。对于自然图像,大多数边缘应该是连接两个区域的斜坡边缘。显然,斜坡边缘的过渡效果可以通过两个区域颜色的线性插值很好地表示。因此,通过仅插值两个像素,GLU 可以很好地恢复原始图像的边缘。相比之下,使用 GNU 只能恢复阶跃边缘,因此会引入明显的伪影,如图 4 所示。

一个自然的问题是,通过插值更多的像素是否可以实现进一步的效果提升。实际上,公式(1)可以更一般地表示为

T ^ p = ∑ q ∈ Ω p ↓ w q T q ↓ (9) \hat{T}_p = \sum_{q \in \Omega_{p}^{↓}} w_{q} T_{q}^{↓} \tag{9} T^p=qΩpwqTq(9)

其中 w q w_{q} wq 是归一化的权重。有趣的是,这正是 JBU(联合双边上采样)的形式。虽然没有进行测试,但我们认为没有必要采用更多的像素进行插值。涉及更多的像素不仅会使优化更加困难,还可能导致过拟合和外推,这两者都会降低结果质量。

Detail Preservation

我们的方法隐含地利用了局部颜色变换来传递上采样参数。然而,需要注意的是,与之前的方法如引导滤波 [He 等人,2012] 和 BGU 不同,我们的方法不要求变换在图像空间或双边空间中是平滑的。因此,它可以更好地保留目标图像的细节效果,同时避免过度平滑导致的渗色伪影。

我们方法的一个潜在问题是缺乏明确的平滑性约束。虽然保持平滑对于大多数图像处理操作符很重要,但我们发现我们的方法在大多数情况下独立地对每个像素进行操作也能很好地工作。这主要是因为线性插值模型可以很好地近似原始源图像的外观,它作为一个平滑的引导图,如果目标图像与源图像具有相似的局部亲和力,可以抑制不光滑的伪影。然而,如果源图像和目标图像的像素亲和力有显著差异(例如,当在目标图像中引入新的边缘时),可能会产生不光滑的伪影。实际上,这是我们方法的主要局限性。

Limitations

与 JBU 和 BGU 一样,我们方法的一个基本假设是源图像和目标图像具有几乎相同的局部亲和力,即源图像中颜色更相似的像素在目标输出中应该具有更相似的颜色。因此,我们的方法不适用于可能在目标图像中引入新边缘的应用。图 14 展示了这样一个例子。新边缘的亲和力与源图像有很大不同,因此不在联合优化的范围内。在更一般的情况下,由于不同的局部亲和力,我们的方法可能会产生不光滑的边缘。如图 15 所示,由于物体与背景颜色相似,我们的方法无法准确地恢复清晰的遮罩边缘。

与添加新边缘不同,去除边缘通常不会给我们的方法带来问题,因为得到的像素仍然可以由相邻像素插值,所以像抠图和平滑这样的应用可以得到很好的支持。相比之下,BGU 可能会坚持保留源图像的边缘和局部结构,所以对于去除边缘的应用,它可能会产生伪影,如图 8 所示。

由于在处理新边缘方面的限制,我们的方法不适用于可能极大地改变局部图像结构的应用,例如最近基于学习的风格迁移方法 [Park 等人,2020;Zhu 等人,2017]。这是包括 JBU 和 BGU 在内的通用引导上采样方法的一个共同局限性。图 16 展示了一些例子。如图所示,对于像马变斑马这样的情况,BGU 可能完全忽略新边缘,而我们的方法会导致不光滑的伪影。实际上,由于对于新边缘,源图像中没有引导信息,如果没有任何特定领域的先验知识,就无法得到好的结果,所以在这种情况下使用基于学习的方法应该更好。

对于实际应用,一个实际问题是找到一个适合低分辨率处理的图像运算符。如图 10 所示,输入图像的尺度可能对一些图像处理方法的输出有很大影响。例如,我们发现 BackgroundMattingV2 在应用于 8 倍下采样的输入时会产生明显更多的错误,因为它最初是为高分辨率视频设计的。另一个例子是光流估计 [Teed 和 Deng,2020],其准确性受图像分辨率的极大影响,并且在上采样后需要特殊处理。如何调整这些方法以更好地进行低分辨率图像处理是一个遗留问题。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2024】【字节青训营】:字节青训营入营测试题——Java版本(已提交通过)

目录 简单题目 计算x到y的最小步数 环状 DNA 序列的最小表示法 Base32 解码和编码 打点计时器 兔群繁殖之谜 完美整数 找出整数数组中占比超过 一半 的数 找出最长的神奇数列 找单独的数 字符串最短循环字串 二进制反码转换问题 中等题目 简单四则运算 数字翻译…

【图解版】力扣第146题:LRU缓存

力扣第146题:LRU缓存 一、LRU算法1. 基本概念2. LRU 和 LFU 的区别:3. 为什么 LRU 不需要记录使用频率? 二、Golang代码实现三、代码图解1. LRUCache、DLinkedNode两个结构体2. 初始化结构体对象3. addToHead函数4. removeNode函数5. moveToH…

rust grpc demo

文章目录 1. 创建项目2. 配置proto2.1 配置Cargo.toml, 内容如下:2.2 创建文件proto/hello.proto, 内容如下:2.3 添加build.rs文件, 内容如下:2.4 项目结构如下:2.5 编译proto文件 3.0 处理服务3.1 项目引入3.2 添加sr…

多模态大语言模型(MLLM)-Deepseek Janus

论文链接:https://arxiv.org/abs/2410.13848 代码链接:https://github.com/deepseek-ai/Janus 本次解读Janus: Decoupling Visual Encoding for Unified Multimodal Understanding and Generation 前言 Deepseek出品,必属精品。 创新点 传…

docker容器无法连接宿主机mysql排查

1、docker无法访问宿主机 在docker容器内,需要访问当前docker容器的网关,例如172.xx.0.1,即可访问宿主机,因此需要保证docker的网络配置正确 查看当前docker容器的网关: docker inspect 你的容器名或者容器id 显示…

【纯前端excel导出】vue2纯前端导出excel,使用xlsx插件,修改样式、合并单元格

官网: 1、xlsx-js-style xlsx-js-style | xlsx-js-style homepage 2、xlsx SheetJS 中文网 一、使用第三方插件 1、安装 npm install xlsx-js-style 2、引入 import xlsx from xlsx-js-style xlsx插件是基础的导出,不可以修改样式,直接xlsx-s…

文通车牌识别相机在工地称重应用中的卓越表现

在现代工地管理中,高效、准确的称重系统是确保工程顺利进行的关键之一。而文通车牌识别相机的出现,为工地称重应用带来了全新的解决方案。 一、工地称重面临的挑战 传统的工地称重方式往往存在着一些问题。人工记录车牌和重量信息容易出现错误&#xff0…

python-----函数详解(一)

一、概念及作用: 概念:由若干条语句组成语句块,其中包括函数名称、参数列表,它是组织代码的最小单元,完成一定的功能 作用:把一个代码封装成一个函数,一般按功能组织一段代码 目的就是为了重…

基于单片机的智能小区门禁系统设计(论文+源码)

1总体架构 智能小区门禁系统以STM32单片机和WiFi技术为核心,STM32单片机作为主控单元,通过WiFi模块实现与手机APP的连接,构建整个门禁系统。系统硬件包括RFID模块、指纹识别模块、显示屏、按键以及继电器。通过RFID绑定IC卡、APP面部识别、指…

百度搜索推广和信息流推广的区别,分别适用于什么场景!

信息流推广和搜索广告,不仅仅是百度,是很多平台的两个核心推广方式。 1、搜索广告: 就是基于用户的搜索习惯,更多是用户有疑问、还有用户当下就要做出行动的广告。 比如上门服务、线上咨询服务、招商加盟、了解产品各种型号和信…

STM32G4系列MCU的低功耗模式介绍

目录 概述 1 认识低功耗模式 1.1 低功耗模式的应用 1.2 低功耗模式介绍 2 低功耗模式的状态关系 2.1 低功耗模式可能的转换状态图 2.2 低功耗模式总结 3 运行模式 3.1 减慢系统时钟 3.2 外围时钟门控 3.3 低功耗运行模式(LP运行) 概述 本文主…

react 基础学习笔记

1.react 语法 ①数据渲染 函数组件将HTML结构直接写在函数的返回值中 JSX只能有一个根元素 JSX插值写法 插值可以使用的位置 1.标签内容; 2.标签属性 JSX 条件渲染:三目运算符; JSX根据数据进行列表渲染:map()方法&#x…

QT 机器视觉 1.相机类型

本专栏从实际需求场景出发详细还原、分别介绍大型工业化场景、专业实验室场景、自动化生产线场景、各种视觉检测物体场景介绍本专栏应用场景 更适合涉及到视觉相关工作者、包括但不限于一线操作人员、现场实施人员、项目相关维护人员,希望了解2D、3D相机视觉相关操作…

微服务与多租户详解:架构设计与实现

引言 在现代软件开发领域,微服务架构和多租户架构是两个重要的概念。微服务架构通过将应用程序拆分为多个独立的服务,提升了系统的灵活性和可维护性。而多租户架构则通过共享资源来服务多个客户,提高了资源利用率和系统的经济性。 一、微服务…

OpenCV的常用与形状形状描述相关函数及用法示例

OpenCV提供了提供了多种用于形状描述和分析的函数。这些函数能够帮助你提取图像中的形状特征,进行形状匹配、识别和分析。下面介绍一些常用的形状描述函数: 轮廓检测函数findContours() findContours()函数用于在二值图像中查找轮廓。有两个原型函数&…

【zlm】 webrtc源码讲解(二)

目录 webrtc播放 MultiMediaSourceMuxer里的_ring webrtc播放 > MediaServer.exe!mediakit::WebRtcPlayer::onStartWebRTC() 行 60 CMediaServer.exe!mediakit::WebRtcTransport::OnDtlsTransportConnected(const RTC::DtlsTransport * dtlsTransport, RTC::SrtpSession::…

tomcat部署war包部署运行,IDEA一键运行启动tomacat服务,maven打包为war包并部署到tomecat

tomcat部署war包前端访问 在Java Web开发中,Tomcat是一个非常流行的开源Web服务器和Servlet容器。它实现了Java Servlet和JavaServer Pages (JSP) 技术,提供了一个纯Java的Web应用环境。本文将介绍如何在Tomcat中部署运行WAR包,让你的应用快…

vue2 使用环境变量

一. 在根目录下创建.env.xxx文件 .env 基础系统变量,无论何种环境,都可使用其中配置的值,其他环境中的变量会覆盖.env中的同名变量。 .env.development 开发环境 .env.production 生产环境 .env.staging 测试环境 二. 内容格式 vue2 使用是以…

GRU神经网络理解

全文参考以下B站视频及《神经网络与深度学习》邱锡鹏,侧重对GPU模型的理解,初学者入门自用记录,有问题请指正【重温经典】GRU循环神经网络 —— LSTM的轻量级版本,大白话讲解_哔哩哔哩_bilibili 更新门、重置门、学习与输出 注&a…

STM32(二十一):看门狗

WDG(Watchdog)看门狗,手动重装寄存器的操作就是喂狗。 看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入…