Efficient Inference in Fully Connected CRFs with Gaussian Edge Potentials
Intro
回顾一下经典,文章是早期像素级分类做分割效果不好的情况下,利用条件随机场建模,解决细节分割问题的一篇文章,文章主要贡献是提出了Mean Field Approximation来近似原来的全连接条件随机场,同时提出一个Efficient算法将整个更新过程变为线性时间。
Why use CRF
在早期分割领域,像素级分类直接分割的效果并不好,当时并没有太多的结构解决这一问题,而效果不好的原因基本上来自于下采样和网络深度过深导致的信息损失,输出层难以利用这样的信息拟合这样的任务,文章给了一个图来描述这样的情况,其中图(b)就是直接分割的效果:
The Fully Connected CRF Model
为了解决直接分割效果不好的问题,一般利用CRF对图像进行建模,图(c)是基于patch的CRF,概率图中依赖关系只和一定patch内的pixel有关,图(d)是全连接CRF,即一个节点和图中其他所有节点有关。
定义两随机场X = { X 1 , X 2 , ⋯ X N } 、 I = { I 1 , I 2 , ⋯ I N } X = { X 1 , X 2 , ⋯ X N } 、 I = { I 1 , I 2 , ⋯ I N } ,其中X表示标签变量,I表示图像信息,X i X i 定义在L = { l 1 , l 2 , ⋯ , l k } L = { l 1 , l 2 , ⋯ , l k } ,I i I i 则表示索引为i的像素所携带的颜色信息。
对于条件随机场( X , I ) ( X , I ) ,其概率分布定义为:
P ( X | I ) = 1 Z ( I ) e x p ( − E ( X , I ) ) (1) (1) P ( X | I ) = 1 Z ( I ) e x p ( − E ( X , I ) )
其中E为能量函数,Z为归一化项,分别定义如下:
E ( x | I ) = ∑ i ψ u ( x i | I ) + ∑ i < j ψ p ( x i , x j | I ) (2) (2) E ( x | I ) = ∑ i ψ u ( x i | I ) + ∑ i < j ψ p ( x i , x j | I )
Z ( I ) = ∑ x e x p ( − E ( X , I ) ) (3) (3) Z ( I ) = ∑ x e x p ( − E ( X , I ) )
其能量函数第一项为一元势函数,描述的是某一节点的势能,可以用神经网络的输出层进行拟合;第二项为二元势函数,描述的是节点i和无向图中的其他所有和i有边的节点的关系势能,而这一项的定义如下:
ψ p ( x i , x j ∣ ∣ I ) = μ ( x i , x j ) K ∑ m = 1 w ( m ) k ( m ) ( f i , f j ) k ( f i , f j ) (4) (4) ψ p ( x i , x j | I ) = μ ( x i , x j ) ∑ m = 1 K w ( m ) k ( m ) ( f i , f j ) ⏟ k ( f i , f j )
其中k ( f ∗ i , f ∗ j ) = w ( 1 ) exp ( − ∣ ∣ p i − p j ∣ ∣ 2 2 θ 2 α − ∣ ∣ I i − I j ∣ ∣ 2 2 θ 2 β ) + w ( 2 ) exp ( − ∣ ∣ p i − p j ∣ ∣ 2 2 θ 2 γ ) k ( f ∗ i , f ∗ j ) = w ( 1 ) exp ( − | p i − p j | 2 2 θ α 2 − | I i − I j | 2 2 θ β 2 ) + w ( 2 ) exp ( − | p i − p j | 2 2 θ γ 2 ) 为高斯函数,该公式中p表示位置,第一项描述的是颜色相似性和位置相似性,是基于“距离较近且颜色相似的节点可能属于同一标签类”这一先验,第二项描述的是平滑性;f为人工设计的特征,w w 为不同类别的权重,μ μ 是一指示函数,在两者标签不同时为1,否则为0,即对于标签相同的情况,并不进行能量传导,而标签不通的情况才进行能量传导. θ θ 为可学习的参数(w w 其实也是可学习的,但是在实验中发现对w ( 2 ) w ( 2 ) )设置为1效果就挺好了,所以这一参数是超参。
关于为什么一元势函数要用神经网路拟合,而二元势函数要在原图上直接利用“人工设计”的特征来描述,是因为CNN本身感受野有限,网络输出feature的某一pixel位置只和其领域一定范围内的像素有关,无法建模全局关系如全局的二元关系,但描述该位置的信息是足够的;而用“人工设计”的特征来描述二元势函数则是根据颜色先验和平滑先验来的,神经网络难以对这两个先验进行建模描述,而我们却可以很方便的通过图像本身运算得到量化描述(尽管需要优化建模的参数)。
对于总像素点数为N的一张图,其边的数量可以达到N 2 N 2 ,上式的二元势函数的每个节点则需要进行N 2 N 2 的运算,本文提出了mean field来近似fully connected crf。
Mean Field Approximation
对于P ( X | I ) P ( X | I ) ,文章希望求的一个分布Q ( X | I ) Q ( X | I ) 来近似P ( X | I ) P ( X | I ) ,文章中是用P ( X ) P ( X ) 和Q ( X ) Q ( X ) 来表示,省略了后面的条件量,表达的意思是一致的。为了和文章保持一致,后面沿用文章的写法。
其中,对于Q ( X ) Q ( X ) 需要满足Q ( X ) = ∏ i Q i ( X i ) Q ( X ) = ∏ i Q i ( X i ) ,因此只需要最大化分布P和分布Q之间的KL散度,就可以实现对P的近似了。
对于
P ( X ) = 1 Z ~ P ( X ) = 1 Z exp ( − ∑ i ψ u ( x i ) − ∑ i < j ψ p ( x i , x j ) ) = 1 Z exp ( − E ( X ) ) (5) (5) P ( X ) = 1 Z P ~ ( X ) = 1 Z exp ( − ∑ i ψ u ( x i ) − ∑ i < j ψ p ( x i , x j ) ) = 1 Z exp ( − E ( X ) )
这里原文应该把exp里的正负搞错了,纠正一下。
P和Q的KL散度为:
D ( Q ∥ P ) = ∑ x Q ( x ) log ( Q ( x ) P ( x ) ) = − ∑ x Q ( x ) log P ( x ) + ∑ x Q ( x ) log Q ( x ) = − E U ∼ Q [ log P ( U ) ] + E U ∼ Q [ log Q ( U ) ] = − E U ∼ Q [ log ~ P ( U ) ] + E U ∼ Q [ log Z ] + ∑ i E U i ∼ Q [ log Q ( U i ) ] = E U ∼ Q [ E ( U ) ] + ∑ i E U i ∼ Q i [ log Q i ( U i ) ] + log Z D ( Q ‖ P ) = ∑ x Q ( x ) log ( Q ( x ) P ( x ) ) = − ∑ x Q ( x ) log P ( x ) + ∑ x Q ( x ) log Q ( x ) = − E U ∼ Q [ log P ( U ) ] + E U ∼ Q [ log Q ( U ) ] = − E U ∼ Q [ log P ~ ( U ) ] + E U ∼ Q [ log Z ] + ∑ i E U i ∼ Q [ log Q ( U i ) ] = E U ∼ Q [ E ( U ) ] + ∑ i E U i ∼ Q i [ log Q i ( U i ) ] + log Z
第三行到第四行是进行了代换;第四行到第五行是能量函数代换且Z只和P有关,因此可以从期望中提取出来。
此外,Q的约束条件为:
∑ x i Q i ( x i ) = 1 (6) (6) ∑ x i Q i ( x i ) = 1
这是因为边际概率和为1。
根据拉格朗日乘数法,构造拉氏函数
L = E U ∼ Q [ E ( U ) ] + ∑ i E U i ∼ Q i [ log Q i ( U i ) ] + log Z + λ ∑ x i ( Q i ( x i ) − 1 ) (7) (7) L = E U ∼ Q [ E ( U ) ] + ∑ i E U i ∼ Q i [ log Q i ( U i ) ] + log Z + λ ∑ x i ( Q i ( x i ) − 1 )
因此:
∂ L ∂ Q i ( x i ) = ∂ L ∂ Q i ( x i ) ( ∑ i E U i ∼ Q i [ ψ u ( U i ) ] + ∑ i < j E U i ∼ Q i , U j ∼ Q j [ ψ p ( U i , U j ) ] + ∑ i E U i ∼ Q i [ log Q i ( U i ) ] + log Z + λ ∑ x i ( log Q i ( x i ) − 1 ) ) = ψ u ( x i ) – ––––– – + ∂ L ∂ Q i ( x i ) ⎛ ⎝ 1 2 ∑ i Q i ( U i ) ∑ i ≠ j E U j ∼ Q j [ ψ p ( U i , U j ) ] ⎞ ⎠ – –––––––––––––––––––––––––––––––––––––––––––––––––– – + ( log Q i ( x i ) + 1 ) – ––––––––––––––– – + 0 – + λ – – = ψ u ( x i ) – ––––– – + ⎛ ⎝ 1 2 ∑ i ≠ j E U j ∼ Q j [ ψ p ( x i , U j ) ] ⎞ ⎠ – ––––––––––––––––––––––––––––– – + ( log Q i ( x i ) + 1 ) – ––––––––––––––– – + 0 – + λ – – (8) (8) ∂ L ∂ Q i ( x i ) = ∂ L ∂ Q i ( x i ) ( ∑ i E U i ∼ Q i [ ψ u ( U i ) ] + ∑ i < j E U i ∼ Q i , U j ∼ Q j [ ψ p ( U i , U j ) ] + ∑ i E U i ∼ Q i [ log Q i ( U i ) ] + log Z + λ ∑ x i ( log Q i ( x i ) − 1 ) ) = ψ u ( x i ) _ + ∂ L ∂ Q i ( x i ) ( 1 2 ∑ i Q i ( U i ) ∑ i ≠ j E U j ∼ Q j [ ψ p ( U i , U j ) ] ) _ + ( log Q i ( x i ) + 1 ) _ + 0 _ + λ _ = ψ u ( x i ) _ + ( 1 2 ∑ i ≠ j E U j ∼ Q j [ ψ p ( x i , U j ) ] ) _ + ( log Q i ( x i ) + 1 ) _ + 0 _ + λ _
每一项对应的求导我用下划线标出来了,方便区分;第三行是因为将i < j i < j 换成了i ≠ j i ≠ j ,所以加上了一个1 2 1 2 ,之所以换成不等号,是和前面说到的指示函数对应。
接下来让其导数等于0,求解Q:
ψ u ( x i ) + ⎛ ⎝ 1 2 ∑ i ≠ j E U j ∼ Q j [ ψ p ( x i , U j ) ] ⎞ ⎠ + ( log Q i ( x i ) + 1 ) + 0 + λ = 0 (9) (9) ψ u ( x i ) + ( 1 2 ∑ i ≠ j E U j ∼ Q j [ ψ p ( x i , U j ) ] ) + ( log Q i ( x i ) + 1 ) + 0 + λ = 0
log Q i ( x i ) = − ψ u ( x i ) − 1 2 ∑ j ≠ i E U j ∼ Q j [ ψ p ( x i , U j ) ] − 1 − λ (10) (10) log Q i ( x i ) = − ψ u ( x i ) − 1 2 ∑ j ≠ i E U j ∼ Q j [ ψ p ( x i , U j ) ] − 1 − λ
所以:
Q i ( x i ) = exp ⎧ ⎨ ⎩ − ψ u ( x i ) − 1 2 ∑ j ≠ i E U j ∼ Q j [ ψ p ( x i , U j ) ] − 1 − λ ⎫ ⎬ ⎭ = 1 Z i exp ⎧ ⎨ ⎩ − ψ u ( x i ) − ∑ j ≠ i E U j ∼ Q j [ ψ p ( x i , U j ) ] ⎫ ⎬ ⎭ (11) (11) Q i ( x i ) = exp { − ψ u ( x i ) − 1 2 ∑ j ≠ i E U j ∼ Q j [ ψ p ( x i , U j ) ] − 1 − λ } = 1 Z i exp { − ψ u ( x i ) − ∑ j ≠ i E U j ∼ Q j [ ψ p ( x i , U j ) ] }
之所以把1 2 1 2 去掉这里我理解是后面的期望项展开是含有可学习参数w w 的,因此前面的系数并不重要;后面的常数项被归到normalize项Z里,是因为Q的求和等于1,最终是需要normalize的,可以直接将其归进去而不影响结果。
将相关的变量带入:
Q i ( x i = l ) = 1 Z i exp ⎧ ⎨ ⎩ − ψ u ( x i ) − ∑ j ≠ i E U j ∼ Q j [ μ ( l , U j ) K ∑ m = 1 w ( m ) k ( m ) ( f i , f j ) ] ⎫ ⎬ ⎭ = 1 Z i exp ⎧ ⎨ ⎩ − ψ u ( x i ) − K ∑ m = 1 w ( m ) ∑ j ≠ i E U j ∼ Q j [ μ ( l , U j ) k ( m ) ( f i , f j ) ] ⎫ ⎬ ⎭ = 1 Z i exp ⎧ ⎨ ⎩ − ψ u ( x i ) − K ∑ m = 1 w ( m ) ∑ j ≠ i ∑ l ′ ∈ L Q j ( l ′ ) μ ( l , l ′ ) k ( m ) ( f i , f j ) ⎫ ⎬ ⎭ = 1 Z i exp ⎧ ⎨ ⎩ − ψ u ( x i ) − ∑ l ′ ∈ L μ ( l , l ′ ) K ∑ m = 1 w ( m ) ∑ j ≠ i k ( m ) ( f i , f j ) Q j ( l ′ ) ⎫ ⎬ ⎭ Q i ( x i = l ) = 1 Z i exp { − ψ u ( x i ) − ∑ j ≠ i E U j ∼ Q j [ μ ( l , U j ) ∑ m = 1 K w ( m ) k ( m ) ( f i , f j ) ] } = 1 Z i exp { − ψ u ( x i ) − ∑ m = 1 K w ( m ) ∑ j ≠ i E U j ∼ Q j [ μ ( l , U j ) k ( m ) ( f i , f j ) ] } = 1 Z i exp { − ψ u ( x i ) − ∑ m = 1 K w ( m ) ∑ j ≠ i ∑ l ′ ∈ L Q j ( l ′ ) μ ( l , l ′ ) k ( m ) ( f i , f j ) } = 1 Z i exp { − ψ u ( x i ) − ∑ l ′ ∈ L μ ( l , l ′ ) ∑ m = 1 K w ( m ) ∑ j ≠ i k ( m ) ( f i , f j ) Q j ( l ′ ) }
很不幸的是,对于w ( 1 ) 、 θ w ( 1 ) 、 θ 的学习,并没有利用梯度来学习,主要是速度上的考虑,可能还不如直接暴力搜索快和效果好;文章是利用grid search来搜索的,即预设一些值,利用暴力法挨个尝试在一个固定的验证集上选择最佳参数。
再贴一下文章中收敛的一个大致效果:
文章中还提到指示函数的梯度学习,前面我们将其认为是不可学习的,将结果根据标签是否一致进行一刀切,显然比较hard,文章后面认为指示函数本身可以作为可学习参数进行学习,而这一块可以利用梯度方法进行学习。
对于训练图像I I 和其对应的分割标注T T ,对于学习参数μ μ ,其损失表示为:
ℓ ( μ : T ( n ) , I ( n ) ) = log P ( X = T ( n ) ∣ I ( n ) , μ ) = − E ( T ( n ) ∣ I ( n ) , μ ) − log Z ( I ( n ) , μ ) ℓ ( μ : T ( n ) , I ( n ) ) = log P ( X = T ( n ) ∣ I ( n ) , μ ) = − E ( T ( n ) ∣ I ( n ) , μ ) − log Z ( I ( n ) , μ )
其导数:
∂ ∂ μ a , b ℓ ( μ : T ( n ) , I ( n ) ) = ∂ ∂ μ b , a ℓ ( μ : T ( n ) , I ( n ) ) = − ∂ ∂ μ a , b E ( T ( n ) ∣ I ( n ) , μ ) − ∂ ∂ μ a , b log Z ( I ( n ) , μ ) = − ∑ m 1 2 ∑ i ≠ j k ( m ) ( T ( n ) i , T ( n ) j ) g ( μ a , b ) − 1 Z ∂ ∂ μ a , b Z ( I ( n ) , μ ) ∂ ∂ μ a , b ℓ ( μ : T ( n ) , I ( n ) ) = ∂ ∂ μ b , a ℓ ( μ : T ( n ) , I ( n ) ) = − ∂ ∂ μ a , b E ( T ( n ) ∣ I ( n ) , μ ) − ∂ ∂ μ a , b log Z ( I ( n ) , μ ) = − ∑ m 1 2 ∑ i ≠ j k ( m ) ( T i ( n ) , T j ( n ) ) g ( μ a , b ) − 1 Z ∂ ∂ μ a , b Z ( I ( n ) , μ )
其中,
g ( μ a , b ) = 1 a = T ( n ) i 1 b = T ( n ) j + 1 b = T ( n ) i 1 a = T ( n ) j (12) (12) g ( μ a , b ) = 1 a = T i ( n ) 1 b = T j ( n ) + 1 b = T i ( n ) 1 a = T j ( n )
1 Z ∂ ∂ μ a , b Z ( I ( n ) , μ ) = 1 Z ∑ X ∂ ∂ μ a , b ~ P ( X ∣ I ( n ) , μ ) = 1 Z ∑ X ∂ ∂ μ a , b exp ( − E ( X ∣ I ( n ) , μ ) ) = − ∑ X 1 Z exp ( − E ( X ∣ I ( n ) , μ ) ) ∂ ∂ μ a , b E ( X ∣ I ( n ) , μ ) = − ∑ X P ( X ) ∑ m w ( m ) 1 2 ∑ i ≠ j k ( m ) ( T ( n ) i , T ( n ) j ) ( 1 a = T ( n ) i 1 b = T ( n ) j + 1 b = T ( n ) i 1 a = T ( n ) j ) = − ∑ X P ( X ) ∑ m w ( m ) 1 2 ⎛ ⎝ ∑ i ≠ j k ( m ) ( T ( n ) i , T ( n ) j ) 1 a = T ( n ) i 1 b = T ( n ) j + ∑ j ≠ i k ( m ) ( T ( n ) j , T ( n ) i ) 1 a = T ( n ) j 1 b = T ( n ) i ⎞ ⎠ = − ∑ X P ( X ) ∑ m w ( m ) ∑ i ≠ j k ( m ) ( T ( n ) i , T ( n ) j ) 1 a = T ( n ) i 1 b = T ( n ) j 1 Z ∂ ∂ μ a , b Z ( I ( n ) , μ ) = 1 Z ∑ X ∂ ∂ μ a , b P ~ ( X ∣ I ( n ) , μ ) = 1 Z ∑ X ∂ ∂ μ a , b exp ( − E ( X ∣ I ( n ) , μ ) ) = − ∑ X 1 Z exp ( − E ( X ∣ I ( n ) , μ ) ) ∂ ∂ μ a , b E ( X ∣ I ( n ) , μ ) = − ∑ X P ( X ) ∑ m w ( m ) 1 2 ∑ i ≠ j k ( m ) ( T i ( n ) , T j ( n ) ) ( 1 a = T i ( n ) 1 b = T j ( n ) + 1 b = T i ( n ) 1 a = T j ( n ) ) = − ∑ X P ( X ) ∑ m w ( m ) 1 2 ( ∑ i ≠ j k ( m ) ( T i ( n ) , T j ( n ) ) 1 a = T i ( n ) 1 b = T j ( n ) + ∑ j ≠ i k ( m ) ( T j ( n ) , T i ( n ) ) 1 a = T j ( n ) 1 b = T i ( n ) ) = − ∑ X P ( X ) ∑ m w ( m ) ∑ i ≠ j k ( m ) ( T i ( n ) , T j ( n ) ) 1 a = T i ( n ) 1 b = T j ( n )
然后再将P换成我们估计的Q:
1 Z ∂ ∂ μ a , b Z ( I ( n ) , μ ) ≈ ∑ X Q ( X ) ∑ m w ( m ) ∑ i ≠ j k ( m ) ( T ( n ) i , T ( n ) j ) 1 a = X i 1 b = X j = ∑ m w ( m ) ∑ i ≠ j k ( m ) ( T ( n ) i , T ( n ) j ) ∑ X Q ( X / { X i , X j } ) 1 a = X i Q i ( X i ) 1 b = X j Q j ( X j ) = ∑ m w ( m ) ∑ i ≠ j k ( m ) ( T ( n ) i , T ( n ) j ) Q i ( a ) Q j ( b ) 1 Z ∂ ∂ μ a , b Z ( I ( n ) , μ ) ≈ ∑ X Q ( X ) ∑ m w ( m ) ∑ i ≠ j k ( m ) ( T i ( n ) , T j ( n ) ) 1 a = X i 1 b = X j = ∑ m w ( m ) ∑ i ≠ j k ( m ) ( T i ( n ) , T j ( n ) ) ∑ X Q ( X / { X i , X j } ) 1 a = X i Q i ( X i ) 1 b = X j Q j ( X j ) = ∑ m w ( m ) ∑ i ≠ j k ( m ) ( T i ( n ) , T j ( n ) ) Q i ( a ) Q j ( b )
最后得到
∂ ∂ μ ( a , b ) ℓ n ( μ : I ( n ) , T ( n ) ) ≈ ∑ m w ( m ) ( − ∑ i T ( n ) i ( a ) ∑ j ≠ i k ( m ) ( f i , f j ) T ( n ) j ( b ) + ∑ i Q i ( a ) ∑ j ≠ i k ( m ) ( f i , f j ) Q i ( b ) ⎞ ⎠ ∂ ∂ μ ( a , b ) ℓ n ( μ : I ( n ) , T ( n ) ) ≈ ∑ m w ( m ) ( − ∑ i T i ( n ) ( a ) ∑ j ≠ i k ( m ) ( f i , f j ) T j ( n ) ( b ) + ∑ i Q i ( a ) ∑ j ≠ i k ( m ) ( f i , f j ) Q i ( b ) )
Algorithm
之前我们得到:
Q i ( x i ) = 1 Z i exp ⎧ ⎨ ⎩ − ψ u ( x i ) − ∑ j ≠ i E U j ∼ Q j [ ψ p ( x i , U j ) ] ⎫ ⎬ ⎭ (13) (13) Q i ( x i ) = 1 Z i exp { − ψ u ( x i ) − ∑ j ≠ i E U j ∼ Q j [ ψ p ( x i , U j ) ] }
不考虑μ μ 的学习的情况下,公式左右两边都是有Q的,因此可以先初始化一个Q,然后不断迭代代入,直到P和Q的KL散度小于一定阈值。
其算法流程如下:
该算法在Message passing阶段的复杂度是O ( N 2 ) O ( N 2 ) 的,利用mean field approximation之后绛为O ( N ) O ( N ) .
而复杂度的降低来自于对k ( m ) ( f i , f j ) k ( m ) ( f i , f j ) 用卷积替代,卷积核的大小并非全局(不然不和原来没区别了),而是利用截断,设置了一个阈值选择卷积核的大小,即只连接高斯分布附近的节点。
替换之后的算法:
可以看到除了用卷积处理,还加上了下采样和上采样,这里先下采样是为了减少运算,卷积过程等价于低通滤波,低通滤波本身就会过滤掉高频部分,试想如果不进行任何采样,那message passing的过程其实就是过滤高频部分,但是加了下采样会使得计算量降低,这里可能会有个疑问,直接下采样不是有可能造成混叠吗,一般我们应该先低通滤波再去下采样的呀?其实这里用到了Nobel恒等式,也就是先低通滤波再下采样和先下采样再低通滤波是等价的,简单的解释是先低通滤波再去下采样,最终留下来的点其实有一些是没用到的,所以可以事先进行采样选择需要的点,再进行滤波,更为详细的理解可以在The Scientist and Engineer's Guide to Digital Signal Processing找到,大概在p40;而上采样部分仅仅是为了恢复形状。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)