《ChromaGAN》论文简读及demo运行(萌新手记)

论文题目:

《ChromaGAN: Adversarial Picture Colorization with Semantic Class Distribution》

《具有语义类别分布的对抗图片着色》

论文地址:https://arxiv.org/pdf/1907.09837.pdf

源码地址:https://github.com/pvitoria/ChromaGAN

声明:仅学习用途。

 

这是WACV 2020收录的一篇关于单张图片上色的论文,出于学习和项目需要,笔者对这篇论文做了初步阅读,和大家作简单的分享,多多包涵。


 

 

一、内容概要

    灰度图像的着色是一个不适定问题,伴随着多种正确的解决方案。(同一种物体的上色方案五花八门,例如苹果可以是绿色、红色,但几乎不可能是蓝色、白色。)在本文中,我们提出了一种结合图片语义信息的对抗学习着色方法。

    我们用一个生成器网络,以语义线索为条件来推断给定灰度图像的色度。该网络以对抗模型为框架,通过结合颜色、类别分布的感知和语义理解来学习着色,且通过完全自我监督的策略来进行训练。实验给出的定性和定量结果显示了我们提出的方法能够实现逼真的图像着色,在该领域达到了最先进的水平。

这项工作的贡献包括:

    • 对抗性学习方法与语义信息相结合,提出了将色彩、感知信息与语义类别分布结合在一起的三项损失   函数。

    • 无监督的语义类别分布学习。

    • 相关研究表明,语义信息与对抗性方法相结合可产生高质量的结果。

 

二、网络结构

网络结构示意图

绿色的是鉴别器网络,左边是生成器,分为两部分:

第一部分(黄色,紫色,红色,蓝色),输出图片的色度信息

第二部分(黄色,红色,灰色),输出类别分布向量。

两个子网都通过单步反向传播进行联合训练。

 

三、具体方法

1、生成器网络

黄色部分是VGG-16的结构,但相比VGG-16删掉了最后的三个全连接层。

第一个分支的紫色部分通过使用Conv-BatchNorm-ReLu形式的两个模块来处理数据。

第二个分支的红色部分使用了Conv-BatchNorm-ReLu形式的四个模块处理数据,然后接着三个全连接层。

第二个分支的灰色部分输出是类分布矢量,用softmax函数生成m个语义类的概率分布y。

第三阶段是合并输出特征,将两个分支融合,用conv-relu形式的六个模块处理数据,并且中间夹杂了两个上采样层。

 

2、鉴别器网络

该鉴别器是基于Markovian马尔可夫鉴别器架构(这里大家google搜索PatchGAN,我也不会)。

PatchGAN鉴别器跟踪所生成图像的高频结构,从而补偿了L2损失L_{e} (G_{\theta_{1}}^1 ) (找不到特殊的字符,用L和G代替)未能捕获高频结构但能成功捕获低频结构的缺陷。为了对高频信息进行建模,PatchGAN鉴别器主要针对局部的图像块进行操作。因此,它没有对整张图像给出一个简单的输出,而是将每个图像块分类为真实(real)或伪造(fake)。

 

3、损失函数

整个目标损失函数定义为:

以上第一项为颜色误差损失:

中间一项是WGAN的损失,定义为:

最后一项是类别分配损失:

 

四、与其他算法比较

从上图中可以看到,在一些颜色比较鲜艳的、以及语义信息比较明确的图片上,作者提出的网络的处理效果是比较好的,颜色更加饱满也更加接近人们的常规认知。当然论文中作者肯定也是选择了效果比较好的图片作为展示。


 

 

简单浏览完论文之后,我们进入到源码链接

我们打开网页可以看到作者给出了一些示例图片,以及比较粗略的操作指引。经笔者尝试,分别在Google Colaboratory(以下简称colab)以及本地vscode+jupyter notebook的方式进行demo的运行。

 

一、在colab上运行

1、首先在命令行窗口clone源代码到本地,或者直接点击github页面的绿色按钮下载压缩包。

git clone https://github.com/pvitoria/ChromaGAN

 

2、接着申请一个google账号,申请完之后每个账号都会附带15GB的存储空间,也就是google drive。我们把前面下载好的源代码文件夹上传到云盘中。在云盘打开文件夹之后如下图:

google drive 界面

 

3、打开DemoChromaGAN.ipynb文件,应该会自动跳转到colab的界面,如果初次打开没有跳转,可以先谷歌搜索google colab尝试着用一下,然后和Google drive进行绑定。

 

4、打开notebook之后,如下图,左边一栏是文件夹的视图,右边就是承载ChromaGAN demo的notebook,上面有许多的代码块:

打开ipynb文件

 

5、点击下图左边文件夹视图的第三个按钮,将会为notebook添加一个代码块,就是图中右边部分代码,运行该代码块将你的google drive的文件装载到notebook中,这样你的代码就可以直接访问到云盘里的文件了。

(运行代码点击代码块左侧的三角形▶️)

挂载google drive

 

 

接着我们来看notebook里的内容,分为两大部分:

1 Run demo on ChromaGAN images

2 Run demo on uploaded images

    2.2 Run demo

第一部分是在作者给出的测试图片上运行demo,第二部分则是对用户上传的图片进行处理。


 

首先来看第一部分:

1、按照notebook的提示,我们要将运行时改成GPU运行时(好像一般都是默认GPU),也就是采用GPU来跑demo里的model。点击修改->笔记本设置->GPU。

 

2、接着就可以运行第一部分的代码了,直接点击运行,会自动下载作者给出的训练好的MODEL和数据集,以及VGG网络的权重。

step 1 代码

 

3、经过不太久的等待之后,代码运行成功,运行结果直接在notebook里显示:

step 1 输出结果

 

结果很多没办法一次性截图,大致如上表示,可以看到每组图片有三张,从左到右分别是待上色的灰度图、上色完成的图片以及输入到网络中的原始图片。在图片下方还给出了PSNR(峰值信噪比,一种衡量图片处理质量的数据,越高越好)。

 

 

第二部分 处理用户上传的图片:

1、作者很贴心地为我们准备了一张示例图片,运行一下代码即可下载。

下载示例图片
执行第二部分代码

 

2、下载完之后,就可以运行第二部分的代码了。运行之后展示结果,是一张卓别林先生的照片:

第二部分输出结果

 

3、我们也可以往文件夹中上传我们自己选择的照片。sample_images里放测试照片,sample_results是输出结果,可以上传多张。另外,我们也可以修改代码里的路径,改为我们google drive里的文件夹,直接选中文件夹复制相对路径粘贴到代码里面即可。需要注意,直接上传到colab的文件在重新启动之后会被删除,所以最好上传到Google drive。

# DIRECTORY INFORMATION
DATA_DIR = os.path.join('/content/drive/MyDrive/ChromaGAN_old/in/')
OUT_DIR = os.path.join('/content/drive/MyDrive/ChromaGAN_old/sample_results/')
MODEL_DIR = os.path.join('/content/drive/MyDrive/ChromaGAN_old/MODEL/')
# DATA INFORMATION
BATCH_SIZE = 1
# TRAINING INFORMATION
PRETRAINED = "my_model_colorization.h5" 

 

4、以下是我把视频里拆分的300多帧灰度图片使用demo处理得到的结果,可以看到效果还是非常好的。但是也会发现模型没有把树木旁边的人物给区分出来,导致人物衣服的颜色也被处理成了树叶的颜色。另外可能是代码中或者colab没有进行内存释放,跑300帧图片到中途就报错内存满了,这个问题暂时还没解决,但少量图片是没问题的。

上传的图片处理结果

 

vscode+jupyter notebook

最后粗略讲一下在本地vscode运行的注意事项。这一步不是必要,除非你想复现代码。

 

作者提供的requirements.txt中交代了部分环境需要的配置。想要在本地运行,首先要安装python的环境,建议google搜索Anaconda,安装个人版,然后学会用conda创建一个虚拟环境,在虚拟环境中安装ChromaGAN需要的配置。安装好conda之后,进入到虚拟环境中,安装下列版本的软件包。作者没有给出tensorflow的版本,我比较了只有1.12.0版本的tensorflow才和1.15.4版本的numpy 匹配。这里我们不按照作者的pip进行安装,用conda逐个安装下面的选项。

tensorflow=1.12.0 (笔者安装的是CPU版本的,自行查看你的电脑是否支持GPU版)

opencv-python=4.1.0.25

numpy=1.15.4

keras=2.2.4

例如:conda install tensorflow=1.12.0

 

至于vscode上的配置,只需要安装python拓展就可以了。

环境方面配置好之后,需要修改一些demo里的代码。也可以自己重新写一个notebook,但是我还没完全掌握源码。

 

第一个是这个colab上的魔术指令,我们安装好环境之后直接注释掉,不然也会报错。

%tensorflow_version 1.x

 

第二点,cv2_imshow函数也是专门在colab使用的,在jupyter notebook上还没找到好的替代品,尝试过matplotlib库但是并不好用。注释掉。

cv2_imshow(np.concatenate((np.tile(labimg_oritList[i]*255,[1,1,3]), predResult_2, originalResult),axis=1))

 

还有源码里限制了图片的分辨率,超过分辨率的会被resize,但是我就是想处理1080p的图片,所以我把notebook上关于尺寸限制的代码注释掉了。

MAX_SIDE = 1500


if height > MAX_SIDE or width > MAX_SIDE:
          print("Image " + filename + " is of size (" + str(height) + "," + str(width) +  ").")
          print("The maximum image size allowed is (" + str(MAX_SIDE) + "," + str(MAX_SIDE) +  ").")
          r = min(MAX_SIDE/height,MAX_SIDE/width)
          height = math.floor(r*height) 
          width = math.floor(r*width)
          img = cv2.resize(img,(width,height))
          print("It has been resized to (" + str(height) + "," + str(width) + ")")

 

我在本地跑是因为之前处理视频帧的时候colab的内存爆了,所以只能在本地。但我不需要看到notebook上显示的结果,只需要把照片处理完之后保存就可以了。所以干脆把cv2_show和计算psnr和ssim的部分也注释掉。

ssim= tf.keras.backend.eval( tf.image.ssim(tf.convert_to_tensor(originalResult, dtype=tf.float32), tf.convert_to_tensor(predResult_2, dtype=tf.float32), max_val=255))
psnr= tf.keras.backend.eval( tf.image.psnr(tf.convert_to_tensor(originalResult, dtype=tf.float32), tf.convert_to_tensor(predResult_2, dtype=tf.float32), max_val=255))
avg_ssim += ssim
avg_psnr += psnr

 

在notebook里的输出调整为这样,只看个进度就好。直接打开文件夹查看结果。原notebook上的输出是在文件名前面添加了PSNR值,会导致图片顺序混乱,删掉PSNR之后就按顺序了。

vscode 里的输出
输出文件夹视图

 

这次分享就到此为止了,以上都只是跑跑demo,大家可以拿来玩玩,给一些自己感兴趣的黑白图片上色,顺便熟悉一下Anaconda和Google colab的使用,这两个工具非常重要,也非常好用。写下这篇文章与大家分享心得的同时,也是想记录自己的学习过程,没什么干货,但是我尽量写得详细,自己过段时间也可以回头看。想要完成论文复现工作,最重要的还是要看懂源码,自己手写一遍。笔者正在学习过程中,也许过段时间可以分享这部分内容。大家感兴趣的一起看吧!对学习神经网络挺有帮助的。下次见!

 

 

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值