ArtCoder: An End-to-end Method for Generating Scanning-robust Stylized QR Codes-CVPR2021
二维码风格化论文阅读+风格迁移讲解
论文:
https://arxiv.org/abs/2011.07815
代码:
https://github.com/SwordHolderSH/ArtCoder
二维码的原理:
二维码原理
QR码基本结构
R码是一种基于Reed-Solomon(RS)编码规则的矩阵符号,由黑白方块模块组成,分为功能图案和编码区域。
-
功能图案:这些图案不用于编码数据,包括:
- 定位图案(Finder Patterns):三个相同的定位图案分别位于QR码的左上角、右上角和左下角,用于定位和确定QR码的方向。
- 分隔图案(Separator Patterns):用于分隔定位图案。
- 定时图案(Timing Patterns):用于确定QR码的大小。
- 对齐图案(Alignment Patterns):这些是可选的,用于微调QR码的对齐。可以被视为三个叠加的同心正方形,并且由5×5黑色模块、3×3白色模块和单个中央黑色模块构成。对齐图案的数量取决于QR码的版本。
-
编码区域:QR码的数据编码部分,分为:
- 信息模块(Message Modules):实际数据存储的地方。
- 填充模块(Padding Modules):用于填充QR码中未使用的空间。
- 奇偶校验模块(Parity Modules):用于错误校正,是RS编码的一部分。
-
RS编码块:一系列模块组成的块,使用Reed-Solomon编码对消息字符串进行编码,以进行错误检测和校正。
-
QR码的版本:QR码有40种不同大小,称为版本,遵循ISO标准。每个版本号对应QR码矩阵的特定大小:
- 版本1:21×21模块。
- 版本2:25×25模块。.
- …以此类推,每边增加4个模块,直到:
- 版本40:177×177模块。
论文
CONTRIBUTION
• 提出了一种新颖的端到端方法ArtCoder 来生成个性化、多样化且耐扫描的风格化QR 码。
• 提出采样模拟层(Sampling-Simulation layer)来提取QR 码的消息,并引入基于模块的代码丢失以保持风格化QR 码的扫描鲁棒性。
• 提出了一种竞争机制,以保证风格化二维码在扫描鲁棒性和视觉效果上的高质量。
• 风格化的二维码中的所有模块都更加隐形,并且与整个图像融合得很好。
RELATED WORKS
风格迁移
- 参数化
参数方法迭代更新初始图像,直到满足所需的全局统计数据。Gatys等人利用 CNN 和 Gram 矩阵的强大功能,开创了参数化 NST 方法。
- 非参数化
非参数方法使用简单的补丁表示,并通过最近邻搜索找到最相似的补丁。 非参数 NST 方法由 Li 等人首创。 他们使用马尔可夫随机场(MRF)重新表述风格迁移,即从风格图像中搜索神经补丁以匹配内容图像的结构。
在最初的NST模型中,损失函数用于指导图像风格迁移的过程,确保生成的图像既符合内容图像的内容也表示风格图像的风格。损失函数由两部分组成:内容损失(Content Loss)和风格损失(Style Loss)。下面是损失函数的具体公式以及各符号的含义:
-
内容损失(Content Loss):
L c o n t e n t ( p , x , l ) = 1 2 ∑ i , j ( F i j l − P i j l ) 2 L_{content}({p}, \mathbf{x}, l) = \frac{1}{2} \sum_{i,j} (F^{l}_{ij} - P^{l}_{ij})^2 Lcontent(p,x,l)=21i,j∑(Fijl−Pijl)2
- p p p:原始的内容图像。
- x x x:生成的图像,通过迭代优化以匹配内容和风格。
- l l l:CNN中的特定层级。
- F i j L F_{ij}^L FijL:在层l中,原始内容图像的特征表示(即滤波器在位置j的激活)。
-
P
i
j
L
P_{ij}^L
PijL:在层l中,生成图像的特征表示。
内容损失测量的是生成图像在特定层级上的特征表示与内容图像特征表示之间的差异。
-
风格损失(Style Loss):
E l = 1 4 N l 2 M l 2 ∑ i , j ( G i j l − A i j l ) 2 E_l = \frac{1}{4N^2_l M^2_l} \sum_{i,j} (G^{l}_{ij} - A^{l}_{ij})^2 El=4Nl2Ml21i,j∑(Gijl−Aijl)2
- A l A^l Al:原始风格图像在层l的Gram矩阵。
- G l G^l Gl:生成图像在层l的Gram矩阵。
- N l N^l Nl:层l中滤波器的数量。
-
M
l
M^l
Ml:层l中特征图的大小。
Gram矩阵的元素( G^{l}_{ij} )是滤波器响应之间的相关性度量,计算公式为:
G i j l = ∑ k F i k l F j k l G^{l}_{ij} = \sum_{k} F^{l}_{ik} F^{l}_{jk} Gijl=k∑FiklFjkl
风格损失测量的是生成图像在特定层级上的风格表示(即Gram矩阵)与风格图像的风格表示之间的差异。
-
总损失(Total Loss):
L t o t a l ( p , a , x ) = α L c o n t e n t ( p , x ) + β ∑ l = 0 L w l E l L_{total}(\mathbf{p}, \mathbf{a}, \mathbf{x}) = \alpha L_{content}(\mathbf{p}, \mathbf{x}) + \beta \sum_{l=0}^{L} w_l E_l Ltotal(p,a,x)=αLcontent(p,x)+βl=0∑LwlEl
- α α α:内容损失的权重。
- β β β:风格损失的权重。
- w w w:不同层级风格损失的权重。
- l l l:参与计算的CNN层级总数。
总损失是内容损失和风格损失的加权和,其中风格损失是所有层级风格损失的加权求和。通过最小化总损失,可以在保持内容的同时,使生成图像的风格与目标风格图像相匹配。
在风格迁移的过程中,通过梯度下降等优化算法调整生成图像x的像素值,从而最小化损失函数 L t o t a l L_{total} Ltotal。通过这种方式,生成的图像既保留了内容图像的视觉内容,又复现了风格图像的风格特征。
二维码的艺术化
-
模块变形Module-deformation
首先选择一个方形模块作为变形的基础,然后对这个方形模块进行一定的变形操作,比如缩小、拉伸、旋转等,使其形状发生改变。接着,在变形后的区域中插入另一幅图像,使其与原始图像融合在一起。通过这种方法,可以实现对图像的局部区域进行精细的处理,同时保持整体图像的连贯性和完整性。(代表工作:Visualead和 Halftone QR codes)
-
模块重组Module-reshuffle
基于模块重组的方法受到了开创性工作Qart代码的启发,该工作提出可以利用Gauss-Jordan Elimination Proce-dure来重新排列模块的位置,以满足混合图像的特征。(GJEP可以用来重新排列QR码的可控模块,而不会影响其扫描鲁棒性。这意味着通过这种方法重新排列后的QR码仍然可以被标准扫描器正确读取。)随后,为了提高QR码的视觉质量,后续工作设计了不同的策略来重新排列模块,利用不同的图像特征,例如感兴趣区域、中央显著性、全局灰度值等。在本文中,作者使用重排列后的QR码作为代码目标 M
-
NST-based method
Xu等人首先引入NST技术来生成风格化QR码,并提出SEE(Stylized aEsthEtic)QR码。(即首先通过NST模型对QR码进行风格化,然后通过后处理算法修复由风格化引起的所有错误模块) 他们的方法解决了风格迁移会损害扫描鲁棒性的问题,但是由风格化引起的错误模块通过后处理算法进行修复,这会产生无法与整个图像很好融合的干扰模块。(问题所在)
METHODS
整体架构
在视觉效果上,Q结合了 I s I_s Is的风格特征和 I c I_c Ic的语义内容; 就功能而言,任何标准 QR 码阅读器都可以扫描 Q 以显示消息 M。
Q = Ψ ( I s , I c , M ) Q=Ψ(Is, Ic,M) Q=Ψ(Is,Ic,M)
L t o t a l = λ 1 L s t y l e ( I s , Q ) + λ 2 L c o n t e n t ( I c , Q ) + λ 3 L c o d e ( M , Q ) L_{total} =λ_1L_{style}(Is, Q) + λ_2L_{content}(Ic, Q)+ λ_3L_{code}(M, Q) Ltotal=λ1Lstyle(Is,Q)+λ2Lcontent(Ic,Q)+λ3Lcode(M,Q)
-
L t o t a l , L c o n t e n t , L s t y l e , L c o d e L_{total},L_{content},L_{style},L_{code} Ltotal,Lcontent,Lstyle,Lcode:总损失,内容损失,风格损失,二维码损失
-
I s I_{s} Is:目标风格图像
-
I c I_{c} Ic:内容目标图像
-
M M M:生成的消息message
-
Q Q Q:风格化后的二维码
特征提取:
- 风格和内容特征:使用预训练的VGG-19神经网络来提取风格目标图像(Is)和内容目标图像(Ic)的特征。VGG-19网络在图像风格迁移领域广泛使用,能够捕捉到图像的层次结构特征。
- 二维码特征:通过提出的采样模拟层(Sampling-Simulation, SS层)来提取QR码的二维码特征。这一步骤模拟了QR码读取器的采样过程,以确保最终生成的美化QR码能够被正确扫描。
优化器迭代与错误处理:
- 在优化器的每次迭代中,虚拟二维码读取器 R Q R R_{QR} RQR 将读风格化后的二维码 Q 来区分所有错误和正确模块并纠正模块 。
- 对于第 k 个模块 M k M_k Mk,如果 M k M_k Mk 错误,我们控制激活映射 K 来激活the k-th sub-code-loss L c o d e M k {L_{code}^{M_k}} LcodeMk
- 对于第 k 个模块 M k M_k Mk,如果 M k M_k Mk 正确,那么激活图K会停用第k个子代码损失 L c o d e M k {L_{code}^{M_k}} LcodeMk
- 这样的处理优化其鲁棒性,但可能会损害表示 风格和内容(或者说
L
s
t
y
l
e
L_{style}
Lstyle和
L
c
o
n
t
e
n
t
L_{content}
Lcontent会尽力优化视觉质量)。
损失函数(参考风格迁移)
风格图像损失和内容图像损失和style stransfer里面提到的一样:
L s t y l e ( I s , Q ) = 1 C s H s W s ∥ G [ f s ( I s ) ] − G [ f s ( Q ) ] ∥ 2 2 L c o n t e n t ( I c , Q ) = 1 C c H c W c ∥ f c ( I c ) − f c ( Q ) ∥ 2 2 \mathcal{L}_{style}(I_{s},Q)=\frac{1}{C_{s}H_{s}W_{s}}\left\|G[f_{s}(I_{s})]-G[f_{s}(Q)]\right\|_{2}^{2}\\\mathcal{L}_{content}(I_{c},Q)=\frac{1}{C_{c}H_{c}W_{c}}\left\|f_{c}(I_{c})-f_{c}(Q)\right\|_{2}^{2} Lstyle(Is,Q)=CsHsWs1∥G[fs(Is)]−G[fs(Q)]∥22Lcontent(Ic,Q)=CcHcWc1∥fc(Ic)−fc(Q)∥22
- G G G:Gram矩阵
- f s f_s fs:是从预训练的VGG-19网络的第s层提取的特征图(featurevmap),s可以是relu1_2, relu2_2, relu3_3, relu4_3中的任意一层。
- C s , H s , W s C_s,H_s,W_s Cs,Hs,Ws:风格特征图的通道数、高度和宽度。
- C c , H c , W c C_c,H_c,W_c Cc,Hc,Wc:内容特征图的通道数、高度和宽度
-
f
c
f_c
fc:是从预训练的VGG-19网络的第c层提取的特征图,其中c通常是relu3_3层。
二维码对应的损失函数:
将每个模块 M k M_k Mk对应的子二维码损失汇总以得到总的二维码损失 L c o d e {L_{code}} Lcode。这个损失函数的目的是确保每个模块在视觉上的变化不会影响其在 QR 码读取器中的解码能力,从而保持 QR 码的扫描鲁棒性。数学表达式为:
L code = ∑ M k ∈ Q L code M k L_{\text{code}} = \sum_{M_k∈Q} L_{\text{code}}^{M_k} Lcode=Mk∈Q∑LcodeMk
- L c o d e L_{code} Lcode 是基于 QR 码 Q 中的每个模块 M k M_k Mk 设定的,总的二维码损失。
-
L
c
o
d
e
M
k
{L_{code}^{M_k}}
LcodeMk:对于 QR 码中的每个模块
M
k
M_k
Mk ,设置一个子代码损失
对于每个模块 𝑀𝑘,定义一个子代码损失 L c o d e M k {L_{code}^{M_k}} LcodeMk如下:
L code M k = K M k ∥ M M k − F M k ∥ 2 L_{\text{code}}^{M_k} = K_{M_k} \left\| M_{M_k} - F_{M_k} \right\|^2 LcodeMk=KMk∥MMk−FMk∥2
-
M
=
E
Q
R
(
M
e
s
s
a
g
e
)
M={E_{QR}}(Message)
M=EQR(Message):对于输入消息 Message, QR 码编码器
E
Q
R
{E_{QR}}
EQR 将 Message编码为一个二维码目标 M
- 在 E Q R {E_{QR}} EQR 编码过程中,这些模块的位置可能会被重新排列,以便更好地融入背景图像或设计中,遵循 I c I_c Ic的视觉特征
- 通过 E Q R {E_{QR}} EQR,可以生成一个既包含所需信息又具有美学特征的QR码,这样的QR码可以用于需要与特定设计或品牌风格相匹配的场合。
- M是一个 𝑚×𝑚矩阵,矩阵中的的 1 或 0 标记每个模块的理想颜色(0表示黑,1表示白)
- F F F:是由 Sampling-Simulation (SS) 层提取的特征图
- K K K: K K K 是由竞争机制计算的激活图, K M k K_{M_k} KMk用于激活子代码损失 L c o d e M k {L_{code}^{M_k}} LcodeMk(后面会讲到竞争机制)
-
M
M
K
M_{M_K}
MMK:
E
Q
R
{E_{QR}}
EQR这是第 𝑘 个模块的理想或目标二进制值
Sampling-Simulation layer
QR码的采样:
Google ZXing规定,QR码阅读器仅对QR码中每个模块的中心像素进行采样,然后对这些像素进行二值化(binary)和解码。前人提出靠近模块中心的像素有更高的概率被采样,采样概率遵从高斯分布
G M k ( i , j ) = 1 2 π σ 2 e − i 2 + j 2 2 σ 2 \mathcal{G}_{M_k}(i,j) = \frac{1}{2\pi\sigma^2} e^{-\frac{i^2 + j^2}{2\sigma^2}} GMk(i,j)=2πσ21e−2σ2i2+j2
- ( i , j ) (i,j) (i,j):模块 M k M_k Mk中像素的坐标,原点位于模块中心,
-
G
M
k
(
i
,
j
)
\mathcal{G}_{M_k}(i,j)
GMk(i,j):表示对像素(i,j)进行采样的概率
Sampling Simulation:
作者认为如果使用卷积层(conv layer)来模拟QR码阅读器的采样过程,就可以通过损失反向传播来控制QR码的鲁棒性。
- 二维码 Q:对于由 m×m 个大小为 a×a 的模块组成的已经风格化了的二维码
- l s s {l_{ss}} lss :卷积核,被设计为具有kernal为 a、步幅 a、填充 0,内核权重遵循高斯分布。
-
F
F
F:当我们将Q输入到
l
s
s
{l_{ss}}
lss时,内核会对Q的每个模块进行一次卷积,输出一个m×m的特征图
F
=
l
s
s
(
Q
)
F={l_{ss}}(Q)
F=lss(Q),表示Q的采样结果。特征图F中的每一位
F
M
k
{F}_{M_k}
FMk对应于 Q 中的模块 Mk,表示为:
F M k = ∑ ( i , j ) ∈ M k G M k ( i , j ) ⋅ Q M k ( i , j ) \mathcal{F}_{M_{k}}=\sum_{(i, j) \in M_{k}} \mathcal{G}_{M_{k}(i, j)} \cdot Q_{M_{k}(i, j)} FMk=(i,j)∈Mk∑GMk(i,j)⋅QMk(i,j)
竞争机制
竞争机制的目的:
- 通过控制激活图k, L c o d e L_{code} Lcode 试图使每个模块扫描具有鲁棒性,但可能会牺牲视觉质量
- 同时,
L
s
t
y
l
e
L_{style}
Lstyle和
L
c
o
n
t
e
n
t
L_{content}
Lcontent试图提高Q的视觉质量单科可能会损害扫描鲁棒性
激活图K的构建与迭代优化:
在每次迭代中,虚拟二维码阅读器 R Q R R_{QR} RQR读取Q以找出所有错误模块,然后构造激活图K,该激活图决定了哪些模块的代码损失需要被激活或停用,定义为
K M k = { 1 , if R Q R ( Q M k ) ⊕ M M k = 1 0 , if R Q R ( Q M k ) ⊕ M M k = 0 , \mathcal{K}_{M_k}=\begin{cases}1,\text{ if }\mathcal{R}_{QR}(Q_{M_k})\oplus\mathcal{M}_{M_k}=1\\0,\text{ if }\mathcal{R}_{QR}(Q_{M_k})\oplus\mathcal{M}_{M_k}=0\end{cases}, KMk={1, if RQR(QMk)⊕MMk=10, if RQR(QMk)⊕MMk=0,
- M M k M_{M_k} MMk:这个值是从输入消息Message通过美学 QR 码编码器 E Q R E_{QR} EQR编码得到的第k个子模块的理想值
- R Q R ( Q M k ) R_{QR}(Q_{M_k} ) RQR(QMk):是虚拟二维码阅读器 R Q R R_{QR} RQR:阅读风格化后的二维码Q的第k个模块 Q M k Q_{M_k} QMk:的读取结果。每个模块被非黑即白。这个矩阵代表了 QR 码的理想结构,即在没有任何视觉风格化干预的情况下,应该如何正确地显示和扫描。
-
Q
M
k
Q_{M_k}
QMk:这是这个值是由风格化函数
Ψ
Ψ
Ψ 生成的 QR 码中第 𝑘个模块的值.
- 如果一个模块 Q M k Q_{M_k} QMk是正确的(鲁棒的),那么 K M k = 0 , L c o d e M k = 0 , \mathcal{K}_{M_{k}}=0,\mathcal{L}_{code}^{M_{k}}=0, KMk=0,LcodeMk=0,,我们的模型将尽力优化 L v i s u a l = { L s t y l e , L c o n t e n t } L_{visual}=\{{L_{style}, L_{content} }\} Lvisual={Lstyle,Lcontent},改进风格和内容特征。
- 如果这些修改使
Q
M
k
Q_{M_k}
QMk 出错,则
K
M
k
←
1
\mathcal{K}_{M_{k}}\leftarrow1
KMk←1,同时
L
c
o
d
e
M
k
{L_{code}^{M_k}}
LcodeMk代码将被激活以优化
Q
M
k
Q_{M_k}
QMk的鲁棒性。
Virtual QR Code Reader
这个虚拟阅读器的设计是为了在优化过程中实时检测和调整QR码的可读性,从而确保生成的QR码既具有艺术风格又能被标准的QR码扫描设备有效识别。
采样与二值化:
QR码阅读器通常只采样每个模块中心的像素点,然后将这些采样到的彩色像素转换为灰度图并二值化(转换为黑白,0黑一白)以解码。
Q M k b = ξ ( Q M k , T ) = { 0 , if Q M k
-
M
=
E
Q
R
(
M
e
s
s
a
g
e
)
M={E_{QR}}(Message)
M=EQR(Message):对于输入消息 Message, QR 码编码器
E
Q
R
{E_{QR}}
EQR 将 Message编码为一个二维码目标 M
-
-
- 参数化