可逆神经网络的研究及其在图像中应用

news2024/12/23 1:04:39

一、摘要

可逆神经网络(INN)自被提出以来,就受到了广泛关注。由于其双射构造和高效可逆性,INN被用于各种推理任务,如图像隐藏、图像重缩放、图像着色、图像压缩和视频超分辨率等等。本文针对最新关于INN在图像方面应用的文献进行介绍,包括每篇文献的基本原理和个人理解。最后对所介绍的文献进行总结,指出各自的优缺点并对未来INN在图像方面应用展开思考。

Invertible neural network (INN) has been widely concerned since it was proposed. Because of its bijective construction and efficient reversibility, INN is used for a variety of inference tasks, such as image hiding, image rescaling, image coloring, image compression, and video super resolution, among others. This article introduces the latest literature on the use of INN in imaging, including the rationale and personal understanding of each literature. Finally, the paper summarizes the literature, points out their advantages and disadvantages and thinks about the application of INN in image in the future.

二、绪论

在这里插入图片描述
在这里插入图片描述
由于INN的可逆性,其逆向过程示意图如图1.2所示,计算公式如(3)和(4)所示。
在这里插入图片描述
因为其强大的网络表示能力,INN适用于各种推理任务,如图像隐藏、图像着色、图像缩放、图像压缩和视频超分辨率等等。由于笔者的研究方向与图像隐藏相关,下面将通过笔者阅读过的与此相关论文来具体展示INN在图像中的应用,同时包括笔者的思考和理解。

三、相关论文研究

本章按照论文发表的时间顺序,依次介绍四篇使用INN进行图像方向的应用的论文,分别为HiNet[3]、Steg-cINN[4]、RIIS[5]和IRN[6]。在介绍的过程中,将着重阐述文献提出的神经网络架构和笔者的个人理解。

3.1 HiNet
3.1.1 网络体系结构

图像隐藏的目的是将秘密图像以一种不被察觉的方式隐藏在封面图像中,然后在接收端完美地恢复秘密图像。容量、不可见性和安全性是图像隐藏的三大挑战,原文提出了一种新的基于可逆神经网络(INN)的框架HiNet[3],可以同时克服这三大挑战。在INN的框架下,将图像揭示建模为图像隐藏逆向过程,HiNet[3]只需要训练一次即可得到图像隐藏和揭示模块的所有网络参数。

图2.1展示了原文所提出的HiNet[3]的整体框架。在正向隐藏过中,输入一对秘密图像和封面图像,经过离散小波变换(DWT)将其分解为低频和高频小波子带,再将其送入隐藏模块进行处理。最后一个隐藏块的输出经过一个逆小波变换(IWT)生成隐写图像和丢失信息。同理,由于HiNet[3]完全可逆,在反向揭示过程中,隐写图像和辅助变量依次通过DWT、揭示模块(结构和参数均与隐藏模块相同)和IWT得到恢复秘密图像和恢复封面图像。
在这里插入图片描述

对照HiNet[3]的框架图,笔者认为HiNet在实验结果上优于其他先进图像隐藏方法的原因有以下三点:(1)使用小波域进行隐藏,原文采用Haar小波进行DWT和IWT,是一种完全可逆的小波变换,有利于HiNet的端到端训练和可以减少图像信息损失,提高图像的隐藏性能。(2)INN框架在图像隐藏中的应用,使图像隐藏和图像揭示作为一个完整的模块,而不同于以往两个独立的模块,即INN使该过程完全可逆,同时提高图像的隐藏和显示性能。(3)原文在对损失函数方面创造性提出了低频小波损失,其目的是为了保证大部分信息隐藏在高频子带中,要求隐写图像的低频子带经过小波分解后与封面图像的低频子带相似,通过实验部分的消融实验可以看出引入低频小波损失的有效性。

但是笔者对于HiNet[3]还存在两个没有理解透彻的问题:(1)将秘密图像和封面图像作为DWT输入时的通道划分问题。秘密图像和封面图像为RGB三通道图像,经过DWT后变成各自12通道再输入的INN框架,经过一系列可逆块最终将前12通道合并成隐写图像,后12通道合并成丢失信息,在这过程如何操作已经原理尚不清楚。(2)由第一个问题衍生而出,HiNet[3]直接正向过程中输出丢失信息舍弃,在反向过程中采用从高斯分布中随机采样作为辅助变量帮助恢复秘密图像。笔者猜想的原因是可能正向过程中已经将秘密图像的绝大部分信息隐藏到封面图像中,剩下的12通道含有的秘密图像信息很少可以丢弃,引入高斯分布采样可能可以让恢复秘密图像的视觉效果更好。

3.1.2 代码运行

由于HiNet[3]的作者开源了论文代码,使用的数据集是DIV2K。笔者成功运行了HiNet[3],并使用DIV2K的验证集作了简单测试,其生成的部分恢复秘密图像和计算结果分别如图2.2和2.3所示。从图2.2可以看出,HiNet[3]最终恢复的秘密图像视觉效果非常好,无光斑和噪声伪影。从图2.3可以看出,HiNet[3]的两个评价指标:平均PSNR值达到50dB,平均SSIM值达到0.9,实验数据非常理想。此外,笔者还验证了HiNet[3]的数据集泛化性,还在其他数据集如Set5、Set14、Kodak等进行测试,实验结果均非常好,此处便不再展示
在这里插入图片描述
在这里插入图片描述
但笔者在运行过程中,发现代码中对于文章提出三种损失:隐藏损失、揭示损失和低频小波损失的权重分别为5,1,1。而原文给出了三种损失权重分别为10,1,10,笔者以原文给出损失权重进行训练发现,代码中的损失权重可以是总损失下降更快,应该是原文作者的笔误,没有将论文中的权重更新为代码中的权重。

3.2 Steg-cINN
3.2.1网络体系结构

现有的图像深度隐写方法只考虑了隐写图像与封面图像的视觉相似性,而忽略了隐写图像的统计安全性。此外,它们通常隐藏仅限于图像类型的数据,忽略了无损提取的约束。原文提出的深度图像隐写术Steg-cINN[4]统一解决了上述问题,可以将任意类型的数据嵌入到图像中,实现数据的安全隐藏和无损提取。Steg-cINN[4]最大的创新点是将数据隐藏问题转化为图像着色问题,使用条件可逆神经网络cINN以灰度图像作为先验指导彩色图像生成并以安全的方式进行数据隐藏。

图2.4展示了原文提出的Steg-cINN[4]框架,包括一个隐藏过程和一个揭示过程。该框架的隐藏过程首先将任何类型的秘密数据转化为二进制序列m,然后映射模块M将二进制序列m映射为符合标准正态分布潜变量z。对于彩色封面图像使用Lab颜色空间空间将其转换为灰度图像,隐藏网络H在灰度图像L的引导下将潜变量z转换为新的颜色信息c。对L和c进行拼接,通过颜色空间转换为RGB图像。在使用舍入操作存储图像之后,整数值图像将作为隐写图像发送。该框架的揭示过程是隐藏过程的逆过程,首先首先将容器图像从RGB转换到Lab颜色空间,得到L’和c’,其中L’表示重构灰度图像,c’表示重构颜色信息。然后揭示网络R在L’的引导下将c’转化为潜变量z’。揭示网络R也是基于cINN,其与隐藏网络H具有相同的网络架构和共享权重。最后,逆映射模块M−1将z’映射为二进制位流M’,并可进一步转换为其原始数据类型。
在这里插入图片描述

分析Steg-cINN[4]的框架图,笔者认为Steg-cINN[4]可以生成真实的彩色图像实现安全的数据隐藏并成功抵抗隐写分析的检测有以下两个方面的原因:(1)映射模块M和逆映射模块M−1在隐藏过程和揭示过程中起着重要作用,其主要思想是让让z的符号代表m,m是一个遵循均匀分布的二进制位流,z是一个遵循标准正态分布N(0,1)的潜变量。只要最终提出的z’的符号与z相同,即可准确提取m。(2)因为图像存储中的舍入操作会导致图像信息的丢失,原文对Steg-cINN[4]的训练分为两阶段。第一阶段是训练生成模型,生成自然真实的颜色。第二阶段是进行四舍五入训练,增强在四舍五入误差条件下的显示能力。

同时,笔者没有完全弄懂本文的思想,主要有以下两个问题:(1)隐藏网络H和揭示网络R的结构均是基于cINN,其结构如图2.5所示。原文应该首先需要将封面彩色图像转化为灰度图像作为指导图像,但该条件如何在cINN中起作用还不是很清楚。笔者认为该灰度图像经过 VGG预处理后,可以使颜色信息更好地匹配灰度图像的语义信息。将提取的特征作为输入送入到cINN的仿射耦合层(ACL),可以更好学习图像语义信息。(2)原文将实现任意数据的数据隐藏作为一个创新点,笔者认为该点不足以成为一个创新点,因为图像、文本、音频和视频等可以比较简单转化为二进制序列。主要问题在原文强调二进制序列m必须满足均匀分布,在现实中显示不可行,否则将无法使用z的符号代表m,可能笔者没有完全弄懂映射模块M和逆映射模块M−1架构如何实现。
在这里插入图片描述
由于原文作者没有公布Steg-cINN[4]的源码,此处无法展示实际的运行效果。

3.3 RIIS
3.3.1网络体系结构

以往的图像隐写方法在隐藏能力和鲁棒性方面存在一定的局限性,通常容易受到容器图像失真的影响,如高斯噪声、泊松噪声和有损压缩。原文提出一种基于流的鲁棒可逆图像隐写框架RIIS[5],引入条件标准化流、内容感知噪声投影(CANP)、容器增强模块(CEM)和失真引导调制(DGM)。无论在无损环境下还是在失真环境下,RIIS[5]在保持不可感知性和容量的同时,有效地提高了鲁棒性。此外,原文指出2.1节介绍的HiNet[3]在隐写图像上实现了轻微的噪声或有损压缩,所揭示的秘密图像就几乎无法识别,且HiNet[3]一次只能在一张封面图像中隐藏一张秘密图像。然而RIIS[5]可以在失真情况下很好恢复秘密图像且同时一次性能在一张封面图像中隐藏多张秘密图像。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
由于原文作者没有公布RIIS[5]的源码,此处无法展示实际的运行效果。

3.4 IRN及其扩展
3.4.1网络体系结构

图像重缩放是一种常用的双向操作,它首先将高分辨率图像缩小以适应各种显示器或存储和带宽友好,然后将相应的低分辨率图像放大以恢复原始分辨率或放大图像中的细节。然而,非单射下采样映射丢弃了图像高频内容,导致逆恢复任务存在不适定问题。原文主要提出了一个新的可逆框架IRN[6]来处理这一普遍问题,该框架的可逆性使其能够以分布的形式对退化前的信息损失进行建模,从而缓解恢复后的不适定问题。此外,原文在图像重缩放的基础上,扩展到类似图像脱色-着色问题,并进一步将可逆框架与图像压缩结合起来,以获得更广泛的应用。与现有方法相比,IRN[6]在从缩小和脱色图像进行放大和彩色重建的定量和定性评估以及图像压缩的速率失真方面都有显著改进。

图2.9展示了原文提出的IRN[6]作为可逆建模框架的实例化模型,由一个Haar变换和若干个InvBlocks组成的堆叠降尺度模块组成。每个降尺度模块将空间分辨率降低2倍。Haar变换使模型具有一定的感应偏差,用于分割低频和高频内容,在图像下采样过程中,低频和高频内容分别被近似保留和丢失。InvBlocks是IRN[6]的主要模块,将经过Haar变换的三个通道的高频信息作为输入送到上方,低频信息作为输入送到下方。
在这里插入图片描述

虽然Haar小波变换可以很好地进行高频和低频内容的下采样和分割,但叠加多次变换只能以2的幂来重缩放图像。这在很大程度上限制了IRN[6]的缩放范围。为了实现更多的尺度,例如3×,原文利用一个可学习的下采样层来取代架构中的Haar变换,其由由一个压缩运算和一个1 × 1可逆卷积组成。但此处笔者不太理解可学习下采样层如何分割图像的高频和低频信息,可能是因为通过1×1可逆卷积进行通道置乱,使变换后的第一个通道为所有元素的平均值,在进行初始化时可以提供对提取低频信息的先验知识。此外,原文在介绍IRN[6]的训练损失函数时,通过大量的概率推导,笔者也没有完全理解,此处便不再叙述。

对于原文的提出图像脱色-着色模型IRNcolor,其基本架构如图2.9所示,采用的是IRN[6]模型一次下采样的结构即只有一个可逆块。与IRN[6]模型的不同之处有:(1)图像脱色-着色过程中,灰度信息(采用Y通道)对应着低频信息,颜色信息(采用CbCr通道)对应着高频信息,将图2.9中的下采样模块替换为灰化模块,且无Haar小波变换。(2)三个损失指导损失、重建损失和分布匹配损失的超参数不同。(3)当潜变量z服从标准高斯分布时,在逆计算中设置z = 0而不是随机样本。

对原文提出IRN[6]与图像压缩的结合,主要分为两个方面:IRN[6]+无损压缩和IRN[6]+有损压缩,具体流程如图2.10所示。其中,最重要的模块是有损压缩中的压缩恢复(CRM)模块,其可以将输入的经过压缩后的退化LR图像转换为经过有损压缩后退化恢复的LR图像。但具体的CRM模块结构原文并没有给出,笔者目前无法理解。
在这里插入图片描述
3.4.2 代码运行

由于IRN[6]的作者公布论文源码,使包括三个部分:图像重缩放,图像的脱色-着色,以及图像缩放与压缩的结合。原文对于所有任务的训练使用的数据集是DIV2K,同时使用4个额外的标准数据集上评估提出的模型,即Set5,Set14,BSD100和Urban100。笔者成功运行了IRN[6],并使用DIV2K的验证集以及以上四个数据集就原文的三部分作了简单测试,以DIV2K为例展示其生成的部分图像分别如图2.11-2.13所示。从这些图可以看出,生成图像的视觉效果均非常好,且图像压缩的压缩比非常高。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
笔者在测试IRN[6]对于其他数据集的泛化性,发现了问题:对于某些数据集如Kodak进行一次下采样测试时,会出现意想不到的光斑如图2.14所示。笔者认为可能的解决办法是以Kodak为训练集重新训练得到训练参数文件进行测试,可见IRN[6]对于超分辨率重建常用的数据集泛化性比较好,但是对于其他数据集泛化性不是很好,有待继续研究。
在这里插入图片描述
四、总结与思考

本文主要通过近两年来最新的四篇关于INN的文献来具体展示INN的可逆性和在图像方面的具体应用,并对开源的文献做了简单的测试实验。在介绍过程中,笔者提出了对于这些文献的理解与思考,同时也存在某些问题目前无法理解,可以继续研究。现在对前文介绍的四篇文献作简单总结如下:
(1)HiNet[3]最大的创新点是提出了一种新的低频小波损失来提高图像隐藏的安全性,但是没有实现将多张秘密图像隐藏到一张封面图像中且无法抵抗图像攻击。
(2)Steg-cINN[4]使用cINN从图像着色进行安全数据隐藏,可以在不同的场景中达到100%的揭示准确性,但是存在的缺陷是实现条件苛刻且数据隐藏的鲁棒性差。
(3)RIIS[5]利用CANP将隐写图像的特征加入到高频信息中指导潜变量的生成,同时采用CEM可以有效抵抗失真使得模型鲁棒性高,但是只能抵抗三种类型的失真且框架结构复杂。
(4)IRN[6]以图像重缩放为核心,实现了图像脱色-着色模型以及与图像压缩的结合,均取得了最好的实验结果,但是对数据集的泛化性不是很好需要针对不同数据集重新训练。
由于笔者的研究方向与图像隐藏有关,未来关于INN在图像方面的应用或改进,可以从以下三个方面进行思考:
(1)目前提出的最新图像隐藏方法,都可以实现大容量的要求即将多张秘密图像隐藏到一幅封面图像中,但提高隐藏鲁棒性一直需要解决,可以考虑更多的失真情况得到一个通用的INN模型框架。
(2)图像隐藏的实验结果依赖于训练策略和所用数据集,可以优化训练策略和提高所提出方法对各种数据集的泛化性。
(3)可以考虑INN与无载体图像隐藏的结合,因为随机采样去恢复秘密信息总是存在误差,尽可能减少信息丢失是关键所在。

五、参考文献

[1]Laurent Dinh, David Krueger, and Yoshua Bengio. Nice:Non-linear independent components estimation. In International Conference on Learning Representations (ICLR),2014.

[2]Laurent Dinh, Jascha Sohl-Dickstein, and Samy Bengio.Density estimation using real nvp. In International Conference on Learning Representations (ICLR), 2016.

[3]Junpeng Jing, Xin Deng, Mai Xu, Jianyi Wang, and Zhenyu Guan. Hinet: Deep image hiding by invertible network. In Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV), 2021.
HiNet源码

[4]Yanzhen Ren, Ting Liu,Liming Zhai and Lina Wang. Hiding Data in Colors: Secure and Lossless Deep Image Steganography via Conditional Invertible Neural Networks,2022.

[5]Youmin Xu, Chong Mou,Yujie Hu,Jingfen Xiu and Jian Zhang. Robust invertible image steganography.In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition(CVPR),2022.

[6]Mingqing Xiao, Shuxin Zheng,Chang Liu,Zhouchen Lin and Tie-Yan Liu. Invertible Rescaling Network and Its Extensions.In International Journal of Computer Vision,2023.
IRN源码

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

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

相关文章

day30_JS

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、BOM 三、定时器 四、正则表达式 零、 复习昨日 事件 事件绑定方式鼠标事件 onmouseoveronmouseoutonmousemove 键盘事件 onkeydownonkeyupon…

一文带你深入理解【Java基础】· Java反射机制(下)

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

aws dynamodb 使用awsapi和PartiQL掌握dynamodb的CRUD操作

总结一下 dynamodb通常和java等后端sdk结合使用使用的形式可以是api或partiql语法调用dynamodb的用法不难,更重要的是维护成本,所需的服务集成,技术选型等和大数据结合场景下有独特优势 之后可能再看看java sdk中DynamoDBMapper的写法&…

登入vCenter显示503,证书过期解决办法

登入vCenter显示503 原因:当安全令牌服务 (STS) 证书已过期时,会出现这些问题。这会导致内部服务和解决方案用户无法获取有效令牌,从而导致无法按预期运行(证书两年后就会过期)。 解决办法&…

Yocto系列讲解[技巧篇]90 - toolchain交叉编译器SDK中安装的软件

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 问题背景toolchain生成回顾toolchain sdk安装方法1:安装libmyapi到SDK方法2:安装libmyapi到SDK演示过程返回总目录:Yocto开发讲解系…

Linux 学习笔记——二、主机规划与磁盘分区

一、Linux 与硬件的搭配 Linux 中所有设备均被视为文件,其命名规则如下: 设备文件名SCSI/SATA/USB 硬盘机/dev/sd[a-p]USB 闪存盘/dev/sd[a-p](与 SATA 相同)Virtl/O 界面/dev/vd[a-p](用于虚拟机内)软盘…

RabbitMQ高级特性

RabbitMQ高级特性 消息可靠性投递 Consumer ACK 消费端限流 TTL 死信队列 延迟队列 日志与监控 消息可靠性分析与追踪 管理 消息可靠性投递 在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我们提供了两种方式用来控制…

docker基本命令-容器

容器 基本概念 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。 容…

.NET Framework .NET Core与 .NET 的区别

我们在创建C#程序时,经常会看到目标框架以下的选项,那么究竟有什么区别? 首先 .NET是一种用于构建多种应用的免费开源开发平台,可以使用多种语言,编辑器和库开发Web应用、Web API和微服务、云中的无服务器函数、云原生应用、移动应用、桌面应用、Windows WPF、Windows窗体…

搭建一个中心化的定时服务

1. 背景 在物联网络,很多设备之间都在进行交互,其中云端在远程交流中起到了很重要的作用。比如,一台设备想进行调温,但是需要知道此时房间的温度,那就需要定时去查询传感器测出来的房间温度,如果温度过高&a…

【C++学习】【STL】list容器

list 容器,又称双向链表容器,即该容器的底层是以双向链表的形式实现的。这意味着,list 容器中的元素可以分散存储在内存空间里,而不是必须存储在一整块连续的内存空间中。可以看到,list 容器中各个元素的前后顺序是靠指…

【NodeJs】使用ffmpeg将视频webm转换为mp4

使用Chrome浏览器录制视频文件是webm格式,但是很多媒体播放器是不支持的,不利于分享,需要转换为mp4格式才行,接下来给大家讲 ffmpeg ffmpeg是什么呢, 一个免费开源的视频转换工具,一款音视频编解码工具&…

日志与可视化方案:从ELK到EFK,再到ClickHouse

EFK方案 从ELK谈起 ELK是三个开源软件的缩写,分别表示:Elasticsearch,Logstash,Kibana。新增了一个FlieBeat,它是一个轻量级的日志收集处理工具,FlieBeat占用资源少,适用于在各个服务器上搜集…

JS语法(扫盲)

文章目录一、初识JavaScript二、第一个JS程序JS代码的引入JS程序的输出三、语法变量使用动态类型内置类型运算符强类型语言&弱类型语言条件语句循环语句数组创建数组获取数组元素新增数组元素删除数组元素函数语法格式形参实参个数的问题匿名函数&函数表达式作用域作用…

PHP 的运行方式有哪些?

PHP本质上的运行方式可以分为两种: 基于命令行的基于PHP-FPM的 但实际上,PHP能做的事很多,很多场景下,不同的运行方式能让开发更方便,减轻各种工作。 测试开发 PHP内置了一个HTTP 的server。这意味着,很…

stm32外设-GPIO

0. 写在最前 本栏目笔记都是基于stm32F10x 1. GPIO基本介绍 GPIO—general purpose intput output 是通用输入输出端口的简称,简单来说就是软件可控制的引脚, STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的…

java Date 和 Calendar类 万字详解(通俗易懂)

Date类介绍及使用关于SimpleDateFormat类Calendar类介绍及使用LocalDateTime类介绍及使用关于DateTimeFormatter类一、前言本节内容是我们《API-常用类》专题的第五小节了。本节内容主要讲Date 类 和 Calendar 类,内容包括但不限于Date类简介,Date类使用…

【微信小程序】-- 自定义组件 - 数据监听器 (三十四)

💌 所属专栏:【微信小程序开发教程】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…

传奇开服流程—传奇单机架设教程

现在传奇私服还是那么的火爆,上次有报道发布站一年盈利几个亿,还是有很大的机会,很多玩家因为GM开服关服给折腾,刚充的钱服务器就关了,很是恼火,于是都想自己整个服开开,但又不知道从何下手&…

三菱FX5U之数据处理类指令的使用

本课程使用三菱PLC works3编程软件进行教学,并使用works3的仿真功能进行PLC仿真,学习的时候不需要有实物PLC。 补充说明:三菱 FX 5U系列PLC使用的是GX works3编程软件,FX 3U、Q系列PLC使用的是GX works3编程软件。 第一章 八个案…