昇思学习打卡营第31天|深度解密 CycleGAN 图像风格迁移:从草图到线稿的无缝转化
1. 简介
图像风格迁移是计算机视觉领域中的一个热门研究方向,其中 CycleGAN (循环对抗生成网络) 在无监督领域取得了显著的突破。与传统需要成对训练数据的模型如 Pix2Pix 不同,CycleGAN 不需要严格的成对数据,只需两类图片域数据,便可实现图像风格的迁移与互换。
本篇博文将通过一个实际案例演示如何使用 CycleGAN 实现从草图到目标线稿图的图像风格迁移任务,并详细介绍 CycleGAN 的模型结构、数据处理及训练过程。

2. 模型介绍
CycleGAN 的核心思想源自 "Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks" 论文。该模型在不需要成对示例的情况下,学习将源域 X 的图像转换到目标域 Y。其应用领域包括风格迁移、图像增强和域适应等任务。
2.1 CycleGAN 网络结构
CycleGAN 由两个 GAN 模型组成,其对称的架构允许在不同的域之间来回转换图像。具体而言,CycleGAN 使用两个生成器(G 和 F)和两个判别器(D_X 和 D_Y),生成器负责将域 X 的图像转换到域 Y,并通过判别器对生成结果进行真假判断。

模型架构如下:
- 生成器:生成器采用 ResNet 结构,由 9 个残差块组成,适合处理 256x256 尺寸的图片。
- 判别器:判别器通过 PatchGAN 模型检测图像的真实性,以保证生成的图像足够逼真。
2.2 循环一致性损失
CycleGAN 通过 循环一致性损失 来保证从域 X 到域 Y,再从域 Y 转换回域 X 的图像应尽可能接近原始图像。这种损失机制确保模型不会丢失重要的图像特征。

3. 数据集
本案例使用的数据集包含线稿图和草图图像,所有图片大小为 256x256 像素。数据集分为训练集和测试集,训练集包含 25654 张图片,测试集包含约 100 张线稿图片和 116 张草图图片。
4. 模型实现
4.1 生成器模型
生成器模型基于 ResNet 结构,通过卷积、反卷积及残差块实现图像风格的转换。以下是生成器的代码实现:
import mindspore.nn as nnclass ResidualBlock(nn.Cell):def __init__(self, dim):super(ResidualBlock, self).__init__()self.conv_block = nn.SequentialCell(nn.Conv2d(dim, dim, kernel_size=3, padding=1, pad_mode="pad"),nn.BatchNorm2d(dim),nn.ReLU(),nn.Conv2d(dim, dim, kernel_size=3, padding=1, pad_mode="pad"),nn.BatchNorm2d(dim))def construct(self, x):return x + self.conv_block(x)class ResNetGenerator(nn.Cell):def __init__(self, input_nc, output_nc, n_residual_blocks=9):super(ResNetGenerator, self).__init__()model = [nn.Conv2d(input_nc, 64, kernel_size=7, padding=3, pad_mode="pad"),nn.BatchNorm2d(64),nn.ReLU()]# Downsamplingmodel += [nn.Conv2d(64, 128, kernel_size=3, stride=2, padding=1),nn.BatchNorm2d(128),nn.ReLU(),nn.Conv2d(128, 256, kernel_size=3, stride=2, padding=1),nn.BatchNorm2d(256),nn.ReLU()]# Residual blocksfor _ in range(n_residual_blocks):model += [ResidualBlock(256)]# Upsamplingmodel += [nn.Conv2dTranspose(256, 128, kernel_size=3, stride=2, padding=1, output_padding=1),nn.BatchNorm2d(128),nn.ReLU(),nn.Conv2dTranspose(128, 64, kernel_size=3, stride=2, padding=1, output_padding=1),nn.BatchNorm2d(64),nn.ReLU()]model += [nn.Conv2d(64, output_nc, kernel_size=7, padding=3, pad_mode="pad"),nn.Tanh()]self.model = nn.SequentialCell(model)def construct(self, x):return self.model(x)
4.2 判别器模型
判别器基于 PatchGAN 的结构,通过卷积网络将输入图片划分为多个小的 patch,并分别进行真假判别。
class Discriminator(nn.Cell):def __init__(self, input_nc, ndf=64):super(Discriminator, self).__init__()self.model = nn.SequentialCell([nn.Conv2d(input_nc, ndf, kernel_size=4, stride=2, padding=1),nn.LeakyReLU(0.2),nn.Conv2d(ndf, ndf * 2, kernel_size=4, stride=2, padding=1),nn.BatchNorm2d(ndf * 2),nn.LeakyReLU(0.2),nn.Conv2d(ndf * 2, ndf * 4, kernel_size=4, stride=2, padding=1),nn.BatchNorm2d(ndf * 4),nn.LeakyReLU(0.2),nn.Conv2d(ndf * 4, ndf * 8, kernel_size=4, stride=1, padding=1),nn.BatchNorm2d(ndf * 8),nn.LeakyReLU(0.2),nn.Conv2d(ndf * 8, 1, kernel_size=4, stride=1, padding=1)])def construct(self, x):return self.model(x)
4.3 优化器与损失函数
CycleGAN 采用对抗性损失和循环一致性损失的组合来训练生成器和判别器。优化器选择了 Adam 优化器,学习率设置为 0.0002。
import mindspore as ms# 定义损失函数和优化器
gan_loss = nn.BCELoss()
cycle_loss = nn.L1Loss()optimizer_G = nn.Adam(generator.parameters(), learning_rate=0.0002)
optimizer_D = nn.Adam(discriminator.parameters(), learning_rate=0.0002)
5. 训练与推理
训练过程中,我们交替训练生成器和判别器。判别器通过真假样本的判别进行训练,而生成器则通过对抗判别和循环一致性进行优化。以下是一个训练步骤的实现:
def train_step(real_A, real_B):# 生成器前向计算fake_B = generator_A2B(real_A)fake_A = generator_B2A(real_B)# 判别器前向计算D_A_loss = gan_loss(discriminator_A(fake_A), Tensor(0)) + gan_loss(discriminator_A(real_A), Tensor(1))D_B_loss = gan_loss(discriminator_B(fake_B), Tensor(0)) + gan_loss(discriminator_B(real_B), Tensor(1))# 生成器损失计算cycle_A_loss = cycle_loss(generator_B2A(fake_B), real_A)cycle_B_loss = cycle_loss(generator_A2B(fake_A), real_B)G_loss = cycle_A_loss + cycle_B_loss + D_A_loss + D_B_lossoptimizer_G.step()optimizer_D.step()return G_loss, D_A_loss, D_B_loss
结语
通过本次的CycleGAN模型实践,我们深入理解了图像风格迁移的基本原理,特别是在无监督情况下如何实现两个域之间的图像转换。CycleGAN的循环一致性损失在保持图像内容一致性的同时,又能实现风格的转换,这是其在域迁移任务中广泛应用的重要原因。在整个实现过程中,不仅对生成器和判别器的构建有了更清晰的理解,同时也进一步熟悉了损失函数的优化策略。
这次实验的关键在于让模型具备在没有配对数据的情况下,也能够进行风格转换的能力。虽然实验需要较大的计算资源,但我们通过小规模数据集也能够体验到CycleGAN的强大之处。希望通过这个项目,我们不仅能掌握CycleGAN的基本原理,也能为以后的图像生成和风格迁移任务打下坚实的基础。
如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!
欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。
谢谢大家的支持!
相关文章:
昇思学习打卡营第31天|深度解密 CycleGAN 图像风格迁移:从草图到线稿的无缝转化
1. 简介 图像风格迁移是计算机视觉领域中的一个热门研究方向,其中 CycleGAN (循环对抗生成网络) 在无监督领域取得了显著的突破。与传统需要成对训练数据的模型如 Pix2Pix 不同,CycleGAN 不需要严格的成对数据,只需两类图片域数据,…...
跟我学C++中级篇——空值的定义
一、空值 在提到c/c的空值时,先扯远一些。谈一谈数学中的0,0的出现要晚于其它的数,而0的出现却引发了数学的极大的发展和进步。而在计算机科学中,在使用一个变量时,它的值的可能性有很多,其中,…...
(三)Mysql 数据库系统全解析
一、Mysql 数据库 数据库的作用和优势 作用:集中化存储结构性的数据。优势: 减小数据冗余,避免数据的重复存储。保证数据的真实有效和唯一性,提高数据的质量。方便数据共享访问,使得不同的用户和应用可以方便地获取所需…...
SAP HCM 0001信息类型一个月内有多个成本中心
一般跨部门调动时候,成本中心都会变化,SAP默认都是读取wpbp的最后一一条数据,但是今天过账会读取两个单位的成本中心,一直都觉得很奇怪,SAP如何都拆分出这样的情况, 没办法只有debug,初始化系统…...
字节输入流
1.是什么 字节输入流(Byte Input Stream)在Java中是用来读取原始字节流的数据。Java的java.io包提供了多种字节输入流类,其中InputStream是所有字节输入流类的超类。以下是关于字节输入流的详细解释和举例: 字节输入流的概念&…...
深度学习-----------------机器翻译与数据集
目录 机器翻译与数据集下载和预处理数据集预处理步骤词元化词汇表该部分总代码 固定长度阶段或填充该部分总代码 转换成小批量数据集用于训练训练模型总代码 机器翻译与数据集 import os import torch from d2l import torch as d2l下载和预处理数据集 #save d2l.DATA_HUB[fr…...
SOMEIP_ETS_151: SD_Send_triggerEventUINT8Reliable_Eventgroup_2
测试目的: 验证DUT在Tester订阅事件组后,能够响应Tester触发的triggerEventUINT8Reliable方法,并将TestEventUINT8Reliable事件发送到订阅请求中端点选项指定的IP地址和端口。 描述 本测试用例旨在确保DUT能够正确处理事件组的订阅请求&am…...
32 C 语言指针的长度与运算(指针加减整数、指针自增自减、同类型指针相减、指针的比较运算)
目录 1 指针的长度 2 指针与整数的加减运算 3 指针自增与自减 4 同类型指针相减 5 指针的比较运算 6 测试题 1 指针的长度 在 C 语言中,sizeof 运算符可以用来计算指针的长度。指针的长度实际上与指针所指向的数据类型无关,而是与系统的位数&…...
【系统架构设计师】经典论文:轮软件三层架构设计
更多内容请见: 备考系统架构设计师-核心总结目录 文章目录 摘要正文总结摘要 本人于 2022 年 1 月参与了中石化 XX 油田 XX 采油厂“用电管理系统”的项目建设,该系统建设目标是实现分单位、分线路、分系统评价、优化、考核,全面提升采油厂用 电管理水平。在该项目组中我担…...
(C语言贪吃蛇)13.实现贪吃蛇四方向的移动
目录 前言 原代码预览 解决方法⚠️ 运行效果 总结 前言 我们上节通过Linux线程实现了两个while(1)同时运行,这样就可以一边控制方向一遍刷新出贪吃蛇的身体节点了。本节我们就来实现贪吃蛇四方向的移动。 (此图片为最终效果) 原代码预览 我们之前的代码是通过…...
Spring Boot + MyBatis 项目中常用注解详解(万字长篇解读)
Spring Boot MyBatis 项目中常用注解详解 在现代Java开发中,Spring Boot和MyBatis是两大热门框架,广泛应用于构建高效、可维护的企业级应用。两者结合使用,可以充分发挥各自的优势,提高开发效率和代码质量。在这个过程中&#x…...
AWS Network Firewall -NAT网关配置只应许白名单域名出入站
1. 创建防火墙 选择防火墙的归属子网(选择公有子网) 2. 创建规则白名单域名放行 3. 绑定相关规则 继续往下拉 绑定非托管规则 4. 配置网络路由 相关规则 参考图 解释 防火墙的归属公有子网路由表规则机器实例的规则子网路由表规则nat网管路…...
【C语言系统编程】【第二部分:并发编程】2.3 实践与案例分析
2.3 实践与案例分析 2.3.1 案例分析:多线程文件搜索程序 本文中,我们将通过一个多线程文件搜索程序的案例,展示如何在实际项目中应用多线程编程技术,并具体介绍任务分解、线程创建、结果汇总及锁机制的应用。 2.3.1.1 任务分解…...
React -AppVarContext.Provider 提供者组件
AppVarContext.Provider 是一个 React 上下文提供者,通常用于在组件树中提供共享的状态或数据。下面将详细解释 AppVarContext.Provider 的作用和如何使用它。展示如何使用 AppVarContext.Provider 来管理全局状态 1. 什么是上下文(Context)…...
【Python】解密用户代理:使用 Python User Agents 库探索浏览器和设备信息
Python User Agents 是一个专为解析 User Agent 字符串而设计的 Python 库。它能够轻松识别访问设备的类型(如移动设备、桌面设备或平板),并获取设备、浏览器、操作系统等详细信息。借助它,开发者可以更好地了解访问用户的设备属性…...
以串口接口为例介绍关于BSP底层架构开发的迭代过程
以串口接口为例介绍关于BSP底层架构开发的迭代过程 文章目录 以串口接口为例介绍关于BSP底层架构开发的迭代过程架构概述初代BSP二代BSP:三代BSP:四代BSP:架构概述 单片机开发有四个阶段: 阶段一:单一单片机的功能实现阶段 此阶段你开始熟悉STM32F1系列的单片机,并利用…...
Label-Studio ML利用yolov8模型实现自动标注
引言 Label Studio ML 后端是一个 SDK,用于包装您的机器学习代码并将其转换为 Web 服务器。Web 服务器可以连接到正在运行的 Label Studio 实例,以自动执行标记任务。我们提供了一个示例模型库,您可以在自己的工作流程中使用这些模型&#x…...
【PostgreSQL】实战篇——用户管理、角色和权限控制的高级用法及技巧
数据库中用户管理、角色和权限控制不仅仅是基础的安全措施,更是实现复杂应用需求和优化数据库性能的重要手段。 通过深入理解这些概念,数据库管理员可以更有效地管理用户访问、确保数据安全,并优化系统性能。以下是对这些概念的详细介绍以及…...
Leetcode: 0011-0020题速览
Leetcode: 0011-0020题速览 本文材料来自于LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解 遵从开源协议为知识共享 版权归属-相同方式…...
Hive数仓操作(七)
一、 Hive动态分区表 1. 动态分区与静态分区的区别 分区定义: 静态分区:在插入数据时,需要手动指定分区字段的值。动态分区:分区字段的值是根据数据中的某个字段自动生成的,用户只需指定分区字段的类型。 数据加载方…...
AI手势识别与追踪:Android端5分钟快速集成教程(附彩虹骨骼效果)
AI手势识别与追踪:Android端5分钟快速集成教程(附彩虹骨骼效果) 1. 引言 1.1 手势识别的价值 想象一下,不用触碰屏幕就能控制手机——这不是科幻电影,而是AI手势识别技术带来的真实体验。从智能家居控制到AR游戏交互…...
昆明波纹管供应商哪个好
在市政排水、农田灌溉、通信保护等工程领域,HDPE双壁波纹管因其优异的环刚度、耐腐蚀性和施工便捷性,已成为不可或缺的关键建材。然而,面对市场上琳琅满目的供应商,尤其是在地质气候条件独特的西南地区,如何选择一个真…...
2025_NIPS_RT V-Bench: Benchmarking MLLM Continuous Perception, Understanding and Reasoning through R
文章主要内容与创新点总结 一、主要内容 本文针对现有基准测试无法充分评估多模态大语言模型(MLLMs)在动态真实环境中持续感知、理解和推理能力的问题,提出了实时视频分析基准测试集RT V-Bench。该基准包含552个多样化视频(总时长167.2小时)和4631个高质量问答对,涵盖智…...
SEO_快速诊断并解决网站SEO问题的常见方法(164 )
快速诊断网站SEO问题的有效方法 在当今数字化时代,网站的SEO(搜索引擎优化)问题不仅关乎网站的流量,更直接影响到业务的发展。对于许多网站来说,SEO问题往往是隐藏在表面现象背后的复杂问题。因此,快速诊断…...
3个核心方案:开源工具ncmdumpGUI如何让网易云音乐文件自由播放
3个核心方案:开源工具ncmdumpGUI如何让网易云音乐文件自由播放 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 当我们下载了心爱的音乐,…...
从一次RDP爆破到全网挖矿:复盘Windows Server 3389端口的安全加固与监控策略
Windows Server 3389端口安全防御体系:从RDP爆破到挖矿攻击的全链路防护 最近处理了一起典型的服务器入侵事件:攻击者通过RDP暴力破解获取管理员权限后,在服务器上部署了挖矿程序。这种攻击模式看似简单,却暴露出许多企业在Windo…...
AI Agent自我进化底层教程(非常详细),收藏这一篇就够了!
一句话讲清楚👉🏻 MemSkill通过可学习和演进的"记忆技能"系统,让AI Agent能够动态选择和优化记忆操作,实现真正的自我进化。 背景:AI Agent的记忆困境 2026年,AI Agent已经成为人工智能领域最热…...
多图拼长条与宫格拼接批处理备忘
手头有一批产品白底图,需要批量产出两类物料:一类是横向四连图做详情对比,一类是 22 宫格做缩略封面。统一用【批量图片拼接工具】走完,下面只记参数组合和踩坑点,不写实现细节。输入侧是「主文件夹」路径,…...
Verilog有限状态机实战:5分钟搞定红绿灯控制器(附完整代码)
Verilog有限状态机实战:从红绿灯控制器掌握FPGA设计精髓 红绿灯控制器是数字电路设计的经典案例,也是学习Verilog有限状态机(FSM)的最佳切入点。作为FPGA初学者,你可能已经看过各种理论讲解,但真正动手时依…...
从参数化几何到气动分析:OpenVSP航空设计工具深度解析
从参数化几何到气动分析:OpenVSP航空设计工具深度解析 【免费下载链接】OpenVSP A parametric aircraft geometry tool 项目地址: https://gitcode.com/gh_mirrors/ope/OpenVSP 在航空工程领域,如何将概念设计快速转化为可分析的几何模型一直是技…...
