pix是什么意思(pixio)

本文会介绍cGAN和pix2pix,并在TensorFlow中使用pix2pix模型。一、cGAN原理使用GAN可以无监督生成全新的图片,比如使用GAN生成MNIST数字,虽然可以生成数字,但是不能生成确定的数字。如果希望控制生成的结果,例如生成数字1,此时就要用到cGAN了。cGAN的全称为ConditionalGenerativeAdversarialNet…

大家好,又见面了,我是你们的朋友全栈君。

本文会介绍cGAN和pix2pix,并在 TensorFlow 中使用 pix2pix 模型。

 

一、cGAN原理

使用GAN可以无监督生成全新的图片,比如使用GAN生成MNIST数字,虽然可以生成数字,但是不能生成确定的数字。如果希望控制生成的结果,例如生成数字1,此时就要用到cGAN了。

cGAN 的全称为 Conditional Generative Adversarial Networks, 即条件对抗生成网 络,它为生成器、判别器都额外加入了一个条件 y, 这个条件实际是希望生成的标签 。 生成器 G 必须要生成和条件 y 匹配的样本,判别器不仅要判别图像是否真实,还要判别图像和条件y是否匹配。cGAN的输入输出为:

(1)生成器 G, 输入一个噪声 z, 一个条件 y,输出符合该条件的图像 G(z[y)。

(2)判别器 D ,输入一张图像、一个条件 y,输出该图像在该条件下的真实概率 D(x[y)。

cGAN损失定义:在GAN的优化目标中加入条件y,即:pix是什么意思(pixio)

 

二、pix2pix模型的原理

在自然语言处理领域,机器翻译,也就是将中文译成英文,对应的,在图像领域,也有图像翻译。例如:将白天的图片转换为夜晚的图片、将街景的标注图像变为真实图片。使用pix2pix可以处理这类问题,模型结构如下:

pix是什么意思(pixio)

它是一种特殊的cGAN,设要将 Y类型的图像转换为 X类型的图像, G、 D 的任务分别为 :

(1)G 的输入是一个 Y类图像y (条件y) ,输出为生成图像 G(y)。

(2)D 的输入为一个X类图像x,一个 y类图像y。D需要判断x图像是否是真正的y对应的图像,并输出一个概率。

模型损失定义为:L1+cGAN。实验中发现,在生成图像和真实图像中加入L1/L2损失,可以加速模型收敛以及提高准确率。

在pix2pix2提出一种PatchGAN的思想:PatchGAN 对图片中每个 NxN 的小块计算概率, 然后再将这些概率求平均值作为整体的输出,这样做可以加快计算速度以及加快收敛。

 

三、TensorFlow中的pix2pix模型

1、执行已有数据集

Facades数据集包含了建筑的外观图像和建筑的标注 。 建筑的标注同样是图像形式,用不同颜色的色块表示不同的类别。Facades 数据集将建筑外观分为墙壁、窗户、门、檐口等 12 个类别。下载Facades 数据集:python tools/download-dataset.py facades

pix是什么意思(pixio)

所有的样本图像都是两张图片拼接起来的,训练时,可以将A类图像翻译成B类图像。本例将标注图像生成真实图像,运行命令:

python pix2pix.py
--mode train # 表示从头训练模型 test表示用已有模型测试
--output_dir facades_train # 保存模型的位置
--max_epochs 200 # epoch数
--input_dir facades/train/ # 训练数据
--which_direction BtoA # 翻译方向

训练结束后,使用命令进行测试:

python pix2pix.py
--mode test # 用已有模型测试
--output_dir facades_test # 保存所有图片的测试结果
--input_dir facades/val # 训练数据
--checkpoint facades_train # 之前保存模型的位置,表示从此处恢复模型

执行测试后,在 facades_test 文件夹下,会产生一个 index.html 文件 。 打开后可以看到一个可视化展示生成结果的网页。

 

2、创建自己的数据集

通过程序,将训练数据也整理为之前所说的 A、 B 图像并列排列的形式,用对应的指令进行训练和测试,相应代码在process.py文件中。

(1)将图片缩放到同样的大小

def resize(src):
    height, width, _ = src.shape
    dst = src
    if height != width:
        if a.pad:
            size = max(height, width)
            # pad to correct ratio
            oh = (size - height) // 2
            ow = (size - width) // 2
            dst = im.pad(image=dst, offset_height=oh, offset_width=ow, target_height=size, target_width=size)
        else:
            # crop to correct ratio
            size = min(height, width)
            oh = (height - size) // 2
            ow = (width - size) // 2
            dst = im.crop(image=dst, offset_height=oh, offset_width=ow, target_height=size, target_width=size)

    assert(dst.shape[0] == dst.shape[1])

    size, _, _ = dst.shape
    if size > a.size:
        dst = im.downscale(images=dst, size=[a.size, a.size])
    elif size < a.size:
        dst = im.upscale(images=dst, size=[a.size, a.size])
    return dst

(2)转换图像井合并

对 A 类图像做某种操作以生成对应的 B 类图像,并将转焕后的图像合起来变成一个训练样本。比如将A图像挖去一部分成为B图像,再合并。

pix是什么意思(pixio)

# 填充部分图像为空白
def blank(src):
    height, width, _ = src.shape
    if height != width:
        raise Exception("non-square image")

    image_size = width
    size = int(image_size * 0.3)
    offset = int(image_size / 2 - size / 2)

    dst = src
    dst[offset:offset + size,offset:offset + size,:] = np.ones([size, size, 3])
    return dst
# 合并
def combine(src, src_path):
    if a.b_dir is None:
        raise Exception("missing b_dir")

    # find corresponding file in b_dir, could have a different extension
    basename, _ = os.path.splitext(os.path.basename(src_path))
    for ext in [".png", ".jpg"]:
        sibling_path = os.path.join(a.b_dir, basename + ext)
        if os.path.exists(sibling_path):
            sibling = im.load(sibling_path)
            break
    else:
        raise Exception("could not find sibling image for " + src_path)

    # make sure that dimensions are correct
    height, width, _ = src.shape
    if height != sibling.shape[0] or width != sibling.shape[1]:
        raise Exception("differing sizes")
    
    # convert both images to RGB if necessary
    if src.shape[2] == 1:
        src = im.grayscale_to_rgb(images=src)

    if sibling.shape[2] == 1:
        sibling = im.grayscale_to_rgb(images=sibling)

    # remove alpha channel
    if src.shape[2] == 4:
        src = src[:,:,:3]
    
    if sibling.shape[2] == 4:
        sibling = sibling[:,:,:3]

    return np.concatenate([src, sibling], axis=1)

(3)分割数据集,把数据集分割为训练集和验证集

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128999.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Fiori介绍_fil简介

    Fiori介绍_fil简介为什么写这篇文章Fiori作为SAP最新以及将来的趋势平台,目前发展的非常快,作为一个FIORI技术的关注者,也一直想写点东西来介绍一下.前几天公司组织了一次Fiori的讲座,我作为主讲也参考SAP的介绍制作了一份PPT,在博客也分享出来,大家拿去用吧.SAP前端方案一句话:尽量简单,尽量根据个人的需求而定制.SAPFIORI简介FIORI是什么新的面孔面向所有用户跨平台FIORI应用

    2025年8月8日
    6
  • JavaScript数组方法详解

    JavaScript数组方法详解JavaScript数组方法详解JavaScript中数组的方法种类众多,在ES3-ES7不同版本时期都有新方法;并且数组的方法还有原型方法和从object继承的方法,这里我们只介绍数组在每个版本中

    2022年7月2日
    29
  • JAVA位移运算「建议收藏」

    JAVA位移运算「建议收藏」1、java将负整数转成二进制这里以8位为例,只是为了表明过程,实际中java的int类型是4byte,也就是32位。二进制的首位是符号位,0表示正数,1表示负数,在java中,会对负数进行取反加一操作,进而计算出实际的十进制值。如10101010,此8位的二进制数首位是1,表示负数,所以对后面的七位进行取反加一操作,即0101010–>1010110,换成十进制的数就是86,再加上首位的1表示负数,结果就是-86。2、位移运算1)正数的右移:如10>>2,左边自动补0,右边移出

    2025年5月28日
    4
  • php页面最大执行时间 set_time_limit函数不起作用

    php页面最大执行时间 set_time_limit函数不起作用

    2021年10月18日
    37
  • java中map转json[通俗易懂]

    java中map转json[通俗易懂]在日常的使用中,我们一般会遇到map转json,如果遍历的话会浪费大量的时间,其实我们拥有这样的jar包Themethod ***isundefinedforthetypeJSONObject缺哪个包——json-lib.jar这样还是不行的需要一个依赖的jar包要不然会报错java.lang.ClassNotFoundException:

    2022年6月20日
    57
  • Mybatis模糊查询的四种方式

    Mybatis模糊查询的四种方式Mybatis 模糊查询的四种方式 1 根据姓名模糊查询员工信息 1 1 方式一步骤一 编写配置文件步骤二 测试步骤三 分析此种方式需要在调用处手动的去添加 通配符 1 2 方式二说明 使用方式一可以实现模糊查询 但是有一点不方便的地方就是 在测试类中 调用 selectList 方法传参时需要调用者手动的添加 号通配符 显然是麻烦的 能否在映射配置文件中直接将 号写好呢 有的朋友可能会这么想 好办 直接在配置文件中这么写 形如 1 测试后发现 程序会报错 原因是 缺少单引号 这个

    2025年7月24日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号