正文共3894个字,8张图,预计阅读时间11分钟。

Alpha版本不能很好地给未经训练的图像着色。接下来,我们将在Beta版本中做到这一点——将上面的将神经网络泛化。

以下是使用Beta版本对测试图像着色的结果。

特征提取器

我们的神经网络要做的是发现将灰度图像与其彩色版本相链接的特征。

试想,你必须给黑白图像上色,但一次只能看到9个像素。你可以从左上角到右下角扫描每个图像,并尝试预测每个像素应该是什么颜色。

例如,这9个像素就是上面那张女性人脸照片上鼻孔的边缘。要很好的着色几乎是不可能的,所以你必须把它分解成好几个步骤。

首先,寻找简单的模式:对角线,所有黑色像素等。在每个滤波器的扫描方块中寻找相同的精确的模式,并删除不匹配的像素。这样,就可以从64个迷你滤波器生成64个新图像。

如果再次扫描图像,你会看到已经检测到的相同的模式。要获得对图像更高级别的理解,你可以将图像尺寸减小一半。

你仍然只有3×3个滤波器来扫描每个图像。但是,通过将新的9个像素与较低级别的滤波器相结合,可以检测更复杂的图案。一个像素组合可能形成一个半圆,一个小点或一条线。再一次地,你从图像中反复提取相同的图案。这次,你会生成128个新的过滤图像。

经过几个步骤,生成的过滤图像可能看起来像这样:

这个过程就像大多数处理视觉的神经网络,也即卷积神经网络的行为。结合几个过滤图像了解图像中的上下文。

from keras.layers import Conv2D, Conv2DTranspose, UpSampling2D

from keras.layers import Activation, Dense, Dropout, Flatten, InputLayer

from keras.layers.normalization import BatchNormalization

from keras.callbacks import TensorBoard

from keras.models import Sequential

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img

from skimage.color import rgb2lab, lab2rgb, rgb2gray

from skimage.io import imsave

import numpy as np

import osimport random

import tensorflow as tf

Using TensorFlow backend.

# Get imagesX = []

for filename in os.listdir('data/color/Train/'):

X.append(img_to_array(load_img('data/color/Train/'+filename))) X = np.array(X, dtype=float)

# Set up train and test data

split = int(0.95*len(X)) Xtrain = X[:split] Xtrain = 1.0/255*Xtrainmodel = Sequential()

model.add(InputLayer(input_shape=(256, 256, 1))) model.add(Conv2D(64, (3, 3), activation='relu', padding='same')) model.add(Conv2D(64, (3, 3), activation='relu', padding='same', strides=2)) model.add(Conv2D(128, (3, 3), activation='relu', padding='same')) model.add(Conv2D(128, (3, 3), activation='relu', padding='same', strides=2)) model.add(Conv2D(256, (3, 3), activation='relu', padding='same')) model.add(Conv2D(256, (3, 3), activation='relu', padding='same', strides=2)) model.add(Conv2D(512, (3, 3), activation='relu', padding='same')) model.add(Conv2D(256, (3, 3), activation='relu', padding='same')) model.add(Conv2D(128, (3, 3), activation='relu', padding='same')) model.add(UpSampling2D((2, 2))) model.add(Conv2D(64, (3, 3), activation='relu', padding='same')) model.add(UpSampling2D((2, 2))) model.add(Conv2D(32, (3, 3), activation='relu', padding='same')) model.add(Conv2D(2, (3, 3), activation='tanh', padding='same')) model.add(UpSampling2D((2, 2))) model.compile(optimizer='rmsprop', loss='mse')

# Image transformerdatagen = ImageDataGenerator(        shear_range=0.2,        zoom_range=0.2,        rotation_range=20,        horizontal_flip=True)

# Generate training databatch_size = 10def image_a_b_gen(batch_size):    for batch in datagen.flow(Xtrain, batch_size=batch_size):        lab_batch = rgb2lab(batch)        X_batch = lab_batch[:,:,:,0]        Y_batch = lab_batch[:,:,:,1:] / 128        yield (X_batch.reshape(X_batch.shape+(1,)), Y_batch)

# Train model

tensorboard = TensorBoard(log_dir="data/color/output/first_run") model.fit_generator(image_a_b_gen(batch_size), callbacks=[tensorboard], epochs=1, steps_per_epoch=10)

Epoch 1/1 10/10 [==============================] - 178s - loss: 0.5208     <keras.callbacks.History at 0x1092b5ac8>

# Save modelmodel_json = model.to_json()with open("model.json", "w") as json_file:    json_file.write(model_json) model.save_weights("model.h5")

# Test imagesXtest = rgb2lab(1.0/255*X[split:])[:,:,:,0]

Xtest = Xtest.reshape(Xtest.shape+(1,)) Ytest = rgb2lab(1.0/255*X[split:])[:,:,:,1:] Ytest = Ytest / 128

print(model.evaluate(Xtest, Ytest, batch_size=batch_size))

1/1 [==============================] - 0s 0.00189386657439

color_me = []for filename in os.listdir('data/color/Test/'):    color_me.append(img_to_array(load_img('data/color/Test/'+filename))) color_me = np.array(color_me, dtype=float) color_me = rgb2lab(1.0/255*color_me)[:,:,:,0] color_me = color_me.reshape(color_me.shape+(1,))# Test modeloutput = model.predict(color_me) output = output * 128# Output colorizationsfor i in range(len(output)):    cur = np.zeros((256, 256, 3))    cur[:,:,0] = color_me[i][:,:,0]    cur[:,:,1:] = output[i]    imsave("data/color/output/img1_"+str(i)+".png", lab2rgb(cur))

/usr/local/lib/python3.6/site-packages/skimage/util/dtype.py:122: UserWarning: Possible precision loss when converting from float64 to uint8  .format(dtypeobj_in, dtypeobj_out))

原文链接:https://www.jianshu.com/p/ed4b49c2d16b

查阅更为简洁方便的分类文章以及最新的课程、产品信息,请移步至全新呈现的“LeadAI学院官网”:

www.leadai.org

请关注人工智能LeadAI公众号,查看更多专业文章

大家都在看


LSTM模型在问答系统中的应用

基于TensorFlow的神经网络解决用户流失概览问题

最全常见算法工程师面试题目整理(一)

最全常见算法工程师面试题目整理(二)

TensorFlow从1到2 | 第三章 深度学习革命的开端:卷积神经网络

装饰器 | Python高级编程

今天不如来复习下Python基础

keras学习笔记-黑白照片自动着色的神经网络-Beta版相关推荐

  1. Keras学习笔记:序列式模型

    目录: 目录: 快速开始序列(Sequential)模型 指定输入数据的shape 编译 训练 例子 用于序列分类的栈式LSTM 采用stateful LSTM的相同模型 本系列参考官方文档官方文档 ...

  2. Keras学习笔记---保存model文件和载入model文件

    Keras学习笔记---保存model文件和载入model文件 保存keras的model文件和载入keras文件的方法有很多.现在分别列出,以便后面查询. keras中的模型主要包括model和we ...

  3. 深度学习(十)keras学习笔记

    keras学习笔记 原文地址:http://blog.csdn.net/hjimce/article/details/49095199 作者:hjimce keras与torch7的使用非常相似,是最 ...

  4. Keras学习笔记:函数式模型

    目录: 目录: 函数式(Functional)模型 第一个模型:全连接网络 多输入和多输出模型 让我们用函数式模型来实现这个框图 共享层 更多的例子 inception模型 卷积层的残差连接 共享视觉 ...

  5. linux磁盘符变化autofs,Linux基础教程学习笔记之Autofs自动挂载

    Linux基础教程学习笔记之Autofs自动挂载 Autofs自动挂载: yum -y install autofs vim /etc/auto.master  在文件中添加下面行 /home/gue ...

  6. [RHCSA学习笔记]Autofs实现自动挂载NFS共享

    NFS/autofs NFS Server 服务端 systemctl status nfs-server.service systemctl status rpcbind.service vi /e ...

  7. TensorFlow2.0 学习笔记(三):卷积神经网络(CNN)

    欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 文章目录 欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 一.神经网络的基本单位:神经元 二.卷 ...

  8. TensorFlow 深度学习笔记 TensorFlow实现与优化深度神经网络

    TensorFlow 深度学习笔记 TensorFlow实现与优化深度神经网络 转载请注明作者:梦里风林 Github工程地址:https://github.com/ahangchen/GDLnote ...

  9. tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数

    tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报  分类: tensorflow(4)  目录(?)[+] 本笔记目的 ...

最新文章

  1. Java八大基本数据类型和对应的封装类型
  2. MySQL 删除视图
  3. 【报告分享】2020情趣用品线上消费趋势报告.pdf(附下载链接)
  4. 为什么rocketmq的queue分为读写?_分布式发布订阅消息系统Kafka 为什么快
  5. 【CNMP系列】CentOS7.0下安装Nginx服务
  6. Python 珍藏函数超详解:随机抽样,分层抽样,系统抽样方法汇总
  7. Win7右键没有“管理员取得所有权”选项的解决方法
  8. 大学寒假这样过,过完惊艳所有人,不只是你的宿友,mysql基础教程西泽pdf
  9. 一起Talk Android吧(第五百零七回:图片滤镜ImageFilterView)
  10. CopyFile复制单个文件和复制指定路径下所有文件
  11. MySQL 更改root密码
  12. MySQL 统计上一个自然周 周一到周日的数据 为空则补0实现
  13. java制作闪星星_【治水】怎么用java画各种星星组成的图形
  14. PostgreSql操作geometry
  15. IMU、角速度、线速度校正
  16. ECE认证机构怎么选?
  17. Failed to calculate the value of task ‘:unityLibrary:compileDebugJavaWithJavac‘
  18. sql注入php文件包含,phpshe v1.1多处SQL注入文件包含漏洞
  19. 以U-NET为例的网络构建代码实现
  20. WIFI / BT 驱动之—设备树配置

热门文章

  1. 计算机辅助设计的概念.doc,计算机辅助设计的基础知识.DOC
  2. linux time函数_Linux基础知识(三)
  3. 理一理字节对齐的那些事
  4. Java集合——概述
  5. validate 插件
  6. 《重构-改善既有代码的设计》学习笔记(二)
  7. 程序员挑战高薪,你必须会的十大面试题《一》
  8. IOS 自定义导航栏标题和返回按钮标题
  9. ArcGIS 代理产品价格以及折扣表、产品描述
  10. 目标检测的稀疏对抗攻击,代码已开源