图像风格迁移试玩

article/2025/9/18 8:45:37

风格迁移

    • 图像风格迁移原理
      • 内容损失函数
      • 风格损失函数
    • 现成工具:tensorflow hub
    • 手工实现风格迁移
      • 我们对风格有失恭敬

 


神经风格转换是深度学习领域中一个很有趣的技术。它可以改变图像的风格。

如下图所示,根据一张内容图片和一张风格图片,生成一张新图片,这张图片结合了第一张图像的内容和第二张图像的风格。



 


图像风格迁移原理

我们用卷积神经网络来实现风格迁移,需要准备俩张图:

  • 输入图:内容图 C C C
  • 输入图:风格图 S S S

目标,是将内容图(真人)变成某种风格(二次元)的内容图(二次元风格的真人)。

  • 生成图:某种风格的内容图 G G G

在机器学习、深度学习里,只需要知道数据格式、损失函数,一个问题就变成了优化算法,不断迭代去调参即可。

风格转换网络的损失函数,是由俩个子损失函数组成的。

  • J c ( C , G ) J_{c}(C,~G) Jc(C, G):计算内容图片、生成图片之间的损失,即内容损失函数
  • J s ( S , G ) J_{s}(S,~G) Js(S, G):计算风格图片、生成图片之间的损失,即风格损失函数
  • J ( G ) = J c ( C , G ) + J s ( S , G ) J(G)=J_{c}(C,~G)+J_{s}(S,~G) J(G)=Jc(C, G)+Js(S, G),风格转化损失函数 = 内容损失函数 + 风格损失函数

当然,这样写俩者就是等比例的,我们想实现不同的风格效果,需要添加俩个参数 α 、 β \alpha、\beta αβ,用于调整内容与风格之间的占比:

  • J ( G ) = α ∗ J c ( C , G ) + β ∗ J s ( S , G ) J(G)=\alpha*J_{c}(C,~G)+\beta*J_{s}(S,~G) J(G)=αJc(C, G)+βJs(S, G)
  • α \alpha α 大,侧重于生成内容
  • β \beta β 大,侧重于生成风格

 
清楚损失函数就可以训练神经网络,过程模拟如下。

输入内容图片(编号1)、风格图片(编号2)图片:

最开始,随机初始化生成图(编号3)。

通过损失函数计算得出,当前生成图与内容图、风格图之间的损失都很大。

梯度下降算法开始最小化代价函数 J ( G ) J(G) J(G),逐步处理像素,这样慢慢得到一个生成图片(编号4、5),越来越像用风格图片的风格画出来的内容图片(编号6)。

 


内容损失函数

不同层的神经网络学到的特征不同,学习过程从点 -> 线 -> 面,前面的是抽象的,后面的是具象的。

而风格转换既不能太抽象,也不能太具象,所以计算内容损失函数用中间层的神经网络。

内容损失函数,如何计算呢?

  • 计算内容图像与生成图像在某一层的激活值的差异程度。

假设是第 u 层的激活值计算损失:

-求俩个激活值向量的差异: ∣ ∣ a [ u ] ( C ) − a [ u ] ( G ) ∣ ∣ 2 || a^{[u](C)} - a^{[u](G)} ||^{2} ∣∣a[u](C)a[u](G)2

  • a [ u ] ( C ) a^{[u](C)} a[u](C):内容图像第 u 层激活值
  • [ u ] ( G ) ^{[u](G)} [u](G):生成图像第 u 层激活值

如果结果小,说明生成图像在内容上与内容图像很相似。

  • 内容损失函数: J c o n t e n t u ( C , G ) = 1 ( 2 n h [ u ] n w [ u ] n c [ u ] ) 2 ∑ j = 1 n h [ u ] ∑ j = 1 n w [ u ] ( a [ u ] ( C ) − a [ u ] ( G ) ) 2 J^{u}_{content}(C,~G)=\frac{1}{(2n_{h}^{[u]}n_{w}^{[u]}n_{c}^{[u]})^{2}}\sum\limits_{j=1}^{n_{h}^{[u]}}\sum\limits_{j=1}^{n_{w}^{[u]}}(a^{[u](C)} - a^{[u](G)})^{2} Jcontentu(C, G)=(2nh[u]nw[u]nc[u])21j=1nh[u]j=1nw[u](a[u](C)a[u](G))2

 


风格损失函数

在风格损失函数之前,风格上什么?

  • 从创作角度来看,一种带有综合性的总体特点,包含笔触、纹理、用色等等,比如一些画派追求眼睛所见的真实,对颜色、光影的掌控无敌的好。一些画派凭主观印象来画,对空间、设计的掌控无敌的好。
  • 从神经网络的角度来说,风格是激活值矩阵中不同深度的互相关系,是通道的不同相同位置的激活值之间的关系。

在这里插入图片描述
conv1_1 为例,共包含 64 个通道,这 64 个通道可以类比成 64 个人对一幅画的不同理解。

  • 一些人喜欢眼睛所见之真实
  • 一些人喜欢抽象代表的内涵

这 64 个人之间理解的差异,可用 64 个通道的互相关(喜好差异)表示:

  • 如果输入的图片的风格和生成图片一样,互相关的结果也就是相同的
  • 如果输入的图片的风格和生成图片不一样,互相关的结果也就是差异化的

怎么计算呢?

  • 第 1、2 个通道的第 1 个激活值相乘,第 1、2 个通道的第 2 个激活值相乘,······,相乘后的结果相加,结果就是俩个通道的风格关系。

通过这样一一相乘再相加(内积),会得到一个新矩阵。

生成图像的风格矩阵,用 G 表示:

  • G k k ′ [ u ] ( s ) = ∑ i = 1 n h [ u ] ∑ j = 1 n w [ u ] a i j k [ u ] ( s ) a i j k ′ [ u ] ( s ) G_{kk'}^{[u](s)}=\sum\limits_{i=1}^{n_{h}^{[u]}}\sum\limits_{j=1}^{n_{w}^{[u]}}a_{ij_{k}^{[u](s)}}a_{ij_{k'}^{[u](s)}} Gkk[u](s)=i=1nh[u]j=1nw[u]aijk[u](s)aijk[u](s)

解释:

  • u u u:第 u 层,每个卷积层都有自己对应的风格矩阵
  • k 、 k ′ k、k' kk:第 k、k’ 通道之间的风格关系
  • S S S:风格矩阵是关于风格图像
  • n h n_{h} nh:激活矩阵的高
  • n w n_{w} nw:激活矩阵的宽

同理,生成矩阵图像的风格矩阵(三个 s 改成 G 即可):

  • G k k ′ [ u ] ( G ) = ∑ i = 1 n h [ u ] ∑ j = 1 n w [ u ] a i j k [ u ] ( G ) a i j k ′ [ u ] ( G ) G_{kk'}^{[u](G)}=\sum\limits_{i=1}^{n_{h}^{[u]}}\sum\limits_{j=1}^{n_{w}^{[u]}}a_{ij_{k}^{[u](G)}}a_{ij_{k'}^{[u](G)}} Gkk[u](G)=i=1nh[u]j=1nw[u]aijk[u](G)aijk[u](G)

风格损失函数:

  • J s t y l e [ u ] ( S , G ) = 1 ( 2 n h [ u ] n w [ u ] n c [ u ] ) 2 ∑ k ∑ k ′ ( G k k ′ [ u ] ( s ) − G k k ′ [ u ] ( G ) ) J_{style}^{[u]}(S,~G)=\frac{1}{(2n_{h}^{[u]}n_{w}^{[u]}n_{c}^{[u]})^{2}}\sum\limits_{k}\sum\limits_{k'}(G_{kk'}^{[u](s)}-G_{kk'}^{[u](G)}) Jstyle[u](S, G)=(2nh[u]nw[u]nc[u])21kk(Gkk[u](s)Gkk[u](G))

风格图像的风格矩阵 - 生成图像的风格矩阵,如果风格差异大,那相减的结果就很大,就是损失很大。

那神经网络就会改变参数让损失变小,让俩张图像的风格越来越靠近。

除此之外,因为每层都有风格损失函数,我们引入一个超参数 λ \lambda λ,控制对不同卷积层的重视程度,或是低层次风格特征(纹理、边缘),或是高层次风格特征(复杂对象)。

完整的风格损失函数:

  • J s t y l e ( S , G ) = ∑ 1 λ u ⋅ J s t y l e [ u ] ( S , G ) J_{style}(S,~G)=\sum\limits_{1}\lambda^{u}·J_{style}^{[u]}(S,~G) Jstyle(S, G)=1λuJstyle[u](S, G)
     

现成工具:tensorflow hub

在 tensorflow hub 中已经有现成的风格转换模型可以被免费调用了。

除了风格转换模型外,hub 中还包含了很多常见的模型,很强大很可怕!!

  • https://hub.tensorflow.google.cn/

我们将下面俩张图合成吧。

以下代码,除了图片路径需要修改,其他都是通用的:

content_path = tf.keras.utils.get_file('ebcf732904a54911be5967c5b072a8e4.jpeg', 'https://img-blog.csdnimg.cn/ebcf732904a54911be5967c5b072a8e4.jpg')
# 内容图
style_path = tf.keras.utils.get_file('b275d4b95c33488e93a829bb1e7da6c9.jpeg', 'https://img-blog.csdnimg.cn/b275d4b95c33488e93a829bb1e7da6c9.jpg')
# 风格图
import os
import tensorflow as tf
os.environ['TFHUB_MODEL_LOAD_FORMAT'] = 'COMPRESSED'
import IPython.display as display
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['figure.figsize'] = (12, 12)
mpl.rcParams['axes.grid'] = Falseimport numpy as np
import PIL.Image
import time
import functoolsdef load_img(path_to_img):max_dim = 512img = tf.io.read_file(path_to_img)img = tf.image.decode_image(img, channels=3)img = tf.image.convert_image_dtype(img, tf.float32)shape = tf.cast(tf.shape(img)[:-1], tf.float32)long_dim = max(shape)scale = max_dim / long_dimnew_shape = tf.cast(shape * scale, tf.int32)img = tf.image.resize(img, new_shape)img = img[tf.newaxis, :]return imgdef imshow(image, title=None):if len(image.shape) > 3:image = tf.squeeze(image, axis=0)plt.imshow(image)if title:plt.title(title)# 修改内容图、风格图地址即可
content_path = tf.keras.utils.get_file('ebcf732904a54911be5967c5b072a8e4.jpeg', 'https://img-blog.csdnimg.cn/ebcf732904a54911be5967c5b072a8e4.jpg')
style_path = tf.keras.utils.get_file('b275d4b95c33488e93a829bb1e7da6c9.jpeg', 'https://img-blog.csdnimg.cn/b275d4b95c33488e93a829bb1e7da6c9.jpg')content_image = load_img(content_path)
style_image = load_img(style_path)
plt.subplot(1, 2, 1)
imshow(content_image, 'Content Image')
plt.subplot(1, 2, 2)
imshow(style_image, 'Style Image')def tensor_to_image(tensor):tensor = tensor * 255tensor = np.array(tensor, dtype=np.uint8)if np.ndim(tensor) > 3:assert tensor.shape[0] == 1tensor = tensor[0]return PIL.Image.fromarray(tensor)import tensorflow_hub as hub
hub_model = hub.load('https://hub.tensorflow.google.cn/google/magenta/arbitrary-image-stylization-v1-256/2')
stylized_image = hub_model(tf.constant(content_image), tf.constant(style_image))[0]
tensor_to_image(stylized_image)

输出:

 


手工实现风格迁移

迁移学习其实就是利用已经训练好的模型来实现另一个任务,我们借用一个训练好了的 VGG-19 模型。

vgg = tf.keras.applications.VGG19(include_top=False, weights='imagenet')
# vgg就代表了一个训练好了的VGG19模型,include_top=False 代表不需要最后一层。风格转换不需要最后一层,最后一层是用来识别图片的。# 风格转换产生的图片既要有内容图片的内容又要有风格图片的风格
content_layers = ['block5_conv2'] 
# VGG 的 block5_conv2 层来生成最终图像的内容
style_layers = ['block1_conv1','block2_conv1','block3_conv1', 'block4_conv1', 'block5_conv1']
# VGG 的 block1_conv1,block2_conv1,block3_conv1,block4_conv1,block5_conv1 来生成最终图片的风格num_content_layers = len(content_layers)
num_style_layers = len(style_layers)# 创建一个自定义的模型,在输入vgg.input后(一张图片后),这个函数会返回上面定义的那些网络层的激活值,就能获取代表内容和风格的网络层的激活值
def vgg_layers(layer_names):vgg = tf.keras.applications.VGG19(include_top=False, weights='imagenet')vgg.trainable = Falseoutputs = [vgg.get_layer(name).output for name in layer_names]model = tf.keras.Model([vgg.input], outputs)return model# 将激活值矩阵转换成风格矩阵,将激活值矩阵转换成风格矩阵,然后才能通过对比风格矩阵来判断两张图片的风格是否相同
def gram_matrix(input_tensor):result = tf.linalg.einsum('bijc,bijd->bcd', input_tensor, input_tensor)input_shape = tf.shape(input_tensor)num_locations = tf.cast(input_shape[1]*input_shape[2], tf.float32)return result/(num_locations)# 这个类整合了上面那些工具函数,当将一张图片输入后,这个类会返回这个图片的内容激活值矩阵以及风格矩阵。
class StyleContentModel(tf.keras.models.Model):def __init__(self, style_layers, content_layers):super(StyleContentModel, self).__init__()self.vgg = vgg_layers(style_layers + content_layers)self.style_layers = style_layersself.content_layers = content_layersself.num_style_layers = len(style_layers)self.vgg.trainable = False def call(self, inputs):inputs = inputs*255.0preprocessed_input = tf.keras.applications.vgg19.preprocess_input(inputs)outputs = self.vgg(preprocessed_input)style_outputs, content_outputs = (outputs[:self.num_style_layers],outputs[self.num_style_layers:])style_outputs = [gram_matrix(style_output)for style_output in style_outputs]content_dict = {content_name: valuefor content_name, valuein zip(self.content_layers, content_outputs)}style_dict = {style_name: valuefor style_name, valuein zip(self.style_layers, style_outputs)}return {'content': content_dict, 'style': style_dict}extractor = StyleContentModel(style_layers, content_layers)
style_targets = extractor(style_image)['style']          
# 获取风格图片的风格矩阵
content_targets = extractor(content_image)['content'] 
# 获取内容图片的内容激活值矩阵
image = tf.Variable(content_image)
# 复制内容图片到image,后面会不断的根据content_image和style_image来改变image,时image的风格越来越像style_image# 一个工具函数,用来修剪图片的数值
def clip_0_1(image):return tf.clip_by_value(image, clip_value_min=0.0, clip_value_max=1.0)opt = tf.optimizers.Adam(learning_rate=0.02, beta_1=0.99, epsilon=1e-1)
style_weight = 1e-2  
# 可以通过这个值来控制风格化到什么程度
content_weight = 1e4
# 控制内容保留的程度# 损失函数,用这个函数来对比最终图片image与内容图片content_image风格图片style_image的差别,差别越大损失就越大。
# 当iamge的内容越来越像content_image,风格越来越像style_image,那么损失就会越来越小。
def style_content_loss(outputs):style_outputs = outputs['style']      # image当前的风格矩阵content_outputs = outputs['content']  # image当前的内容激活值矩阵# 计算风格损失style_loss = tf.add_n([tf.reduce_mean((style_outputs[name]-style_targets[name])**2) for name in style_outputs.keys()])# 计算内容损失style_loss *= style_weight / num_style_layerscontent_loss = tf.add_n([tf.reduce_mean((content_outputs[name]-content_targets[name])**2) for name in content_outputs.keys()])content_loss *= content_weight / num_content_layersloss = style_loss + content_lossreturn loss@tf.function()
def train_step(image):# tape会记录下前向传播的每一个步骤,后面好自动执行反向传播with tf.GradientTape() as tape:outputs = extractor(image) # 获取当前image的内容激活值矩阵和风格矩阵loss = style_content_loss(outputs) # 计算损失,即与内容图片content_image风格图片style_image的差距# 获取image相对于loss的梯度。这里的image就相当于w和b参数一样grad = tape.gradient(loss, image)# 使用梯度来改变image,也即是说image会变得越来越像content_image风格图片style_imageopt.apply_gradients([(grad, image)]) image.assign(clip_0_1(image))import time
start = time.time()epochs = 10
steps_per_epoch = 100# 只训练了三步,图片风格会稍稍变化
train_step(image)
train_step(image)
train_step(image)
tensor_to_image(image)'''
真正训练的话,是要很多步的。会花很长时间,以下代码电脑配置不好的可能要花几个小时
step = 0
for n in range(epochs):for m in range(steps_per_epoch):step += 1train_step(image)print(".", end='', flush=True)display.clear_output(wait=True)display.display(tensor_to_image(image))print("Train step: {}".format(step))end = time.time()
print("Total time: {:.1f}".format(end-start))
'''

输出:


从结果可以看出,图片已经有了一点点风格图片的感觉了。
 


我们对风格有失恭敬

风格,是一种非常人性化的东西,它的反义词是机械化。

同样一个笑话,或者一句特别经典的话,奥巴马说一遍可能效果就非常好,而你如果接下来照着他学一遍,那就完全不好使 —— 你就是机械化的模仿,你没有自己的个人风格。

说服别人,不能用写学术论文的方法,期待用一大堆数字图表去碾压别人,那样别人只会反感,当你是个机器人。

没人愿意听机器人的,人们喜欢有风格的人。

我喜欢你的风格 — 这简直就是对人最高级的评价。

得有自己的风格,甚至哲学。

任何时候都要真诚,不要模仿任何人,永远做最真实的自己 — 而且你也不必为此道歉。

如果你的真实自我是一个很怪异的人,那你就做这样一个很怪异的人。

我所喜欢的风格 — 惜字如金,一语惊人。

能打动别人,说服别人,的确是个本事。但是我们周围人写的文章里诗歌实在太多,中文世界里有太多感情充沛气势磅礴,而又言之无物的东西。

含金量高的书,第一言之有物,传达了独特的思想或感受,第二文字凝练,赋予了这些思想或感受以最简洁的形式。

所谓文字凝练,倒不在于刻意少写,而在于不管写多写少,都力求货真价实(站得住脚,而不是好看)。

这一要求见之于修辞,就是剪除一切可有可无的词句,达于文风的简洁。

由于惜墨如金,所以果然就落笔成金,字字都掷地有声。


http://chatgpt.dhexx.cn/article/3uR00yhT.shtml

相关文章

迁移网络的应用-图像风格迁移

图片风格迁移指的是将一个图片的风格转换到另一个图片中,如图所示: 原图片经过一系列的特征变换,具有了新的纹理特征,这就叫做风格迁移。 VGG网络 在实现风格迁移之前,需要先简单了解一下VGG网络(由于VGG…

图像风格迁移算法学习总结

目录 一、简要说明 二、具体实施步骤 2.1综述 2.2基本思路 2.3核心思路 2.4基本问题处理 三、代码的简要描述 四、成果展示 一、简要说明 本次学习的图像风格迁移算法是基于一个2015年由Gatys等人发表的文章A Neural Algorithm of Artistic Style_的一个代码复…

【数字图像处理】图像风格迁移

代码和实验报告下载:http://download.csdn.net/detail/jsgaobiao/9523313 【作业要求】 设计自己的算法完成一个附图所示的图像风格迁移算法(基于matlab的快速实现)(很可能用到,并且鼓励使用)基于频率域…

图像风格迁移 CycleGAN原理

CycleGAN是一种很方便使用的用于进行图像风格转换的模型。它的一大优势就在于不需要成对的数据集就可以进行训练。比如我们只需要随便一大堆真人图像和随便另一大堆动漫图像,就可以训练出这两类风格互相转换的模型。 CycleGAN进行风格转换的原理是这样的&#xff1a…

Python实现基于深度学习的图像风格迁移

目录 一、选题意义与背景介绍 3 1.1背景介绍 3 1.2选题意义 3 二、相关方法介绍 4 2.1纹理建模 4 2.2图像重建 4 2.3图像风格迁移 4 2.3.1基于在线图像优化的慢速图像风格化迁移算法 4 2.3.2基于离线模型优化的快速图像风格化迁移算法 5 2.4图像风格迁移效果评估 6 三、具体方法…

图片风格迁移

##将图片进行风格迁移,将第一幅图片的均值平均差换成第二幅图的均值平方差。第三张是生成的图片 from numpy.lib.type_check import _imag_dispatcher from builtins import print from os import pread import sys from PIL import Image,ImageStat import numpy …

图像风格迁移及代码实现

图像风格迁移其实非常好理解,就是将一张图像的“风格”(风格图像)迁移至另外一张图像(内容图像),但是这所谓的另外一张图像只是在“风格”上与之前有所不同,图像的“内容”仍要与之前相同。Luan…

(一)图像风格迁移

图像风格迁移即把图像A的风格和图像B的内容按照一定比例结合,输出具备图像A风格和图像B内容的图像C. [github传送门1]https://github.com/anishathalye/neural-style [github传送门2]https://github.com/Quanfita/Neural-Style/tree/master/examples 系列文章 (二)快速图像风格…

图像风格迁移与快速风格迁移的对比(感知损失)

最近一段时间要写数字图像处理的文献综述,《深度学习在图像风格迁移中的原理与应用综述》。只能感慨自己一时选题不审,导致期末火葬场啊…… 这个问题我纠结了一天,看了N多篇文献(全是英文的…),结果还是没…

图像风格迁移【老版】

深度学习目前为止最有用的东西是图像处理,我们可以用它在极早期判断癌症, 也可以用它在茫茫人海里寻找犯人,但是要我说你能写一个小程序取悦女朋友, 你就不一定能信, 这一招叫艺术风格变换,就是你点击一下&…

图像风格迁移-DSTN

样式传输的目的是从参考图像中再现具有样式的内容图像。现有的通用风格转换方法成功地以艺术或照片逼真的方式将任意风格传递给原始图像。然而,现有作品所定义的“任意风格”的范围由于其结构限制而在特定领域内受到限制。具体而言,根据预定义的目标域来…

学习笔记:图像风格迁移

所谓图像风格迁移,是指利用算法学习著名画作的风格,然后再把这种风格应用到另外一张图片上的技术。著名的国像处理应用Prisma是利用风格迁移技术,将普通用户的照片自动变换为具有艺术家的风格的图片。这篇文章会介绍这项技术背后的原理&#…

图像风格迁移实战

最近看了一些基于深度学习的Style Transfer, 也就是风格迁移相关的paper,感觉挺有意思的。 所谓风格迁移,其实就是提供一幅画(Reference style image),将任意一张照片转化成这个风格,并尽量保留原照的内容(Content)。之前比较火的…

Pytorch实现图像风格迁移(一)

图像风格迁移是图像纹理迁移研究的进一步拓展,可以理解为针对一张风格图像和一张内容图像,通过将风格图像的风格添加到内容图像上,从而对内容图像进行进一步创作,获得具有不同风格的目标图像。基于深度学习网络的图像风格迁移主要有三种类型,分别为固定风格固定内容的风格…

毕设 深度学习图像风格迁移 - opencv python

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这…

图像风格迁移

文章目录 前言一、传统的图像风格迁移(Traditional style transfer)1.1计算机图形学领域和计算机视觉领域(Computer Graphics&Computer Vision)1.2非真实感图形学(Non-photorealistic graphics)和纹理迁…

ARM SMMU的原理与IOMMU

首先放一个社区iommupatch的网址:https://lore.kernel.org/linux-iommu/ 1: arm smmu的原理 1.1: smmu 基本知识 如上图所示,smmu 的作用和mmu 类似,mmu作用是替cpu翻译页表将进程的虚拟地址转换成cpu可以识别的物理地址。同理,sm…

ARM SMMU学习笔记

1. 什么是SMMU? SMMU(system mmu),是I/O device与总线之间的地址转换桥。 它在系统的位置如下图: 它与mmu的功能类似,可以实现地址转换,内存属性转换,权限检查等功能。 2. 为什么需要SMMU? 了解…

SMMU架构手册之数据结构和转换流程(1)

SMMU使用内存中一组数据结构来放置转换数据。寄存器指向初始根结构STE的基地址。STE包含stage2转换表基地址指针,同时也指向stage1的配置结构,该配置结构包含转换表基指针。CD表示stage1转换,STE表示stage2转换。 因此SMMU使用两组明确的结构…

SMMU架构手册之数据结构和转换流程(2)

STE包含每个stream的配置: 是否使能来之设备的流量;是否是stage1转换;是否是stage2转换哪个数据结构定位到stage1的转换表 若使用stage1,STE使用域STE.S1ContextPtr来指示内存中的一个或多个CD的地址。 CD关联起streamID和stage1…