Colorization论文学习笔记
整理一下colorization方面的几篇论文,方便自己理理思路。
results and paper
PSNR SSIM
常用图像评估指标
作者观察到的colorization的趋势:
1.GAN-based methods deliver diverse colorization visually compared to CNN-based methods
2. the existing models generally deliver a sub-optimal result for complex scenes having a large number of objects with small sizes
3. deep models with higher complexity have little improvement in terms of numbers
4. the diversity of networks in image colorization as compared to other image restoration is significant
5. a future direction for image colorization is unsupervised learning
6. many recent advancements and techniques such as attention mechanism, and loss functions can be incorporated for performance
项目地址
colorization的很多方法,要么依赖于用户交互,要么易产生不饱和的色彩结果。作者提出一种方法能自动生成鲜明、真实的上色结果。
作者的目的不在于还原物体的真实颜色,而是产生一种合理的、可解释的结果,比如一个苹果,可以上色为一个红苹果,也可以上色成一个青苹果。这样就可以基于大量统计数据建立灰度图的语义、纹理到色彩的一种联系来达到这样一个目的。
早前的大多工作将colorization处理为一个预测问题,作者将灰度图的上色问题处理为一个分类问题,并用class-rebalancing来增加结果的多样性。
网络结构如上图所示,学习一个灰度图到色彩的mapping。作者采用的是Lab色彩空间,将L作为输入,去映射对应的ab值。
给定一个输入 X ∈ R H × W × 1 X\in R^{H\times W\times1} X∈RH×W×1,学习 Y ^ = F ( X ) \hat{Y}= F\left ( X \right ) Y^=F(X), Y ∈ R H × W × 2 Y\in R^{H\times W\times\ 2} Y∈RH×W× 2 ,常用的方式是L2 loss
L 2 ( Y ^ , Y ) = 1 2 ∥ Y h , w − Y ^ h , w ∥ 2 2 L_{2}\left ( \hat{Y},Y \right )=\frac{1}{2}\left \| Y_{h,w}-\hat{Y}_{h,w} \right \|_{2}^{2} L2(Y^,Y)=21∥∥∥Yh,w−Y^h,w∥∥∥22
但是作者指出L2 loss在用于着色问题时不够鲁棒(多义,多模性),并且指出采用该loss可能是导致之前的一些colorization的方法着色效果不够饱和的原因。L2 loss是最小化模型结果和ground truth之间的欧式距离,当一个物体可以上多种颜色,最小化loss的方案是取可选颜色集合的均值,这就会使得上色效果呈现grayish。并且当可选颜色集合不是一个凸集,对颜色取平均得到的结果将位于该集合以外。而作者将着色问题处理为分类任务,设计了新的损失函数,利用权重对色彩类别进行平衡,再进行类别概率到点的估计。
作者将统计得到的ab输出空间,按10的步长划分为了Q个区块(Q=313)。如下图(a)所示。
要对输入 X X X学习一个到颜色概率分布的映射, Z ^ = G ( X ) \hat{Z}=G\left(X\right) Z^=G(X), Z ^ ∈ [ 0 , 1 ] H × W × Q \hat{Z}\in \left[0,1\right]^{H \times W \times Q} Z^∈[0,1]H×W×Q (注意维度)。
为了比较 Z ^ \hat{Z} Z^和ground truth,要把groud truth编码到Z的空间去。容易想到的方式是对 Z h , w Z_{h,w} Zh,w采用one-hot的方式编码,但作者采取的是一种soft-encoding策略。找出对应 Y h , w Y_{h,w} Yh,w在输出空间上最邻近的5个小色区,并对其进行高斯加权,得到编码。作者发现这种编码手段能够让网络更快地学习到输出空间上各部分之间的关系。这个我是这样理解的,如果对 Z h , w Z_{h,w} Zh,w的编码采用one-hot的形式,那么一个 Z h , w Z_{h,w} Zh,w向量上就只有一个非零数值,只有这一个信息可用,这种形式也体现不出来类别和类别之间有什么关联。但是如果采用软编码的策略,一个 Z h , w Z_{h,w} Zh,w向量上就有五个可以用到的信息点,并且这种编码方式能够体现类别间的关系。
由于作者的训练代码是caffe框架,所以参考的是github上的复现代码。
复现代码链接
def get_soft_encoding(image_ab, nn_finder, nb_q):
h, w = image_ab.shape[:2]
a = np.ravel(image_ab[:, :, 0])
b = np.ravel(image_ab[:, :, 1])
ab = np.vstack((a, b)).T
# Get the distance to and the idx of the nearest neighbors
dist_neighb, idx_neigh = nn_finder.kneighbors(ab)
# Smooth the weights with a gaussian kernel
sigma_neighbor = 5
wts = np.exp(-dist_neighb ** 2 / (2 * sigma_neighbor ** 2))
wts = wts / np.sum(wts, axis=1)[:, np.newaxis]
# format the tar get
y = np.zeros((ab.shape[0], nb_q))
idx_pts = np.arange(ab.shape[0])[:, np.newaxis]
y[idx_pts, idx_neigh] = wts
y = y.reshape(h, w, nb_q)
return y
用交叉熵作为损失函数:
L c l ( Z ^ , Z ) = − ∑ h , w v ( Z h , w ) ∑ h , w Z h , w , q l o g ( Z ^ h , w , q ) L_{cl}\left(\hat{Z},Z\right)=- \sum_{h,w}^{}v\left ( Z_{h,w} \right )\sum_{h,w}^{}Z_{h,w,q} log\left(\hat{Z}_{h,w,q} \right ) Lcl(Z^,Z)=−h,w∑v(Zh,w)h,w∑Zh,w,qlog(Z^h,w,q)
v是用于平衡的权重系数。
这里插几句论文之外的话,下午回顾到这里的时候就在想为什么分类问题通常用交叉熵作损失函数,不用最小二乘。其实我之前想得都很简单,就觉得最小二乘是在尽量靠近空间中的一条线,并且感觉它反应的是一种拟合的平均效应,没有突出对分类错误的惩罚,对于分类问题不合适。而对于交叉熵 L ( p , q ) = − ∑ h , w n p ( x i ) l o g ( q ( x i ) ) L(p,q)= -\sum_{h,w}^{n}p\left(x_{i}\right)log(q(x_{i})) L(p,q)=−h,w∑np(xi)log(q(xi))p表示真实的样本分布,q表示预测的样本分布。我是这样想的,要使得L的值尽可能小,那么q(xi)大的时候,log(q(xi))值的绝对值很小,p(xi)在此时可以稍微取大,对Loss的值影响不大,而q(xi)小的时候,其对数值的绝对值很大,此时要让loss尽可能小,p(xi)就应该取尽可能的小,这样来看p(xi)和q(xi)的分布越同步,loss就更容易取得更小的值,而分布越同步就越可能是同一类别。但是今天看了一些讲解,感觉这些理解都太流于表面了,有点toy thinking的感觉。姑且不整理这些了。大概来说使用最小二乘作为损失函数,在假设误差服从正态分布的前提下和极大似然估计在本质上相同。
另外,之前看了一点吴恩达的课程,里面提到使用sigmoid作为激活函数的时候使用最小二乘,由于此时的非凸性,使用梯度下降时可能陷入局部最优解,但是今天看有网友指出,在高维空间loss大多数情况下都不是凸函数。
困了。。。。不写了 。。。。。
由上图的ab值的分布可以看出,ab值的分布倾向于low value。作者指出这是因为云朵、沙漠、路面等常作为背景出现在图片中,导致不饱和的色彩出现频率远高于饱和色彩的频率,如果忽视这个为,那loss就会被不饱和的色彩值主导。因此作者引入权重系数来平衡,
v ( Z h , w ) = w q ∗ , q ∗ = a r g m a x q Z h , w , q v\left(Z_{h,w}\right)=w_{q^*},q^*=arg\,max_{q}^{}Z_{h,w,q} v(Zh,w)=wq∗,q∗=argmaxqZh,w,q
w ∝ ( ( 1 − λ ) p ~ + λ Q ) − 1 , E [ w ] = ∑ q p ~ q w q = 1 w\propto \left(\left( 1-\lambda \right )\tilde{p} +\frac{\lambda}{Q}\right )^{-1},E\left [ w \right ]=\sum_{q}\tilde{p}_{q}w_{q}=1 w∝((1−λ)p~+Qλ)−1,E[w]=q∑p~qwq=1
其中 p ~ \tilde{p} p~是进行高斯平滑后的ab空间上的经验分布,以 1 Q \frac{1}{Q} Q1为正则项,用 λ \lambda λ来调节两者之间的关系,在作者的实验中取 λ = 1 / 2 \lambda=1/2 λ=1/2, σ = 5 \sigma=5 σ=5效果较好。
由概率到点的估计,通常有两种做法,一种是根据预测分布对颜色值取平均,另一种是直接取预测出可能值最大的颜色。这两种做法都存在一定的问题,第一种可能导致颜色出现不饱和,第二种可能导致图像的色彩在空间上不连续。为了在这两者之间找到平衡,作者引入了参数T,通过模拟退火,选择T=0.38.
H ( Z h , w ) = E [ f T ( Z h , w ) ] , f T ( z ) = e x p ( l o g ( z ) / T ) ∑ q e x p ( l o g ( z q ) / T ) H(Z_{h,w})=E\left[f_{T}(Z_{h,w})\right],f_{T}(z)=\frac{exp(log(z)/T)}{\sum_{q}exp\left(log(z_{q}\right)/T)} H(Zh,w)=E[fT(Zh,w)],fT(z)=∑qexp(log(zq)/T)exp(log(z)/T)
Ours(full): 完整的方法,有classification loss,class rebalancing
Ours(class):classification loss,但是没有class rebalancing
Ours(L2):使用L2 loss
Ours(L2,ft):trained with L2 regression loss, fine-tund from full classification
with rebalancing network
用了三种评价指标, Perceptual realism (AMT),Semantic interpretability (VGG classification),Raw Accurancy(AuC)。
Perceptual realism(AMT):作者设计的主观测试实验,将真实图像和上色图像放在一起,由人来判别图片是真实的是还是上色结果。作者发现模型的上色图像获胜频率高于真实图像,作者认为这可能是由于真实图像中存在白平衡较差,或者一些不寻常的颜色,而作者的模型是基于大量统计数据,去产生一种可解释的结果 produces a more prototypical appearance.
Semantic interpretability (VGG classification):使用VGG来对图像进行分类。与灰度图相比,彩色合成的分类正确率有所提升。
AuC:计算预测的像素点颜色和groundtruth的L2距离在阈值范围内的百分比,阈值取0到150,计算累积的面积。
作者发现L2 net从分类网络进行微调,能获得与分类网络相当的效果,但是从头开始训练效果就欠佳。
作者留意到,具有感知意义的区域往往具有较高的ab值,因此作者引入了一种平衡了类别的AUC值,通过对像素按颜色类别概率重新加权来计算AuC。具体怎样得来的不知道,我理解的是出现概率高的权值小。
作者评估了上色是如何作为representation的一种pretext task。主要就是评估了上色网络的泛化性能,网络的权重固定,然后再将其训练为用于classification, detection, and segmentation的网络,来检验这个上色网络特征学习的能力。