欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

什么?AI黑白图像能够自动上色?

程序员文章站 2022-05-22 09:46:51
...

 

什么?AI黑白图像能够自动上色?

 

作者 | 李秋键

责编 | 刘静

出品 | CSDN(ID:CSDNnews)

本篇文章将利用GAN算法的pixpix模型实现对黑白图片进行上色。下面简单介绍一下图片像素知识,和黑白图像一样,彩色图像中的每一层,也有~的值。值表示这个层中没有颜色。如果像素网格所有颜色通道的值都为,那么这个图像像素就是黑色的。神经网络在输入值和输出值之间创建了一种关系。为了能够更为准确地完成着色任务,网络需要找到能够将灰度图像和彩色图像联系起来的特征。

总的来说就是,我们需要找到能够将灰度值网格链接到三个颜色网格的特征。

 

什么?AI黑白图像能够自动上色?

f()是神经网络,[B&W]是我们的输入,[R]、[G]、[B]是我们的输出

现在,随着数据集的增加,由于我们处理的是高分辨率图像,因此我们需要更多的计算能力。为此,我们使用 Deep Cognition 的 Deep Learning Studio jupyter notebooks,它为Amazon 的深度学习示例提供了GPU,可用来训练模型。

下面简单介绍下GAN,GAN 充分发挥“对抗过程”训练两个人工神经网络,这两个互联网不会相互博弈论以后超过一种完美的平衡态,我们这个范例中的的警员和犯罪者就相等于这两个人工神经网络。其中一个人工神经网络叫作建模神经网 S(T),它会用于输出随机噪声统计数据,分解和有数统计数据集十分相似的统计数据;另一个人工神经网络叫鉴别器生成网 E(X-),它会以分解的统计数据作为输出,试图辨别出有哪些是分解的统计数据,哪些是现实统计数据。鉴别器的架构是构建二元归类,输入的结果是输出统计数据来自现实统计数据集(和制备统计数据或欺诈统计数据比较)的机率。

整个步骤的目的变量从意义上可以写为:

什么?AI黑白图像能够自动上色?

 

我们在后面所说的 GAN 最后能超过一种完美的平衡态,是所指建模应当能仿真现实的统计数据,鉴别器输入的机率应当为 0.5, 即分解的统计数据和现实统计数据完全一致。理论上,它不确认来自建模的新的统计数据是现实还是欺诈,二者的机率大于。

如果需要自定义数据集,可以通过在 train 文件夹中上传高分辨率的彩色图像然后黑白图片从彩色图像单通道提取即可。

建立数据集如下图所示:

 

什么?AI黑白图像能够自动上色?

然后导入所有的库

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import tensorflow as tf
import numpy as np
import argparse
import os
import json
import glob
import random
import collections
import math
import time

接着建立网络层,以及生成器和判别器的对抗性网络

with tf.variable_scope("layer_1"):
       convolved = discrim_conv(input, a.ndf, stride=2)
       rectified = lrelu(convolved, 0.2)
       layers.append(rectified)

   # layer_2: [batch, 128, 128, ndf] => [batch, 64, 64, ndf * 2]
   # layer_3: [batch, 64, 64, ndf * 2] => [batch, 32, 32, ndf * 4]
   # layer_4: [batch, 32, 32, ndf * 4] => [batch, 31, 31, ndf * 8]
   for i in range(n_layers):
       with tf.variable_scope("layer_%d" % (len(layers) + 1)):
           out_channels = a.ndf * min(2**(i+1), 8)
           stride = 1 if i == n_layers - 1 else 2  # last layer here has stride 1
           convolved = discrim_conv(layers[-1], out_channels, stride=stride)
           normalized = batchnorm(convolved)
           rectified = lrelu(normalized, 0.2)
           layers.append(rectified)

   # layer_5: [batch, 31, 31, ndf * 8] => [batch, 30, 30, 1]
   with tf.variable_scope("layer_%d" % (len(layers) + 1)):
       convolved = discrim_conv(rectified, out_channels=1, stride=1)
       output = tf.sigmoid(convolved)
       layers.append(output)

   return layers[-1]

with tf.variable_scope("generator"):
   out_channels = int(targets.get_shape()[-1])
   outputs = create_generator(inputs, out_channels)

# create two copies of discriminator, one for real pairs and one for fake pairs
# they share the same underlying variables
with tf.name_scope("real_discriminator"):
   with tf.variable_scope("discriminator"):
       # 2x [batch, height, width, channels] => [batch, 30, 30, 1]
       predict_real = create_discriminator(inputs, targets)

with tf.name_scope("fake_discriminator"):
   with tf.variable_scope("discriminator", reuse=True):
       # 2x [batch, height, width, channels] => [batch, 30, 30, 1]
       predict_fake = create_discriminator(inputs, outputs)

with tf.name_scope("discriminator_loss"):
   # minimizing -tf.log will try to get inputs to 1
   # predict_real => 1
   # predict_fake => 0
   discrim_loss = tf.reduce_mean(-(tf.log(predict_real + EPS) + tf.log(1 - predict_fake + EPS)))

with tf.name_scope("generator_loss"):
   # predict_fake => 1
   # abs(targets - outputs) => 0
   gen_loss_GAN = tf.reduce_mean(-tf.log(predict_fake + EPS))
   gen_loss_L1 = tf.reduce_mean(tf.abs(targets - outputs))
   gen_loss = gen_loss_GAN * a.gan_weight + gen_loss_L1 * a.l1_weight

with tf.name_scope("discriminator_train"):
   discrim_tvars = [var for var in tf.trainable_variables() if var.name.startswith("discriminator")]
   discrim_optim = tf.train.AdamOptimizer(a.lr, a.beta1)
   discrim_grads_and_vars = discrim_optim.compute_gradients(discrim_loss, var_list=discrim_tvars)
   discrim_train = discrim_optim.apply_gradients(discrim_grads_and_vars)

with tf.name_scope("generator_train"):
   with tf.control_dependencies([discrim_train]):
       gen_tvars = [var for var in tf.trainable_variables() if var.name.startswith("generator")]
       gen_optim = tf.train.AdamOptimizer(a.lr, a.beta1)
       gen_grads_and_vars = gen_optim.compute_gradients(gen_loss, var_list=gen_tvars)
       gen_train = gen_optim.apply_gradients(gen_grads_and_vars)

现在,我们必须调整图像的大小来适应 Inception 模型。然后根据模型对像素和颜色值使用预处理器进行格式化。在最后一步中,我们通过 Inception 网络运行它并提取模型的最后一层。

神经网络进行训练后,做出最终的预测,并将其转化为图像。

在这里,我们使用一个灰度图像作为输入,并通过训练好的神经网络来运行它。我们取在 - ~  之间所有的输出值,然后乘以 ,就得到了 Lab 色谱中正确的颜色。

最后,用 三层  填充得到一个黑色的 RGB 画布。然后从测试图像中,复制灰度图层。然后将这两个颜色层添加到 RGB 画布上。再将这个像素值数组转换为图片。

最终达到的预测效果如图所示

 

什么?AI黑白图像能够自动上色?

下面简单介绍下GAN的应用广泛:

事实上随着GAN理论的不断完善,GAN逐渐展现出了自己非凡的魅力,在一些应用领域开始大放异彩,由此衍生了一些非常fancy的应用。

1. 图像生成:GAN是一个生成模型,可以用来生成图像、音频等等,并且生成质量逐年增加,

2.图像转换:

一般的GAN的生成器G输入是一个随机向量,输出的是图像,这里的生成器的输入是图像,输出的是转换后的图像。 说到这里,就需要提到cycle-GAN了,可以实现风景画和油画互变,马和斑马互相转换等等任务,cycleGAN的主要贡献是提供了一种无监督的图像翻译方法,这是pix2pix所做不到的 。

3. 图像合成:

图像合成这个特殊任务是通过某种方式的影像叙述创立新的影像的步骤。pix2pix和cycleGAN 都归属于图像合成各个领域的一部分。影像制备也有一些类似于的管理工作,并且有很nice的应用于桥段。

首先,第一个桥段制备,此部份在于如何等价部份表明桥段的数据还原成出有现实的桥段数据,比如根据拆分影像还原成出有完整桥段数据,恰好是影像拆分的变步骤,据传英伟达在大大的拓展这个朝向,一下,只要GAN还原成的桥段充足现实,几乎可以仿真飞行器的交通状况桥段,从而在的实验室下一阶段就可以已完成飞行器摩托车的下车试验管理工作,很nice的一个应用于,但是面临的难题就是如何分解成像的和充足现实的影像,此部份管理工作可以闻pix2pixHD。

4. 文本到图像的合成

这个方向是NLP与CV碰撞的结果,任务描述为:从给定的一段文字描述,生成一张和图像文字匹配的图像。比如:根据文字:一只黑色冠冕和黄色喙的白色的鸟,生成一张图像。

5. 图像超分辨率:

图像超分辨率一直是一个很重要的研究课题,比较重要的是对天文图像和卫星图像做超分辨率,不管是在天文,军事还是其他方面,都有很重要的应用。

作者简介:李秋键,CSDN 博客专家,CSDN达人课作者。

声明:本文为作者原创投稿,未经允许请勿转载。