图解法求卷积

图解法求卷积,第1张

卷积在信号与系统理论分析中,应用于零状态响应的求解.对连续时间信号的卷积称为卷积积分,定义式为:f(t)=f1(t)*f2(t)! ∞ -∞ "f1 (!)f2 (t-!)d!, 对离散时间信号的卷积称为卷积和,定义式为:f(k)=f1(k)*f2(k)!∞ i=-∞#f1(i)*f2(k-i).如果是无限区 间定义的函数可直接用定义求解,有限区间定义的函数大多用图解法.卷积和也可以用图解法求解,但在操作上与卷积积分比较显得非常繁锁,而且容易出错.针对这个问题,我们需要找出图解法以外更为简单的算法http://wenkubaiducom/linkurl=1lpmDc5vcNVthwRUv7yfjBU6ck1XQDGKcPu-cHLSG36ZuvxdvKsA5c_hE9jlTAosn6nhN99pZNrb0OSWJAUi8aPCBugirBKGFkW_rxOtUia

图像处理基本概念——卷积,滤波,平滑

图像卷积:一种实现手段,可以说是数学在图像处理的一种延伸。

图像滤波:一种图像处理方法,来实现不同目的。

图像平滑:实际上就是低通滤波。

卷积这个概念,很早以前就学过,但是一直没有搞懂。教科书上通常会给出定义,给出很多性质,也会用实例和图形进行解释,但究竟为什么要这么设计,这么计算,背后的意义是什么,往往语焉不详。作为一个学物理出身的人,一个公式倘若倘若给不出结合实际的直观的通俗的解释(也就是背后的“物理”意义),就觉得少了点什么,觉得不是真的懂了。

教科书上一般定义函数  f, g  的卷积  f g(n)  如下:

连续形式:

离散形式:

并且也解释了,先对g函数进行翻转,相当于在数轴上把g函数从右边褶到左边去,也就是卷积的“卷”的由来。

然后再把g函数平移到n,在这个位置对两个函数的对应点相乘,然后相加,这个过程是卷积的“积”的过程。

这个只是从计算的方式上对公式进行了解释,从数学上讲无可挑剔,但进一步追问,为什么要先翻转再平移,这么设计有何用意?还是有点费解。

在知乎,已经很多的热心网友对卷积举了很多形象的例子进行了解释,如卷地毯、丢骰子、打耳光、存钱等等。读完觉得非常生动有趣,但过细想想,还是感觉有些地方还是没解释清楚,甚至可能还有瑕疵,或者还可以改进(这些后面我会做一些分析)。

带着问题想了两个晚上,终于觉得有些问题想通了,所以就写出来跟网友分享,共同学习提高。不对的地方欢迎评论拍砖。。。

明确一下,这篇文章主要想解释两个问题:

1 卷积这个名词是怎么解释?“卷”是什么意思?“积”又是什么意思?

2 卷积背后的意义是什么,该如何解释?

为了更好地理解这些问题,我们先给出两个典型的应用场景:

1 信号分析

一个输入信号 f(t) ,经过一个线性系统(其特征可以用单位冲击响应函数 g(t) 描述)以后,输出信号应该是什么?实际上通过卷积运算就可以得到输出信号。

2 图像处理

输入一幅图像 f(x,y) ,经过特定设计的卷积核 g(x,y) 进行卷积处理以后,输出图像将会得到模糊,边缘强化等各种效果。

对卷积这个名词的理解:所谓两个函数的卷积,本质上就是先将一个函数翻转,然后进行滑动叠加。

在连续情况下,叠加指的是对两个函数的乘积求积分,在离散情况下就是加权求和,为简单起见就统一称为叠加。

整体看来是这么个过程:

翻转——>滑动——>叠加——>滑动——>叠加——>滑动——>叠加

多次滑动得到的一系列叠加值,构成了卷积函数。

卷积的“卷”,指的的函数的翻转,从  g(t)  变成  g(-t)  的这个过程; 同时,“卷”还有滑动的意味在里面(吸取了网友李文清的建议)。如果把卷积翻译为“褶积”,那么这个“褶”字就只有翻转的含义了。

卷积的“积”,指的是积分/加权求和。

有些文章只强调滑动叠加求和,而没有说函数的翻转,我觉得是不全面的;有的文章对“卷”的理解其实是“积”,我觉得是张冠李戴。

对卷积的意义的理解:

1 从“积”的过程可以看到,我们得到的叠加值,是个全局的概念。以信号分析为例,卷积的结果是不仅跟当前时刻输入信号的响应值有关,也跟过去所有时刻输入信号的响应都有关系,考虑了对过去的所有输入的效果的累积。在图像处理的中,卷积处理的结果,其实就是把每个像素周边的,甚至是整个图像的像素都考虑进来,对当前像素进行某种加权处理。所以说,“积”是全局概念,或者说是一种“混合”,把两个函数在时间或者空间上进行混合。

2 那为什么要进行“卷”?直接相乘不好吗?我的理解,进行“卷”(翻转)的目的其实是施加一种约束,它指定了在“积”的时候以什么为参照。在信号分析的场景,它指定了在哪个特定时间点的前后进行“积”,在空间分析的场景,它指定了在哪个位置的周边进行累积处理。

下面举几个例子说明为什么要翻转,以及叠加求和的意义。

如下图所示,输入信号是  f(t)  ,是随时间变化的。系统响应函数是  g(t)  ,图中的响应函数是随时间指数下降的,它的物理意义是说:如果在  t =0 的时刻有一个输入,那么随着时间的流逝,这个输入将不断衰减。换言之,到了  t =T时刻,原来在  t =0 时刻的输入 f (0)的值将衰减为 f (0) g (T)。

考虑到信号是连续输入的,也就是说,每个时刻都有新的信号进来,所以,最终输出的是所有之前输入信号的累积效果。如下图所示,在T=10时刻,输出结果跟图中带标记的区域整体有关。其中,f(10)因为是刚输入的,所以其输出结果应该是f(10)g(0),而时刻t=9的输入f(9),只经过了1个时间单位的衰减,所以产生的输出应该是 f(9)g(1),如此类推,即图中虚线所描述的关系。这些对应点相乘然后累加,就是T=10时刻的输出信号值,这个结果也是f和g两个函数在T=10时刻的卷积值。

显然,上面的对应关系看上去比较难看,是拧着的,所以,我们把g函数对折一下,变成了g(-t),这样就好看一些了。看到了吗?这就是为什么卷积要“卷”,要翻转的原因,这是从它的物理意义中给出的。

上图虽然没有拧着,已经顺过来了,但看上去还有点错位,所以再进一步平移T个单位,就是下图。它就是本文开始给出的卷积定义的一种图形的表述:

所以,在以上计算T时刻的卷积时,要维持的约束就是: t+ (T-t) = T   。这种约束的意义,大家可以自己体会。

在本问题 如何通俗易懂地解释卷积?中排名第一的马同学在中举了一个很好的例子(下面的一些图摘自马同学的文章,在此表示感谢),用丢骰子说明了卷积的应用。

要解决的问题是:有两枚骰子,把它们都抛出去,两枚骰子点数加起来为4的概率是多少

分析一下,两枚骰子点数加起来为4的情况有三种情况:1+3=4, 2+2=4, 3+1=4

因此,两枚骰子点数加起来为4的概率为:

写成卷积的方式就是:

在这里我想进一步用上面的翻转滑动叠加的逻辑进行解释。

首先,因为两个骰子的点数和是4,为了满足这个约束条件,我们还是把函数 g 翻转一下,然后阴影区域上下对应的数相乘,然后累加,相当于求自变量为4的卷积值,如下图所示:

进一步,如此翻转以后,可以方便地进行推广去求两个骰子点数和为 n 时的概率,为f 和 g的卷积 fg(n),如下图所示:

由上图可以看到,函数 g 的滑动,带来的是点数和的增大。这个例子中对f和g的约束条件就是点数和,它也是卷积函数的自变量。有兴趣还可以算算,如果骰子的每个点数出现的概率是均等的,那么两个骰子的点数和n=7的时候,概率最大。

还是引用知乎问题 如何通俗易懂地解释卷积?中马同学的例子。图像可以表示为矩阵形式(下图摘自马同学的文章):

对图像的处理函数(如平滑,或者边缘提取),也可以用一个g矩阵来表示,如:

注意,我们在处理平面空间的问题,已经是二维函数了,相当于:

那么函数f和g的在(u,v)处的卷积该如何计算呢?

首先我们在原始图像矩阵中取出(u,v)处的矩阵:

然后将图像处理矩阵翻转(这个翻转有点意思,不是延x轴和y轴两个方向翻转,而是沿右上到左下的对角线翻转,这是为了凑后面的内积公式。),如下:

可对比下图:

计算卷积时,就可以用和的内积:

请注意,以上公式有一个特点,做乘法的两个对应变量a,b的下标之和都是(u,v),其目的是对这种加权求和进行一种约束。这也是为什么要将矩阵g进行翻转的原因。以上矩阵下标之所以那么写,并且进行了翻转,是为了让大家更清楚地看到跟卷积的关系。这样做的好处是便于推广,也便于理解其物理意义。实际在计算的时候,都是用翻转以后的矩阵,直接求矩阵内积就可以了。

以上计算的是(u,v)处的卷积,延x轴或者y轴滑动,就可以求出图像中各个位置的卷积,其输出结果是处理以后的图像(即经过平滑、边缘提取等各种处理的图像)。

再深入思考一下,在算图像卷积的时候,我们是直接在原始图像矩阵中取了(u,v)处的矩阵,为什么要取这个位置的矩阵,本质上其实是为了满足以上的约束。因为我们要算(u,v)处的卷积,而g矩阵是3x3的矩阵,要满足下标跟这个3x3矩阵的和是(u,v),只能是取原始图像中以(u,v)为中心的这个3x3矩阵,即图中的阴影区域的矩阵。

推而广之,如果如果g矩阵不是3x3,而是6x6,那我们就要在原始图像中取以(u,v)为中心的6x6矩阵进行计算。由此可见,这种卷积就是把原始图像中的相邻像素都考虑进来,进行混合。相邻的区域范围取决于g矩阵的维度,维度越大,涉及的周边像素越多。而矩阵的设计,则决定了这种混合输出的图像跟原始图像比,究竟是模糊了,还是更锐利了。

比如说,如下图像处理矩阵将使得图像变得更为平滑,显得更模糊,因为它联合周边像素进行了平均处理:

而如下图像处理矩阵将使得像素值变化明显的地方更为明显,强化边缘,而变化平缓的地方没有影响,达到提取边缘的目的:

5、对一些解释的不同意见

上面一些对卷积的形象解释,如知乎问题 卷积为什么叫「卷」积?中荆哲以及问题 如何通俗易懂地解释卷积?中马同学等人提出的如下比喻:

其实图中“卷”的方向,是沿该方向进行积分求和的方向,并无翻转之意。因此,这种解释,并没有完整描述卷积的含义,对“卷”的理解值得商榷。

6、一些参考资料

《数字信号处理(第二版)》程乾生,北京大学出版社

《信号与系统引论》 郑君里,应启珩,杨为理,高等教育出版社

卷积积分  分析数学中一种重要的运算。设f(x), g(x)是R1上的两个可积函数,作积分: 可以证明,关于几乎所有的x∈(-∞,∞) ,上述积分是存在的。这样,随着x的不同取值 ,这个积分就定义了一个新函数h(x),称为f与g的卷积,记为h(x)=(f g)(x)。容易验证,(f g)(x)=(g f)(x),并且(f g)(x)仍为可积函数。这就是说,把卷积代替乘法,L1(R1)1空间是一个代数,甚至是巴拿赫代数。 卷积与傅里叶变换有着密切的关系。以(x) ,(x)表示L1(R)1中f和g的傅里叶变换,那么有如下的关系成立:(f g)∧(x)=(x)·(x),即两函数的傅里叶变换的乘积等于它们卷积后的傅里叶变换。这个关系,使傅里叶分析中许多问题的处理得到简化。 由卷积得到的函数(f g)(x),一般要比f,g都光滑。特别当g为具有紧支集的光滑函数,f 为局部可积时,它们的卷积(f g)(x)也是光滑函数。利用这一性质,对于任意的可积函数 , 都可以简单地构造出一列逼近于f 的光滑函数列fs(x),这种方法称为函数的光滑化或正则化。 卷积的概念还可以推广到数列 、测度以及广义函数上去。  卷积积分的物理意义  在激励条件下,线性电路在t时刻的零状态响应=从激励函数开始作用的时刻(ξ=0)  到t时刻( ξ=t)的区间内,无穷多个强度不同的冲激响应的总和。  可见,冲激响应在卷积中占据核心地位。

卷积(Convolution)是一个应用非常广泛的函数间的数学运算,类似加、减、乘、除。之所以很多同学听到卷积二字就头皮发麻,是因为不熟悉,而且在日常生活中用的少。加、减、乘、除从小就学习,天天在使用,所以觉得简单、容易,亲切。

加、减、乘、除 用符号 +,-,×,÷,表示;同样,卷积用符号: 表示。

如上所述,卷积是两个函数之间的数学运算,假设有两个函数f(t), g(t),其卷积运算的结果也是函数,我们记做c(t),则:

c(t) = f(t)g(t) = (fg)(t)

注意:f(t)g(t)和(fg)(t)这两种写法,都是表示卷积运算,大家在学习一个数学运算的时候, 首先是要学习并熟悉其标记的含义 ,这跟学习加、减、乘、除一样。

卷积具体的计算是如何定义的呢?

两个函数f(t), g(t)是定义在实数范围内可积的函数,其卷积记作:fg,是其中一个函数翻转并平移后与另一个函数的乘积的积分,如下图所示:

咋一看,有点儿懂了,也有点儿没懂,不着急,接下来我们一步一步图解卷积运算的过程。

首先 ,已知两函数f(t)和g(t),如下图所示

然后 ,根据上述的卷积运算定义,把两个函数f(t)和g(t)自变量由t换为τ,并把其中一个函数,比如g(τ),向右移动t个单位,得到g(τ-t)。

接着 ,把右移t个单位的函数,以纵轴为中心,180°翻转(Flip),得到g(-(τ-t)),即g(t-τ),如下图所示:

这样,经过平移和翻转,我们得到了积分表达式中的f(τ)和g(t-τ)。

接下来 ,τ是自变量,对整个定义域,我们对f(τ)和g(t-τ)积分,如下图所示:

最后 ,完成f(τ)和g(t-τ)的积分运算后,就完成了两个函数f(t)和g(t)的卷积运算。

通过上述演示过程,大家可以把两个函数的卷积运算,简单记住为:“ 卷积就是平移翻转再积分 ”,其过程如下图所示:

若把g(t-τ)看作为是一个加权函数的话,卷积可以认为是对f(τ)取加权值的过程。

跟加、减、乘、除有交换律,结合律相似,卷积也有如下性质

卷积定理 指出,函数卷积的 傅里叶变换 是函数傅里叶变换的乘积。即,一个域中的卷积相当于另一个域中的乘积,例如 时域 中的卷积就对应于 频域 中的乘积。

这一定理对 拉普拉斯变换 、 双边拉普拉斯变换 、 Z变换 、 Mellin变换 和 Hartley变换 (参见 Mellin inversion theorem )等各种傅里叶变换的变体同样成立。利用卷积定理可以简化卷积的运算量。对于长度为 n 的序列,按照卷积的定义进行计算,需要做 2n-1 组对位乘法,其 计算复杂度 为O(n²);而利用 傅里叶变换 将序列变换到频域上后,只需要一组对位乘法,利用傅里叶变换的 快速算法 之后,总的计算复杂度为O(n·log(n))。卷积定理简化运算在工程实现中,经常使用。

卷积在科学、工程和数学上都有很多应用 :

代数 中,整数乘法和多项式乘法都是卷积。

图像处理 中,用作图像模糊、锐化、 边缘检测 。

统计学 中,加权的滑动平均是一种卷积。

概率论 中,两个统计独立变量X与Y的和的 概率密度函数 是X与Y的概率密度函数的卷积。

声学 中, 回声 可以用源声与一个反映各种反射效应的函数的卷积表示。

电子工程 与信号处理中,任一个线性系统的输出都可以通过将输入信号与系统函数(系统的 冲激响应 )做卷积获得。

物理学 中,任何一个线性系统(符合 叠加原理 )都存在卷积。

下一节将继续介绍《 AI数学基础27-离散卷积(Discrete convolution) 》

卷积在图像处理的应用中一般是卷积滤波,即用一个卷积模板(卷积核/滤波器)去进行滤波,而傅里叶变换在信号处理中往往是变换时域和频域,在图像处理中便是空域和频域。

图像处理(image processing),用计算机对图像进行分析,以达到所需结果的技术。又称影像处理。图像处理一般指数字图像处理。数字图像是指用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组,该数组的元素称为像素,其值称为灰度值。

常用方法

1 )图像变换

由于图像阵列很大,直接在空间域中进行处理,涉及计算量很大。因此,往往采用各种图像变换的方法,如傅立叶变换、沃尔什变换、离散余弦变换等间接处理技术,将空间域的处理转换为变换域处理,不仅可减少计算量,而且可获得更有效的处理。

2 )图像编码压缩

图像编码压缩技术可减少描述图像的数据量(即比特数),以便节省图像传输、处理时间和减少所占用的存储器容量。压缩可以在不失真的前提下获得,也可以在允许的失真条件下进行。编码是压缩技术中最重要的方法,它在图像处理技术中是发展最早且比较成熟的技术。

3 )图像增强和复原

图像增强和复原的目的是为了提高图像的质量,如去除噪声,提高图像的清晰度等。图像增强不考虑图像降质的原因,突出图像中所感兴趣的部分。图像复原要求对图像降质的原因有一定的了解,一般讲应根据降质过程建立“降质模型”,再采用某种滤波方法,恢复或重建原来的图像。

4 )图像分割

图像分割是数字图像处理中的关键技术之一。图像分割是将图像中有意义的特征部分提取出来,其有意义的特征有图像中的边缘、区域等,这是进一步进行图像识别、分析和理解的基础。虽然目前已研究出不少边缘提取、区域分割的方法,但还没有一种普遍适用于各种图像的有效方法。

按照上文中介绍的神经网络,如果处理一张的话,参数有多大呢?假设图像的大小为1200 1200,下一层的神经元个数为10^5,不难得出参数量为 1200 1200 10^5 = 144 10^12。可以看出一层的参数量就是很大了,如果再多加几层,那参数量大的应该是超出了内存的承受范围,这从研究和工程的角度都是不允许的。而且参数太多,很容易造成过拟合。

怎么解决这个问题呢?经过研究,从稀疏连接、参数共享和平移不变性三个方面来进行改进。

可能有些人不懂这种稀疏连接是怎么实现的?先来说说卷积操作,以一个二维矩阵为输入(可以看作是一个单通道的像素值),卷积产生的稀疏连接根本原因就是这块的核函数,一般的核函数的大小远小于输入的大小。

以下图例:卷积操作可以看做是一种滑窗法,首先,输入维度是4×4,输入中红色部分,先和核函数中的元素对应相乘,就是输出中左上角的元素值s1,即 s1 = a×k1+b×k2+e×k3+f×k4。

参数共享是指在一个模型的多个函数中使用相同的参数,它是卷积运算带来的固有属性。

在全连接中,计算每层的输出时,权重矩阵中的元素只作用于某一个输入元素一次;

而在卷积神经网络中,卷积核中的每一个元素将作用于每一个局部输入的特定位置上。根据参数共享的思想,我们只需要学习一组参数集合,而不需要针对每一个位置的每一个参数来进行优化学习,从而大大降低了模型的存储需求。

如果一个函数的输入做了一些改变,那么输出也跟着做出同样的改变,这就时平移不变性。

平移不变性是由参数共享的物理意义所得。在计算机视觉中,假如要识别一个中是否有一只猫,那么无论这只猫在的什么位置,我们都应该识别出来,即就是神经网络的输出对于平移不变性来说是等变的。

根据稀疏连接、参数共享和平移不变性三个思想,卷积核就应运而生了。看下图,有个直观的感受。

上图就是在一个通道上做的卷积,但现实中,一般是由3个通道构成(R\G\B),卷积核也由二维的平面生成了三维立体。具体的样子如下图:

如上图所示,Filter W0 即为卷积核,其大小为(3 3 3),每个33的二维平面会和的相应的通道进行卷积,3个通道的结果相加后加上统一的偏置b0,结果即为Output Volume 第一个通道的第一个位置的数。

从上图还可以看出 Input Volume 四周加了0,这个0叫做padding,一般是为了卷积划动的过程中包含原有的所有数;而多通道卷积核计算过程和卷积核计算过程,不太一样的是多通道卷积核计算过程每次滑2下,这个滑动的距离叫做步长-stride。

所以通过输入大小和卷积核大小,我们可以推断出最终的结果的大小。比如上图卷积核计算过程,输入大小为5 5,卷积核为3 3,那么卷积核在原图上每次滑动一格,横向滑3次,纵向也是3次,最终结果为 3 3。在多通道卷积核计算过程中,每次滑动为2格,横向滑3次,纵向也是3次,最终结果也为 33。可以推断出,最终大小的公式为:(输入大小 - 卷积核大小)/ 滑动步长。

在卷积核计算过程,可以看出经过卷积后的大小变小了,那能不能经过卷积计算且大小不变呢?这里,引出了 padding 的另一个作用,保证输入和输出的大小一致。比方输出的 55 加 padding,那么四周就被0围绕了,这时的输入大小就变为7 7, 再经过 3 3的卷积后,按照上边推断出的公式,可以得出 最终的大小为 5 5,这时与输入大小保持了一致。

池化层夹在连续的卷积层中间, 用于压缩数据和参数的量,减小过拟合。

简而言之,如果输入是图像的话,那么池化层的最主要作用就是压缩图像。

池化层用的方法有Max pooling 和 average pooling,而实际用的较多的是Max pooling。下图演示一下Max pooling。

对于每个2 2的窗口选出最大的数作为输出矩阵的相应元素的值,比如输入矩阵第一个2 2窗口中最大的数是1,那么输出矩阵的第一个元素就是1,如此类推。

全连接层的部分就是将之前的结果展平之后接到最基本的神经网络了。

根据上边的介绍,可以得出,卷积核的通道数目和输入的图像的通道数目是保持一致的,而输出的通道数目是和卷积核数目是一致的。这样参数量可以得出,假设输入的通道为5,卷积核大小为 3 3 ,输出的通道数目为10,那么参数量为:3 3 5 10,其中3 3 5是1个卷积核的参数个数,3 3 5 10 是 10个卷积核的参数个数,也就总共的参数个数。

在卷积中,滑动一次会经过多次的点乘,只经过一次的加法,所以加法的计算量可以忽略不计。其中,滑动一次会的点乘次数和卷积核的大小有关系,比方 3 3的卷积,则是经过了 3 3 = 9次点积。一共滑动多少次和输出大小有关系,比方 输出的结果也为 3 3,那么就是滑动了9次。这样就可以得出输入和输出单通道时计算量 3 3 3 3 = 81。那么对于输入多通道时,卷积核也需要增加相应的通道数目,此时应该在刚才的计算量上乘以通道的数目,得出输入多通道的一个卷积核的计算量。这样,对于输出多通道,总的计算量则是乘以多个卷积核即可。

数学中的卷积和卷积神经网络中的卷积严格意义上是两种不同的运算

公式为

如图1所示,a矩阵是 的矩阵,a矩阵经过数学卷积运算后得到c矩阵。现在我们计算 处的值,c矩阵其他值的计算方式与 一致。

根据公式(1),可得到 的计算过程如图2,抽象为公式为

会发现图2的计算过程就是图3中颜色相同的块相乘,并求和的过程。

总之, 和 卷积的过程是,卷积核 绕中心点旋转180度,然后与 对应位置相乘并求和

我们以“丢骰子为例”,使用单个下标的离散卷积,公式为

。我们投掷两颗骰子,求解两颗骰子点数为4的概率,则

那么,两枚骰子点数加起来为4的情况有:

因此,两枚骰子点数加起来为4的概率为:

符合卷积的定义,把它写成标准的形式就是:

本质上就是卷积核与局部区域对应位置相乘并求和,或者为的局部区域像素值加权求和,其中权值就是卷积核心。

这两种操作,很容易通过设计特定的“卷积核”,然后将其与像素矩阵的对应像素(不进行旋转)相乘得到

举例说明

我们对下述的图像进行平滑滤波和边缘提取处理

使用下面的卷积核,就可以得到预期的效果

实现原理:

哪位高手能解释一下卷积神经网络的卷积核?

欢迎分享,转载请注明来源:浪漫分享网

原文地址:https://hunlipic.com/qinggan/4132947.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-08-21
下一篇2023-08-21

发表评论

登录后才能评论

评论列表(0条)

    保存