隐写邮票:物理照片中不可见的超链接
目标,愿景
? 我们的愿景是,在未来,现实世界中的每一张照片都无形地编码了一个指向任意信息的独特超链接。用照相机对着照片就可以获得这些信息,并且通过本文描述的系统去解码和追踪超链接。在未来,增强现实(AR)系统可能会持续执行这项任务,在用户的视图中,可视化地将检索到的信息与每张照片叠加在一起。
? 我们的方法与无处不在的QR码和类似技术有关,这些技术如今已广泛用于各种数据传输任务,例如共享网址,购买商品和跟踪库存。我们的方法可以看作是一种补充解决方案,可以避免可见的,难看的条形码,并使数字信息变得不可见,在现代视觉世界的无处不在的意象中,轻松惬意地嵌入。
流程
(图1:我们的深度学习系统经过训练,可以隐藏图像中的超链接。 首先,编码器网络将输入图像和超链接位串处理为StegaStamp(编码图像)。 然后将StegaStamp打印并通过相机捕获。 在将StegaStamp传递到解码器网络之前,它会对其进行局部化和纠正。 在恢复位并纠正错误后,用户可以发现超链接。 为了训练编码器和解码器网络,我们使用一系列不同的图像增强手段来模拟打印,重新成像和检测StegaStamp导致的损坏。)
图一在一个典型流程图中展示了我们的系统概括,我们称之为StegaStamp。
输入是一张图片和一个所需的超链接。
第一步,我们为超链接分配一个唯一的位字符串(bit string)(类似于tinyurl.com等url缩短服务使用的过程)。
第二步,我们使用我们的StegaStamp编码器将位字符串嵌入进目标图片中。这将产生一个编码图像,在理想情况下在视觉上与输入图像相同。如同第四部分描述的细节,我们的编码器被实现为一个深度神经网络,它与第二个网络共同训练,第二个网络实现了解码。
第三步,编码后的图像是物理打印的(或显示在电子显示屏上),并在现实世界中显示。
第四步,用户拍摄包含实体打印的照片。
第五步,系统使用一个图像检测器来识别和裁剪所有的图像。
第六步,每一张图片都由StegaStamp解码器进行处理,以检索唯一的位串,该位串用于追踪超链接并且接收与图片相关的信息。
针对现实世界进行的鲁棒性训练
3.1透视变换
? 假设一个针孔相机模型,同一平面的任意两幅图像可以通过单应性相关联。我们生成随机单应性以模拟与编码的图像标记未精确对准的相机的影响。为了对单应性进行采样,我们在固定范围内(最大±40像素,即±10%)均匀地扰动标记的四个角位置,然后求解将原始角映射到其新位置的单应性。 我们对原始图像进行双线性重采样以创建透视变形的图像。
单应性:
? 平面上某点P,在世界坐标系下和图像坐标系下的坐标分别表示为M和m,则
s m ~ = A [ R , t ] M ~ s\widetilde{m}=A[R,t]\widetilde{M} sm
=A[R,t]M
? 其中,s为尺度因子,A为内参矩阵,R,t统称为外参矩阵,将其展开如下:
s [ u v 1 ] = A [ r 1 r 2 r 3 t ] [ X Y Z 1 ] s\begin{bmatrix} u\\ v\\ 1\end{bmatrix}=A\begin{bmatrix} r_1 & r_2 & r_3 &t \end{bmatrix}\begin{bmatrix} X\\ Y\\ Z\\ 1 \end{bmatrix} s???uv1????=A[r1??r2??r3??t?]?????XYZ1??????
? 由于在同一平面下,令z=0:
s [ u v 1 ] = A [ r 1 r 2 r 3 t ] [ X Y 0 1 ] = A [ r 1 r 2 t ] [ X Y 1 ] s\begin{bmatrix} u\\ v\\ 1\end{bmatrix}=A\begin{bmatrix} r_1 & r_2 & r_3 &t \end{bmatrix}\begin{bmatrix} X\\ Y\\ 0\\ 1 \end{bmatrix}=A\begin{bmatrix} r_1 & r_2 &t \end{bmatrix}\begin{bmatrix} X\\ Y\\ 1 \end{bmatrix} s???uv1????=A[r1??r2??r3??t?]?????XY01??????=A[r1??r2??t?]???XY1????
使 H = A [ r 1 r 2 t ] H=A\begin{bmatrix}r_1& r_2 &t\end{bmatrix} H=A[r1??r2??t?],则H为单应性矩阵, s m ~ = H M ~ s\widetilde{m}=H\widetilde{M} sm
=HM
最少根据四个点,建立8个方程。
单应性变换:
? 如下图所示的平面的两幅图像。红点表示两幅图像中的相同物理点,我们称之为对应点。这里显示了四种不同颜色的四个对应点 - 红色,绿色,黄色和橙色。 一个Homography是一个变换(3×3矩阵),将一个图像中的点映射到另一个图像中的对应点。单应性变换其实就是一个平面到另一个平面的变换关系。
放射变换
? 仿射变换是一种二维坐标到二维坐标之间的线性变换(相同平面),它保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变),但是角度会改变。任意的仿射变换都能表示为乘以一个矩阵(线性变换),再加上一个向量 (平移) 的形式。
[ x ′ y ′ z ′ ] = [ a 11 a 12 a 13 a 21 a 22 a 23 0 0 1 ] [ x y z ] \begin{bmatrix}x^{'} \\ y^{'} \\z^{'}\end{bmatrix}=\begin{bmatrix}a_{11} \quad a_{12} \quad a_{13}\\a_{21} \quad a_{22} \quad a_{23} \\ 0 \quad 0 \quad 1 \end{bmatrix}\begin{bmatrix}x \\ y \\z\end{bmatrix} ???x′y′z′????=???a11?a12?a13?a21?a22?a23?001???????xyz????
透视变换
? 透视变换是将图片投影到一个新的视平面,也称作投影映射.它是二维(x,y)到三维(X,Y,Z),再到另一个二维(x′,y′)(x′,y′)空间的映射.相对于仿射变换,它提供了更大的灵活性,将一个四边形区域映射到另一个四边形区域(不一定是平行四边形).它不止是线性变换.但也是通过矩阵乘法实现的,使用的是一个3x3的矩阵,矩阵的前两行与仿射矩阵相似(m11,m12,m13,m21,m22,m23)(m11,m12,m13,m21,m22,m23),也实现了线性变换和平移,第三行用于实现透视变换.
以上公式设变换之前的点是z值为1的点,它三维平面上的值是x,y,1,在二维平面上的投影是x,y,通过矩阵变换成三维中的点X,Y,Z,再通过除以三维中Z轴的值,转换成二维中的点x’,y’.
从以上公式可知,仿射变换是透视变换的一种特殊情况.它把二维转到三维,变换后,再转映射回之前的二维空间
3.2运动和散焦模糊
? 相机运动和不正确的自动对焦都可能导致模糊。为了模拟运动模糊,我们对一个随机角度进行采样并生成宽度在3到7个像素之间的线性模糊kernel。为了模拟失焦,我们使用高斯模糊kernel,其标准偏差在1到3个像素之间随机采样。
3.3色彩处理
? 与完整的RGB颜色空间相比,打印机和显示器的色域有限。相机使用曝光设置,白平衡和色彩校正矩阵来修改其输出。我们通过一系列随机仿射颜色变换(在整个图像中恒定)来近似这些扰动,如下所示:
? 1.颜色偏移:向从[-0.1,0.1]均匀采样的每个RGB通道添加随机颜色偏移
? 2.去饱和(去色):在整个RGB图像及其灰度等效图像之间随机线性插值。
? 3.亮度与对比度:仿射直方图缩放 m x + b m ? U [ 0.5 , 1.5 ] , b ? U [ ? 0.3 , 0.3 ] mx+b \quad m \thicksim U[0.5,1.5],\quad b\thicksim U[-0.3,0.3] mx+bm?U[0.5,1.5],b?U[?0.3,0.3]
(改变亮度或者对比度一般通过: g ( x , y ) = a ? f ( x , y ) + b g(x,y) = a*f(x,y)+b g(x,y)=a?f(x,y)+b)
3.4噪声
? 照相机系统引入的噪声已得到充分研究,包括光子噪声,暗噪声和散粒噪声。 假设标准的非光子匮乏的成像条件,采用高斯噪声模型(对标准偏差σ?U [0,0.2]进行采样)来解决成像噪声。
3.5JPEG压缩
? 相机图像通常以有损格式存储(例如JPEG)。JPEG通过计算图像中每个8×8块的离散余弦变换并通过舍入到最接近的整数(在不同频率下具有不同强度)来量化所得系数来压缩图像。此舍入步骤不可微分,因此我们使用Shin和Song [40]的技巧,通过分段函数近似接近零的量化步长:
应用细节
4.1Encoder
? 编码器经过训练,可以将消息嵌入到图像中,同时最小化输入和编码图像之间的感知差异。我们使用U-Net 样式的体系结构,该体系结构接收四通道400×400像素的输入(输入图像RGB通道加上一条消息),并输出三通道RGB残留图像。输入消息以100位二进制字符串表示,通过全连接层进行处理以形成一个50×50×3的tensor,然后上采样生成一个400×400×3的tensor
U-net流程:
1.对于input进行conv+relu,横向进行crop+copy,纵向进行maxpooling
2.纵向向下重复1,直到U型底部,停止纵向maxpooling,横向conv之后进行upsample(方式是反卷积)
3.upsample后的结果与上一层的crop+copy的结果进行**拼接(channel维度拼在一起)**得到更“厚”的特征
4.纵向向上重复3,最后得到特征图并进行softmax语意分割进行output
4.2decoder
解码器经过训练可以从编码图像中恢复隐藏消息。一个STN网络是捕获和矫正编码的图像时以应对小的角度变化来保证图像的鲁棒性而引入的。转换后的图像通过一系列卷积和一个sigmoid激活,以产生与消息长度相同的最终输出。decoder使用交叉熵loss监督训练。
STN的目标或者用途:
结构:
三部分组成:参数预测:Localisation net、坐标映射:Grid generator、像素的采集:Sampler。
STN作用:
该过程可以由6个参数控制。
参数预测
(针对于坐标而言)所有操作用6个参数就可以完成,所以可以把特征图作为输入U,经过连续若干层的计算(譬如卷积),回归出参数 Θ \Theta Θ,用于下一步计算;
坐标映射
( x i t , y i t ) (x_i^t,y_i^t) (xit?,yit?)是输出的目标图片的坐标, ( x i s , y i s ) (x_i^s,y_i^s) (xis?,yis?)是原图片的坐标,Aθ表示仿射关系。
像素的采集
由于在第二步计算出了V中每个点对应到U的坐标点,在这一步就可以直接根据V的坐标点取得对应到U中坐标点的像素值来进行填充,而不需要经过矩阵运算。需要注意的是,填充并不是直接填充,首先计算出来的坐标可能是小数,要处理一下,其次填充的时候往往要考虑周围的其它像素值。填充根据的公式如下。
V i = ∑ n ∑ m U n m ? k ( x i s ? m ; ? x ) ? k ( y i s ? n ; ? y ) V_{i}=\sum _n \sum _m U_{nm}*k(x_{i}^{s}-m;\phi _x)*k(y_{i}^{s}-n;\phi _y) Vi?=n∑?m∑?Unm??k(xis??m;?x?)?k(yis??n;?y?)
其中n和m会遍历原图U的所有坐标点,Unm指原图U中某个点的像素值,k()为取样核,两个 ? \phi ?为参数, ( x i s , y i s ) (x^s_i,y^s_i) (xis?,yis?)表示V中第i个点要到U图中找的对应点的坐标,表示的坐标是U图上的,k表示使用不同的方法来填充,通常会使用双线性插值,则会得到下面的公式(作者给出的):
V i = ∑ n ∑ m U n m ? m a x ( 0 , 1 ? ∣ x i s ? m ∣ ) ? m a x ( 0 , 1 ? ∣ y i s ? n ∣ ) V_{i}=\sum _n \sum _m U_{nm}*max(0, 1 - |x_{i}^{s}-m|)*max(0, 1 - |y_{i}^{s}-n|) Vi?=n∑?m∑?Unm??max(0,1?∣xis??m∣)?max(0,1?∣yis??n∣)
整理后: f ( i + u , j + v ) = ( 1 ? u ) ( 1 ? v ) f ( i , j ) + ( 1 ? u ) v f ( i , j + 1 ) + u ( 1 ? v ) f ( i + 1 , j ) + u v f ( i + 1 , j + 1 ) f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1) f(i+u,j+v)=(1?u)(1?v)f(i,j)+(1?u)vf(i,j+1)+u(1?v)f(i+1,j)+uvf(i+1,j+1)
譬如:
计算公式为 f ( 1 + 0.6 , 2 + 0.4 ) = ( 1 ? 0.6 ) ( 1 ? 0.4 ) f ( 1 , 2 ) + ( 1 ? 0.6 ) 0.4 f ( 1 , 3 ) + 0.6 ( 1 ? 0.4 ) f ( 2 , 2 ) + 0.60.4 f ( 2 , 3 ) f(1+0.6,2+0.4) = (1-0.6) (1-0.4) f(1,2) + (1-0.6) 0.4 f(1,3) + 0.6 (1-0.4) f(2,2) + 0.6 0.4 f(2,3) f(1+0.6,2+0.4)=(1?0.6)(1?0.4)f(1,2)+(1?0.6)0.4f(1,3)+0.6(1?0.4)f(2,2)+0.60.4f(2,3)
总而言之,STN的加入是想要提高卷积神经网络空间不变性。
4.3detector
? 现实使用的时候,在解码之前我们是从一个大视野去检测和修正StegaStamps,因为单独的解码器没有设计为处理更大图像的全部检测。我们微调一个现成的语意分割网络BiSeNet去分割包含StegaStamps的图片区域。这个网络用一个这样的数据集训练:从DIV2K中sample高分辨率图片,并对这些图片随机进行StegaStamps嵌入转换。在测试的时候,我们把四边形拟合到每个网络建议区域的凸包上,然后计算单应性以将每个四边形扭曲回到400×400像素的图像,以供解码器进行解析。
在语义分割任务中,空间分辨率和感受野很难两全。
Spatial Path:尤其是在实时语义分割的情况下,现有方法通常是利用小的输入图像或者轻量主干模型实现加速。但是小图像相较于原图像缺失了很多空间信息,而轻量级模型则由于裁剪通道而损害了空间信息。
? 其包含三层,每层包含一个步幅(stride)为 2 的卷积(conv),随后是批归一化(Batch Nornalization)和 ReLU。因此,该路网络提取相当于原图像 1/8 的输出特征图。由于它利用了较大尺度的特征图,所以可以编码比较丰富的空间信息。
Context Path:在语义分割任务中,感受野对于性能表现至关重要。为增大感受野,譬如 large kernel,这种操作会增大计算量和内存的耗费,速度慢。
? ContextPath利用轻量级模型与全局平均池化以提供大感受野。比如 Xception(Inception改进),可以快速下采样特征图以获得大感受野,编码高层语义语境信息。接着,本文在轻量级模型末端添加一个全局平均池化,通过全局语境信息提供一个最大感受野。在轻量级模型中,该模型借助 U 形结构融合最后两个阶段的特征,但这不是一个完整的 U 形结构。
注意力优化模块ARM:这篇文章提出一个注意力优化模块,以优化每一阶段的特征。通过全局平均池化捕获全局语境,计算注意力向量,可以用来优化 Context Path 中每一阶段的输出特征,便于整合全局语境信息,降低计算成本。
特征融合模块FFM:Spatial Path 捕获的空间信息编码了绝大多数的丰富细节信息,Context Path 的输出特征主要编码语境信息。两路网络的特征并不相同,因此不能简单地加权两种特征,要用一个独特的特征融合模块以融合这些特征。
简单来说就是两个路径的特征图直接叠加不合适,就去设置一个网络,训练学习一下两部分如何叠加。
4.4 Encoder/Decoder Training Procedure
Critic:使用一个critic网络预测信息是否被嵌入图片中,并且作为总loss的一部分,这一部分的loss被称作编码解码过程的感知loss。该网络由一系列卷积层+最大池化组成。为了训练critic,对输入图像和编码图像进行分类,并将Wassersteinloss 用作监督信号。critic的训练与编码器/解码器的训练交织在一起。
Losses:为了在编码的StegaStamp上实现最小的感知失真,使用 L 2 L_2 L2? 残差正则化 L R L_R LR?,感知loss L P L_P LP?,用 L C L_C LC?计算编码图像和原始图像critic loss,cross entropy loss 计算message,最后总loss(想法应当是前面3个loss计算编码图像和原始图像,最后一个计算message的正误)
L = λ R L R + λ P L P + λ C L C + λ M L M L=\lambda_RL_R+\lambda_PL_P+\lambda_CL_C+\lambda_ML_M L=λR?LR?+λP?LP?+λC?LC?+λM?LM?
L P L_P LP?loss:
? Wasserstein距离:
W ( P r , P g ) = inf ? γ ? Π ( P r , P g ) E ( x , y ) ? γ [ ∣ ∣ x ? y ∣ ∣ ] W(P_r, P_g) = \inf_{\gamma \sim \Pi (P_r, P_g)} \mathbb{E}_{(x, y) \sim \gamma} [||x - y||] W(Pr?,Pg?)=γ?Π(Pr?,Pg?)inf?E(x,y)?γ?[∣∣x?y∣∣]
解释如下: ∏ ( P r , P g ) 是 P r 和 P g \prod(P_r,P_g)是P_r和P_g ∏(Pr?,Pg?)是Pr?和Pg?组合起来的所有联合分布的集合,反过来说, ∏ ( P r , P g ) \prod(P_r,P_g) ∏(Pr?,Pg?)中每一个分布的边缘分布都是 P r 和 P g P_r和P_g Pr?和Pg?。对于每一个可能的联合分布 γ \gamma γ而言,可以从中采样 ( x , y ) ? γ (x,y)\sim \gamma (x,y)?γ得到一个真实样本x和一个生成样本y,并算出这对样本的距离 ∣ ∣ x ? y ∣ ∣ ||x-y|| ∣∣x?y∣∣,所以可以计算该联合分布 γ \gamma γ下样本对距离的期望值 E ( x , y ) ? γ [ ∣ ∣ x ? y ∣ ∣ ] E_{(x,y)\sim \gamma}[||x-y||] E(x,y)?γ?[∣∣x?y∣∣],在所有可能的联合分布中能够对这个期望值取到的下界就定义为Wasserstein距离。
由于inf没办法直接求解,所以作者做了一个变换:
W ( P r , P g ) = 1 K sup ? ∣ ∣ f ∣ ∣ L ≤ K E x ? P r [ f ( x ) ] ? E x ? P g [ f ( x ) ] W(P_r, P_g) = \frac{1}{K} \sup_{||f||_L \leq K} \mathbb{E}_{x \sim P_r} [f(x)] - \mathbb{E}_{x \sim P_g} [f(x)] W(Pr?,Pg?)=K1?∣∣f∣∣L?≤Ksup?Ex?Pr??[f(x)]?Ex?Pg??[f(x)]
这个公式的意思是要求函数f的Lipschitz常数 ∣ ∣ f ∣ ∣ L ||f||_L ∣∣f∣∣L?在不超过K的条件下,对所有可能满足条件的f取到 E x ? P r [ f ( x ) ] ? E x ? P g [ f ( x ) ] \mathbb{E}_{x \sim P_r} [f(x)] - \mathbb{E}_{x \sim P_g} [f(x)] Ex?Pr??[f(x)]?Ex?Pg??[f(x)]的上界,然后再除以K。特别的,我们可以用一组参数 ω \omega ω来定义一系列可能的函数 f ω f_{\omega} fω?,此时求解公式可以近似变成下式:
K ? W ( P r , P g ) ≈ max ? w : ∣ f w ∣ L ≤ K E x ? P r [ f w ( x ) ] ? E x ? P g [ f w ( x ) ] K \cdot W(P_r, P_g) \approx \max_{w: |f_w|_L \leq K} \mathbb{E}_{x \sim P_r} [f_w(x)] - \mathbb{E}_{x \sim P_g} [f_w(x)] K?W(Pr?,Pg?)≈w:∣fw?∣L?≤Kmax?Ex?Pr??[fw?(x)]?Ex?Pg??[fw?(x)]
对于深度学习来说就可以把f用一个带参数的 ω \omega ω的神经网络来表示,去计算这个距离。并且对于学习的过程来说,虽然有 ∣ ∣ f ∣ ∣ L < K ||f||_L<K ∣∣f∣∣L?<K这个限制,但其实并不关心K具体是多少,只要不是正无穷就可以,因为他只会影响梯度的倍数,不会影响方向。(作者采取一个做法是限制神经网络f的所有参数 ω \omega ω不会超过某个范围[-c,c]比如[-0.01,0.01],那么此时关于输入样本的导数 ? f ω ? x \frac{\partial f_{\omega}}{\partial x} ?x?fω??也不会超过某个范围,所以这样的K就能找到,算法实现中每次更新完 ω \omega ω把它clip回这个范围就行了)
这样就可以去构造一个含参数 ω \omega ω,最后一层不是非线性激活的判别器网络 f ω f_{\omega} fω? ,在限制 ω \omega ω不超过某个范围的条件下使得:
L = E x ? P r [ f w ( x ) ] ? E x ? P g [ f w ( x ) ] L= \mathbb{E}_{x \sim P_r} [f_w(x)] - \mathbb{E}_{x \sim P_g} [f_w(x)] L=Ex?Pr??[fw?(x)]?Ex?Pg??[fw?(x)]
么此时关于输入样本的导数 ? f ω ? x \frac{\partial f_{\omega}}{\partial x} ?x?fω??也不会超过某个范围,所以这样的K就能找到,算法实现中每次更新完 ω \omega ω把它clip回这个范围就行了)
这样就可以去构造一个含参数 ω \omega ω,最后一层不是非线性激活的判别器网络 f ω f_{\omega} fω? ,在限制 ω \omega ω不超过某个范围的条件下使得:
L = E x ? P r [ f w ( x ) ] ? E x ? P g [ f w ( x ) ] L= \mathbb{E}_{x \sim P_r} [f_w(x)] - \mathbb{E}_{x \sim P_g} [f_w(x)] L=Ex?Pr??[fw?(x)]?Ex?Pg??[fw?(x)]
尽可能最大,L就会近似真实分布与生成分布之间的Wasserstein距离。
这篇文章没有提出新的模型或者概念或者技巧,这里我也只是根据文章里用到的模型以及结构去学习了一下,最后根据我看的博客等内容总结了一下该文使用的模型以及结构,最后的感知loss其实比较复杂,建议多多研究,第一次发文,如有错误,麻烦指正。