[ECCV2018] [MUNIT] Multimodal Unsupervised Image-to-Image Translation

2023-10-28 01:30

本文主要是介绍[ECCV2018] [MUNIT] Multimodal Unsupervised Image-to-Image Translation,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

贡献:为 one-to-one 的unpaired image translation 的生成图像提供多样性

提出假设:1、图像可以分解为style code 与 content code;2、不同领域的图像,共享一个content space,但是属于不同的style space;

style code captures domain-specific properties, and content code is domain-invariant. we refer to “content” as the underling spatial structure and “style” as the rendering of the structure

本文基于上述假设,使用c (content code)与s (style code)来表征图像进行图像转换任务。
在这里插入图片描述

related works

1、style transfer分为两类:example-guided style transfer 与collection style transfer (cyclegan)
2、Learning disentangled representations:InfoGAN and β-VAE

Model

模型训练流程图:
在这里插入图片描述
生成器模型:由两个encoder+MLP+decoder组成
在这里插入图片描述

损失函数

Bidirectional reconstruction loss

Image reconstruction

在这里插入图片描述

Latent reconstruction

在这里插入图片描述

Adversarial loss

在这里插入图片描述

Total loss

在这里插入图片描述

Domain-invariant perceptual loss(补充)

可选择使用的一个损失:
传统的perceptual loss即使用两幅图像的VGG特征差异作为距离损失;这里提出的损失的改进即对特征进行了IN层归一化,去除原始特征的均值方差(为domain-specific信息),用于计算损失的两幅图像是真实图像与合成图像(同一content不同style)
实验发现,用了IN改进,same scene 的距离会小于同一domain的图像。
在这里插入图片描述
作者发现图像大小大于512时,该损失能加速训练。。。(感觉没什么用

评价指标与结果

LPIPS衡量多样性;Human performance score 衡量合成质量; CIS(IS改进版本)
在这里插入图片描述
在这里插入图片描述

代码笔记

训练时,主代码部分

# Start training
iterations = trainer.resume(checkpoint_directory, hyperparameters=config) if opts.resume else 0
while True:for it, (images_a, images_b) in enumerate(zip(train_loader_a, train_loader_b)):trainer.update_learning_rate()images_a, images_b = images_a.cuda().detach(), images_b.cuda().detach()with Timer("Elapsed time in update: %f"):# Main training codetrainer.dis_update(images_a, images_b, config)trainer.gen_update(images_a, images_b, config)torch.cuda.synchronize()# Dump training stats in log fileif (iterations + 1) % config['log_iter'] == 0:print("Iteration: %08d/%08d" % (iterations + 1, max_iter))write_loss(iterations, trainer, train_writer)# Write imagesif (iterations + 1) % config['image_save_iter'] == 0:with torch.no_grad():test_image_outputs = trainer.sample(test_display_images_a, test_display_images_b)train_image_outputs = trainer.sample(train_display_images_a, train_display_images_b)write_2images(test_image_outputs, display_size, image_directory, 'test_%08d' % (iterations + 1))write_2images(train_image_outputs, display_size, image_directory, 'train_%08d' % (iterations + 1))# HTMLwrite_html(output_directory + "/index.html", iterations + 1, config['image_save_iter'], 'images')if (iterations + 1) % config['image_display_iter'] == 0:with torch.no_grad():image_outputs = trainer.sample(train_display_images_a, train_display_images_b)write_2images(image_outputs, display_size, image_directory, 'train_current')# Save network weightsif (iterations + 1) % config['snapshot_save_iter'] == 0:trainer.save(checkpoint_directory, iterations)iterations += 1if iterations >= max_iter:sys.exit('Finish training')

trainerMUNIT_Trainer类对象,该类包含了MUNIT模型的几乎所有操作,包括各个网络的初始化,优化器定义,网络前馈、网络优化等。这个类会相对冗杂,好处就是训练的主函数就只需要调用update_D与update_G就完事了,算是一种训练代码的风格。另一种代码风格就是StarGAN、StarGAN v2的,各个网络单独定义,没有Trainer这种类,因此train的主函数会比较复杂。
1、该类的初始化定义如下:

class MUNIT_Trainer(nn.Module):def __init__(self, hyperparameters):super(MUNIT_Trainer, self).__init__()lr = hyperparameters['lr']# Initiate the networksself.gen_a = AdaINGen(hyperparameters['input_dim_a'], hyperparameters['gen'])  # auto-encoder for domain aself.gen_b = AdaINGen(hyperparameters['input_dim_b'], hyperparameters['gen'])  # auto-encoder for domain bself.dis_a = MsImageDis(hyperparameters['input_dim_a'], hyperparameters['dis'])  # discriminator for domain aself.dis_b = MsImageDis(hyperparameters['input_dim_b'], hyperparameters['dis'])  # discriminator for domain bself.instancenorm = nn.InstanceNorm2d(512, affine=False)self.style_dim = hyperparameters['gen']['style_dim']# fix the noise used in samplingdisplay_size = int(hyperparameters['display_size'])self.s_a = torch.randn(display_size, self.style_dim, 1, 1).cuda()self.s_b = torch.randn(display_size, self.style_dim, 1, 1).cuda()# Setup the optimizersbeta1 = hyperparameters['beta1']beta2 = hyperparameters['beta2']dis_params = list(self.dis_a.parameters()) + list(self.dis_b.parameters())gen_params = list(self.gen_a.parameters()) + list(self.gen_b.parameters())self.dis_opt = torch.optim.Adam([p for p in dis_params if p.requires_grad],lr=lr, betas=(beta1, beta2), weight_decay=hyperparameters['weight_decay'])self.gen_opt = torch.optim.Adam([p for p in gen_params if p.requires_grad],lr=lr, betas=(beta1, beta2), weight_decay=hyperparameters['weight_decay'])self.dis_scheduler = get_scheduler(self.dis_opt, hyperparameters)self.gen_scheduler = get_scheduler(self.gen_opt, hyperparameters)# Network weight initializationself.apply(weights_init(hyperparameters['init']))self.dis_a.apply(weights_init('gaussian'))self.dis_b.apply(weights_init('gaussian'))# Load VGG model if neededif 'vgg_w' in hyperparameters.keys() and hyperparameters['vgg_w'] > 0:self.vgg = load_vgg16(hyperparameters['vgg_model_path'] + '/models')self.vgg.eval()for param in self.vgg.parameters():param.requires_grad = False

1.1 生成器AdaINGen的定义如下:

class AdaINGen(nn.Module):# AdaIN auto-encoder architecturedef __init__(self, input_dim, params):super(AdaINGen, self).__init__()dim = params['dim']style_dim = params['style_dim']n_downsample = params['n_downsample']n_res = params['n_res']activ = params['activ']pad_type = params['pad_type']mlp_dim = params['mlp_dim']# style encoderself.enc_style = StyleEncoder(4, input_dim, dim, style_dim, norm='none', activ=activ, pad_type=pad_type)# content encoderself.enc_content = ContentEncoder(n_downsample, n_res, input_dim, dim, 'in', activ, pad_type=pad_type)self.dec = Decoder(n_downsample, n_res, self.enc_content.output_dim, input_dim, res_norm='adain', activ=activ, pad_type=pad_type)

这篇关于[ECCV2018] [MUNIT] Multimodal Unsupervised Image-to-Image Translation的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/289779

相关文章

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

idea中配置Translation插件完成翻译功能

文章目录 idea下载插件配置有道云阿里云百度翻译开放平台 idea下载插件 idea中安装Translation插件 使用方法:右下角选择翻译引擎,鼠标选中想翻译的部分,右键翻译即可 之前一直用的微软的翻译,不需要配置,但是最近微软服务器总是抽风,无法使用,故打算配置一下国内的翻译服务。 配置 有道云 只有初始的一点额度,用完就要收费了,不推荐

IMAGE LIST

   CImageList就是一个容器,用来存储图片资源,方便这些资源被CListBox,CComboBox,CComboBoxEx,CTabCtrl以及CTreeCtrl,CListCtrl等使用。      要使用CImgeList首先要使用它的create函数:      一般用的比较多的是这一个函数,当然,它还有很多重载,自己可以去翻阅msdn.       BOOL

【vscode】vscode paste image插件设置

本文首发于 ❄️慕雪的寒舍 vscode编辑md文件的时候,如果想插入图片,自带的粘贴只会粘贴到当前目录下,也没有文件重命名,很不友好。 在扩展商店里面有mushan的Paste Image插件,相比自带的,更加友好一点。但是它的配置把我弄糊涂了,简单测试了一下才明白处理的逻辑。 注意,本文编写的是对mushan的Paste Image插件的教程。 首先是安装这个插件,这个不多说

pytorch时空数据处理4——图像转文本/字幕Image-Captionning(二)

pytorch时空数据处理4——图像转文本/字幕Image-Captionning(二) pytorch时空数据处理4——图像转文本/字幕Image-Captionning(二)DatasetInputs to modelCaption LengthsData pipelineEncoderAttentionDecoder代码数据集初始化 create_input_files.py训练 tr

Show,Attend and Tell: Neural Image Caption Generation with Visual Attention

简单的翻译阅读了一下 Abstract 受机器翻译和对象检测领域最新工作的启发,我们引入了一种基于注意力的模型,该模型可以自动学习描述图像的内容。我们描述了如何使用标准的反向传播技术,以确定性的方式训练模型,并通过最大化变分下界随机地训练模型。我们还通过可视化展示了模型如何能够自动学习将注视固定在显着对象上,同时在输出序列中生成相应的单词。我们通过三个基准数据集(Flickr9k,Flickr

Docker Image 命令

文章目录 目录 文章目录 1 . Docker镜像是什么? 2 . 镜像命令详解 docker images docker tag docker pull docker rmi  docker save 总结 1 . Docker镜像是什么? Docker image 本质上是一个 read-only 只读文件, 这个文件包含了文件系统、 源码、库文件、依赖、工具等一些

flutter Image

Flutter中,Image是一个用于显示图片的控件,可以显示网络图片、本地图片以及Asset中的图片。Image控件支持多种常见的图片格式,例如PNG、JPEG、GIF等。 const Image({super.key,required this.image,this.frameBuilder,this.loadingBuilder,this.errorBuilder,this.seman

C#Bitmap和Image之间的关系

Image 类 Image 是一个抽象基类,它定义了所有图像类型的共同属性和方法。它提供了图像处理的通用接口,比如获取图像的尺寸、像素格式、帧数等。Image 类本身不能被实例化,它只是提供了一个通用的框架,具体的图像类型(如位图、图标、元文件等)需要通过继承 Image 类来实现。Image 类提供了一些通用的方法,如 Save(保存图像到文件)、GetThumbnailImage(获取图像的

Image Transformation can make Neural Networks more robust against Adversarial Examples

Image Transformation can make Neural Networks more robust against Adversarial Examples 创新点 1.旋转解决误分类 总结 可以说简单粗暴有效