Tensorflow2.0 十行代码实现SRCNN

11 篇文章 7 订阅
6 篇文章 0 订阅

超分辨率技术(Super-Resolution, SR)是指从观测到的低分辨率图像重建出相应的高分辨率图像,在监控设备、卫星图像和医学影像等领域都有重要的应用价值。

SRCNN是深度学习用在超分辨率重建上的开山之作(Image Super-Resolution Using Deep Convolutional Networks),SRCNN的网络结构非常简单,仅仅用了三个卷积层,网络结构如下图所示。


SRCNN首先使用双三次(bicubic)插值将低分辨率图像放大成目标尺寸,接着通过三层卷积网络拟合非线性映射,最后输出高分辨率图像结果。本文中,作者将三层卷积的结构解释成三个步骤:图像块的提取和特征表示,特征非线性映射和最终的重建。

三个卷积层使用的卷积核的大小分为为9x9,,1x1和5x5,前两个的输出特征个数分别为64和32。用Timofte数据集(包含91幅图像)和ImageNet大数据集进行训练。使用均方误差(Mean Squared Error, MSE)作为损失函数,有利于获得较高的PSNR。

以上引自(有改动):从SRCNN到EDSR,总结深度学习端到端超分辨率方法发展历程

 SRCNN代码使用Cifar10数据集,由32*32*3无损放大为128*128*3,以下全部代码Github

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

inputs = keras.Input(shape=(128, 128, 3), name='img')

x = layers.Conv2D(
    filters=64,             # 卷积层神经元(卷积核)数目
    kernel_size=9,          # 感受野大小
    padding='same',         # padding策略(vaild 或 same)
    activation=tf.nn.relu   # 激活函数
)(inputs)

x = layers.Conv2D(
    filters=32,      
    kernel_size=1,
    padding='same',  
    activation=tf.nn.relu
)(x)

outputs = layers.Conv2D(
    filters=3,
    kernel_size=5,          
    padding='same'          # 不设置激活函数
)(x)

model = keras.Model(inputs=inputs, outputs=outputs, name='SRCNN_model')# 通过在图层图中指定其输入和输出来创建一个model
  
model.summary() # 查看模型摘要,需要模型built(实例化)后调用
Model: "SRCNN_model"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
img (InputLayer)             [(None, 128, 128, 3)]     0         
_________________________________________________________________
conv2d (Conv2D)              (None, 128, 128, 64)      15616     
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 128, 128, 32)      2080      
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 128, 128, 3)       2403      
=================================================================
Total params: 20,099
Trainable params: 20,099
Non-trainable params: 0
_________________________________________________________________

加载数据

import cv2 as cv
import numpy as np

'''
CIFAR10 had't 128*128*3 images use bicubic alternatived,and bicubic use nearest alternatived.
X_: image applied bicubic interpolation (low-resolution),(50000, 128, 128, 3)
y_: image with original resolution (high-resolution),(10000, 128, 128, 3)
'''

ishape = 128

# load data
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.cifar10.load_data()

# 缩小数据集,控制内存占用(以下win10,8G内存可用)
train_image = train_images[0:10000]
test_image  = test_images[0:1000]

X_train = np.array([cv.resize(i,(ishape,ishape), interpolation=cv.INTER_NEAREST) for i in train_image]) / 255.
X_test  = np.array([cv.resize(i,(ishape,ishape), interpolation=cv.INTER_NEAREST) for i in test_image]) / 255.

y_train = np.array([cv.resize(i,(ishape,ishape), interpolation=cv.INTER_CUBIC) for i in train_image]) / 255.
y_test  = np.array([cv.resize(i,(ishape,ishape), interpolation=cv.INTER_CUBIC) for i in test_image]) / 255.

开始训练 

model.compile(optimizer=tf.keras.optimizers.Adam(0.01),
              loss='mse',       
              metrics=['mae'])    # 编译

history = model.fit(X_train, y_train,
                    batch_size=64,
                    epochs=3,
                    validation_split=0.2)# 训练

test_scores = model.evaluate(X_test, y_test, verbose=2) # 评估

print('Test loss:', test_scores[0])
print('Test mae:', test_scores[1])

# Save entire model to a HDF5 file
model.save('SRCNN.h5')

 开始应用

from matplotlib import pyplot as plt

ishape = 128

#加载放大图像并显示
img = cv.imread('automobile.png')

img = cv.cvtColor(img, cv.COLOR_BGR2RGB)

img = cv.resize(img,(ishape,ishape), interpolation=cv.INTER_NEAREST)# (36,36,3)->(128,128,3)

plt.imshow(img)

plt.xticks([]), plt.yticks([])

plt.show()

 原图像:

img = np.reshape(img,(1,ishape,ishape,3)) / 255.

# 处理图像超分辨率
img_SR = model.predict(img)

plt.imshow(img_SR[0])

plt.xticks([]), plt.yticks([])

plt.show()

SRCNN处理后图像: 

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
### 回答1: 要在TensorFlow 2.中运行1.代码,您需要使用TensorFlow 1.x兼容性模块。这个模块可以让您在TensorFlow 2.中使用1.代码,但是您需要注意一些细节,例如变量初始化和会话管理。您可以使用以下代码导入兼容性模块: ``` import tensorflow.compat.v1 as tf tf.disable_v2_behavior() ``` 然后,您可以使用1.代码,例如: ``` x = tf.placeholder(tf.float32, shape=[None, 784]) W = tf.Variable(tf.zeros([784, 10])) b = tf.Variable(tf.zeros([10])) y = tf.nn.softmax(tf.matmul(x, W) + b) ``` 请注意,您需要使用`tf.Session()`来运行计算图: ``` with tf.Session() as sess: sess.run(tf.global_variables_initializer()) result = sess.run(y, feed_dict={x: input_data}) ``` 希望这可以帮助您在TensorFlow 2.中运行1.代码。 ### 回答2: 在TensorFlow 2.0中运行1.0版本的代码有一些注意事项。由于TensorFlow 2.0是向后兼容的,可以运行1.0版本的代码,但需要进行一些修改。TensorFlow 2.0默认使用了eager execution(即即时执行)模式,而1.0版本默认使用了静态图模式。以下是几个需要注意的地方: 1. 导入库:在TensorFlow 2.0中,需要使用`import tensorflow.compat.v1 as tf`来导入1.0版本的tensorflow库。这样可以确保使用1.0版本的API和函数。 2. 静态图模式:TensorFlow 2.0的默认模式是即时执行模式(eager execution),如果想要使用1.0版本的静态图模式,需要使用`tf.compat.v1.disable_eager_execution()`来禁用即时执行。 3. placeholder:在TensorFlow 2.0中,`tf.placeholder`已经被移除了。可以使用`tf.compat.v1.placeholder`来代替。 4. Session:在TensorFlow 2.0中,可以直接运行张量,不再需要Session。如果代码中有`Session`相关的操作,需要将其修改为直接执行相应的操作。 5. 变量声明:在TensorFlow 2.0中,`tf.Variable`的默认行为有一些变化。如果想要使用1.0版本的变量声明行为,可以使用`tf.compat.v1.Variable`来代替。 需要注意的是,并非所有1.0版本的代码都可以无修改地在2.0版本上运行,特别是那些使用了一些被废弃的API和函数的代码。因此,在运行1.0版本的代码时,需要根据代码的具体情况进行相应的修改和调整,以确保代码TensorFlow 2.0上能够正常运行。 ### 回答3: TensorFlow 2.0是相对于早期版本的重大升级,其中包含了许多新特性和改进。因此,如果要在TensorFlow 2.0中运行1.0的代码,可能会遇到一些兼容性问题。以下是一些可能需要处理的问题: 1. 语法差异:TensorFlow 2.0对许多API进行了重大的修改和重命名。因此,1.0版本的代码可能包含已被弃用或删除的函数和参数。需要修改代码以适应新的API。 2. Eager Execution:TensorFlow 2.0默认启用了Eager Execution,这是一个即时执行模式。而1.0版本默认使用的是图计算模式。因此,在运行1.0代码时,可能需要禁用Eager Execution或者修改代码以适应新的执行模式。 3. Keras集成:TensorFlow 2.0将Keras作为其主要的高级API。因此,如果1.0代码使用了其他的高级API,可能需要将其转换为Keras的形式,并使用新的Keras API进行模型构建和训练。 4. 数据集处理:TensorFlow 2.0引入了tf.data API,用于高效处理和预处理数据集。1.0版本中的代码可能使用了不同的数据处理方式,需要修改以适应新的API。 总之,将1.0代码迁移到TensorFlow 2.0需要根据具体的代码进行相应的调整和修改,以适应新版本的语法和功能。但是,由于TensorFlow团队一直致力于保持向后兼容性,因此许多代码可以在2.0版本中无修改地继续运行。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值