pythonb超分辨成像_深度原理与框架-图像超分辨重构-tensorlayer
圖像超分辨重構(gòu)的原理,輸入一張像素點(diǎn)少,像素較低的圖像, 輸出一張像素點(diǎn)多,像素較高的圖像
而在作者的文章中,作者使用downsample_up, 使用imresize(img, []) 將圖像的像素從原理的384,384降低到96, 96, 從而構(gòu)造出高水平的圖像和低水平的圖像
作者使用了三個(gè)部分構(gòu)成網(wǎng)絡(luò),
第一部分是生成網(wǎng)絡(luò),用于進(jìn)行圖片的生成,使用了16層的殘差網(wǎng)絡(luò),最后的輸出結(jié)果為tf.nn.tanh(),即為-1, 1, 因?yàn)閳D像進(jìn)行了-1,1的預(yù)處理
第二部分是判別網(wǎng)絡(luò), 用于進(jìn)行圖片的判別操作,對(duì)于判別網(wǎng)絡(luò)而言,是希望將生成的圖片判別為假,將真的圖片判別為真
第三部分是VGG19來(lái)提取生成圖片和真實(shí)圖片的conv5層卷積層的輸出結(jié)果,用于生成局部部位的損失值mse
損失值說(shuō)明:
d_loss:
d_loss_1: tl.cost.sigmoid_cross_entropy(logits_real, tf.ones_like(logits_real))? # 真實(shí)圖像的判別結(jié)果的損失值
d_loss_2: tl.cost.sigmoid_cross_entrpopy(logits_fake, tf.zeros_like(logits_real)) # 生成圖像的判別結(jié)果的損失值
g_loss:
g_gan_loss: 1e-3 * tl.cost.sigmoid_cross_entropy(logits_fake, tf.ones_like(logits_real))? # 損失值表示為 -log(D(g(lr))) # 即生成的圖像被判別為真的損失值
mse_loss: tl.cost.mean_squared_error(net_g.outputs, t_target_image)? # 計(jì)算真實(shí)值與生成值之間的像素差
vgg_loss: tl.cost.mean_squared_error(vgg_predict_emb.outputs, vgg_target_emb.outputs) # 用于計(jì)算生成圖片和真實(shí)圖片經(jīng)過(guò)vgg19的卷積層后,特征圖之間的差異,用來(lái)獲得特征細(xì)節(jié)的差異性
訓(xùn)練說(shuō)明:
首先進(jìn)行100次迭代,用來(lái)優(yōu)化生成網(wǎng)絡(luò),使用tf.train.AdamOptimer(lr_v, beta1=beta1).minimize(mse_loss, var_list=g_var)
等生成網(wǎng)絡(luò)迭代好以后,開(kāi)始迭代生成網(wǎng)絡(luò)和判別網(wǎng)絡(luò),以及VGG19的損失值縮小
生成網(wǎng)絡(luò):使用了16個(gè)殘差模塊,在殘差模塊的輸入與下一層的輸出之間又進(jìn)行一次殘差直連
判別網(wǎng)絡(luò):使用的是feature_map遞增的卷積層構(gòu)造成的判別網(wǎng)路
代碼說(shuō)明:
第一步:將參數(shù)從config中導(dǎo)入到main.py
第二步:使用tl.file.exists_or_mkdir() 構(gòu)造用于儲(chǔ)存圖片的文件夾,同時(shí)定義checkpoint的文件夾
第三步:使用sorted(tl.files.load_file_list) 生成圖片的列表, 使用tl.vis.read_images() 進(jìn)行圖片的讀入
第四步:構(gòu)建模型的構(gòu)架Model
第一步:定義輸入?yún)?shù)t_image = tf.placeholder('float32', [batch_size, 96, 96, 3]), t_target_image = tf.placeholder('float32', [batch_size, 384, 384, 3])
第二步: 使用SGRAN_g 用來(lái)生成最終的生成網(wǎng)絡(luò),net_g, 輸入?yún)?shù)為t_image, is_training, reuse
第三步: 使用SGRAN_d 用來(lái)生成判別網(wǎng)絡(luò),輸出結(jié)果為net_d網(wǎng)絡(luò)架構(gòu),logits_real, 輸入?yún)?shù)為t_target_image, is_training, reuse, 同理輸入t_image, 獲得logits_fake
第四步: 使用net_g.print_params(False) 和 net_g.print_layers() 不打印參數(shù),打印每一層
第五步:將net_g.outputs即生成的結(jié)果和t_target_image即目標(biāo)圖像的結(jié)果輸入到Vgg_19_simple_api, 獲得vgg_net, 以及conv第五層的輸出結(jié)果
第一步:tf.image.resize_images()進(jìn)行圖片的維度變換,為了可以使得其能輸入到VGG_19中
第二步:將變化了維度的t_target_image 輸入到Vgg_19_simple_api, 獲得net_vgg, 和 vgg_target_emb即第五層卷積的輸出結(jié)果
第三步:將變化了維度的net_g.outputs 輸入到Vgg_19_simple_api, 獲得 vgg_pred_emb即第五層卷積的輸出結(jié)果
第六步: 構(gòu)造net_g_test = SGRAN_g(t_image, False, True) 用于進(jìn)行訓(xùn)練中的測(cè)試圖片
第五步:構(gòu)造模型loss,還有trian_ops操作
第一步: loss的構(gòu)造, d_loss 和 g_loss的構(gòu)造
第一步: d_loss的構(gòu)造, d_loss_1 + d_loss_2
第一步: d_loss_1: 構(gòu)造真實(shí)圖片的判別損失值,即tl.cost.softmax_cross_entropy(logits_real, tf.ones_like(logits_real))
第二步: d_loss_2: 構(gòu)造生成圖片的判別損失值, 即tl.cost.softmax_cross_entropy(logits_fake, tf.ones_like(logits_fake))
第二步: g_loss的構(gòu)造,g_gan_loss, mse_loss, vgg_loss
第一步: g_gan_loss, 生成網(wǎng)絡(luò)被判別網(wǎng)絡(luò)判別為真的概率,使用tl.cost.softmax_cross_entropy(logits_fake, tf.ones_like(logits_fake))
第二步:mse_loss 生成圖像與目標(biāo)圖像之間的像素點(diǎn)差值,使用tl.cost.mean_squared_error(t_target_image, net_g.outputs)
第三步:vgg_loss? 將vgg_target_emb.outputs與vgg_pred_emb.outputs獲得第五層卷積層輸出的mse_loss
第二步:構(gòu)造train_op,包括 g_optim_init用預(yù)訓(xùn)練, 構(gòu)造g_optim, d_optim
第一步:g_var = tl.layers.get_variables_with_name(‘SGRAN_g') 生成網(wǎng)絡(luò)的參數(shù)獲得
第二步: d_var = tl.layers.get_variable_with_name('SGRAN_d') 判別網(wǎng)絡(luò)的參數(shù)獲得
第三步: 使用with tf.variable_scope('learning_rate'): 使用lr_v = tf.Variable(lr_init)
第四步:定義train_op, g_optim_init, g_optim, d_optim
第一步:構(gòu)造g_optim_init 使用tf.train.Adaoptimer(lr_v, beta1=betal).minimize(mse_loss, var_list=g_var)
第二步:構(gòu)造g_optim 使用tf.train.Adaoptimer(lr_v, beta1=betal).minimize(g_loss, var_list=g_var)
第三步:構(gòu)造d_optim 使用tf.train.Adaoptimer(lr_v, beta1=betal).minimize(d_loss, var_list=d_var)
第六步:使用tl.files.load_and_assign_npz() 載入訓(xùn)練好的sess參數(shù)
第一步: 使用tf.Session(config=tf.ConfigProto(allow_soft_placement=True, log_device_placement=False))
第二步: tl.layers.initialize_global_variables(sess)
第三步: 使用tf.file.load_and_assign_npz 進(jìn)行g(shù)_net的參數(shù)下載, 否者就下載g_{}_init的參數(shù)下載
第四步:使用tf.file.load_and_assgin_npz進(jìn)行d_net的參數(shù)下載
第七步:下載VGG網(wǎng)絡(luò),將其運(yùn)用到net_vgg
第一步:使用np.load(path, encoding='latin1').item() 下載參數(shù)
第二步:循環(huán)sorted(npz.items()) 進(jìn)行參數(shù)循環(huán),將其添加到params
第三步:使用tl.files.assign_params(sess, params, net_vgg) 將參數(shù)運(yùn)用到net_vgg
第八步:進(jìn)行參數(shù)的訓(xùn)練操作
第一步:從圖片中跳出一個(gè)batch_size的數(shù)據(jù)構(gòu)成測(cè)試集
第一步: 使用tl.prepro.threading_data fn = crop_sub_imgs_fn, 使用crop進(jìn)行裁剪操作
第二步: 使用tl.prepro.threading_data fn = downsample 使用imresize進(jìn)行圖片的維度壓縮
第二步:進(jìn)行預(yù)訓(xùn)練操作
第一步:循環(huán)迭代, 獲得一個(gè)batch的數(shù)據(jù),使用crop_sub_imgs_fn 和 downsample構(gòu)造低水平的數(shù)據(jù)和高水平的數(shù)據(jù)
第二步:使用sess.run, g_optim_init進(jìn)行圖片的預(yù)訓(xùn)練
第三步:進(jìn)行訓(xùn)練操作
第一步:循環(huán)迭代,獲得一個(gè)batch的數(shù)據(jù),使用crop_sub_imgs_fn 和 downsample構(gòu)造低水平的數(shù)據(jù)和高水平的數(shù)據(jù)
第二步:使用sess.run, g_optim 和 d_optim 進(jìn)行圖片的訓(xùn)練操作
第九步:進(jìn)行evaluate圖片的測(cè)試階段
第一步: 構(gòu)造圖片展示的文件夾,使用tf.files.exits_files_mkdir
第二步: 使用tl.files.load_file_list 和 tl.vis.read_images讀入圖片
第三步:根據(jù)索引選擇一張圖片,/127.5 - 1 進(jìn)行歸一化處理
第四步:使用tf.placeholder('float32', [1, None, None, 3]) 構(gòu)造輸入的t_image
第五步: 使用SGRAN_g(t_image, False, False) 構(gòu)造net_g
第六步:使用tf.Session() 構(gòu)造sess,使用tl.files.load_and_assign_npz下載訓(xùn)練好的sess, network=net_g
第七步:使用sess.run([net_g.outputs], feed_dict={t_image:[valid_lr_img]}) 獲得圖片
第八步:使用tl.vis.save_images(outputs[0])保存圖片
第九步:使用scipy.misc.imresize() 將低像素的圖片擴(kuò)大為原來(lái)的四倍,與重構(gòu)的圖像作對(duì)比
代碼: main.py? 主函數(shù)
importtensorlayer as tlimporttensorflow as tfimportnumpy as npfrom config importconfigfrom model import *
importosimporttimeimportscipy## 添加參數(shù)
batch_size =config.TRAIN.batch_size
lr_init=config.TRAIN.lr_init
betal=config.TRAIN.betal### initialze G
n_epoch_init =config.TRAIN.n_epoch_init### adversarial learning
n_epoch =config.TRAIN.n_epoch
lr_decay=config.TRAIN.lr_decay
decay_every=config.TRAIN.decay_every
ni=int(np.sqrt(batch_size))deftrain():#創(chuàng)建用于進(jìn)行圖片儲(chǔ)存的文件
save_dir_ginit = 'sample/{}_ginit'.format(tl.global_flag['mode'])
save_dir_gan= 'sample/{}_gan'.format(tl.global_flag['mode'])
tl.files.exists_or_mkdir(save_dir_ginit)
tl.files.exists_or_mkdir(save_dir_gan)
checkpoint= 'checkpoint'tl.files.exists_or_mkdir(checkpoint)
train_hr_img_list= sorted(tl.files.load_file_list(path=config.TRAIN.hr_img_path, regx='.*.png', printable=False))
train_lr_img_list= sorted(tl.files.load_file_list(path=config.TRAIN.lr_img_path, regx='.*.png', printable=False))
train_hr_img= tl.vis.read_images(train_hr_img_list, path=config.TRAIN.hr_img_path, n_threads=8)
train_lr_img= tl.vis.read_images(train_lr_img_list, path=config.TRAIN.lr_img_path, n_threads=8)#構(gòu)造輸入
t_image = tf.placeholder('float32', [batch_size, 96, 96, 3])
t_target_image= tf.placeholder('float32', [batch_size, 384, 384, 3])#構(gòu)造生成的model,獲得生成model的輸出net_g
net_g =SRGAN_g(t_image, True, False)#構(gòu)造判別網(wǎng)絡(luò),判別net_g.output, t_target_image, net_d表示整個(gè)網(wǎng)絡(luò)
net_d, logist_real =SRGAN_d(t_target_image, True, False)
_, logist_fake=SRGAN_d(net_g.outputs, True, True)#構(gòu)造VGG網(wǎng)絡(luò)
net_g.print_params(False)
net_g.print_layers()
net_d.print_params(False)
net_d.print_layers()#進(jìn)行輸入數(shù)據(jù)的維度變換,將其轉(zhuǎn)換為224和224
target_image_224 = tf.image.resize_images(t_target_image, [224, 224], method=0, align_corners=False)
pred_image_224= tf.image.resize_images(net_g.outputs, [224, 224], method=0, align_corners=False)
net_vgg, vgg_target_emb= Vgg_19_simple_api((target_image_224 + 1) / 2, reuse=False)
_, vgg_pred_emb= Vgg_19_simple_api((net_g + 1) / 2, reuse=True)#進(jìn)行訓(xùn)練階段的測(cè)試
net_g_test =SRGAN_g(t_image, False, True)#### ========== DEFINE_TRAIN_OP =================###
d_loss_1 =tl.cost.sigmoid_cross_entropy(logist_real, tf.ones_like(logist_real))
d_loss_2=tl.cost.sigmoid_cross_entropy(logist_fake, tf.zeros_like(logist_fake))
d_loss= d_loss_1 +d_loss_2
g_gan_loss= 1e-3 *tl.cost.sigmoid_cross_entropy(logist_fake, tf.ones_like(logist_fake))
mse_loss= tl.cost.mean_squared_error(net_g.outputs, t_target_image, is_mean=True)
vgg_loss= 2e-6 * tl.cost.mean_squared_error(vgg_target_emb.outputs, vgg_pred_emb.outputs, is_mean=True)
g_loss= g_gan_loss + mse_loss +vgg_loss
g_var= tl.layers.get_variables_with_name('SRGAN_g', True, True)
d_var= tl.layers.get_variables_with_name('SRGAN_d', True, True)
with tf.variable_scope('learning_rate'):
lr_v= tf.Variable(lr_init, trainable=False)
g_optim_init= tf.train.AdamOptimizer(lr_v, beta1=betal).minimize(mse_loss, var_list=g_var)
g_optim= tf.train.AdamOptimizer(lr_v, beta1=betal).minimize(g_loss, var_list=g_var)
d_optim= tf.train.AdamOptimizer(lr_v, beta1=betal).minimize(d_loss, var_list=d_var)###======================RESTORE_MODEL_SESS ==================###
sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True, log_device_placement=False))
tl.layers.initialize_global_variables(sess)if tl.files.load_and_assign_npz(sess, checkpoint + '/g_{}.npz'.format(tl.global_flag['mode'], network=net_g)) isFalse:
tl.files.load_and_assign_npz(sess, checkpoint+ '/g_init_{}.npz'.format(tl.global_flag['mode'], network=net_g))
tl.files.load_and_assign_npz(sess, checkpoint+ '/d_{}.npz'.format(tl.global_flag['mode'], network=net_d))### ================== load vgg params =================== ###
vgg_npy_path = 'vgg19.npy'
if notos.path.isfile(vgg_npy_path):print('Please download vgg19.npz from : https://github.com/machrisaa/tensorflow-vgg')
exit()
npz= np.load(vgg_npy_path, encoding='latin1').item()
params=[]for var insorted(npz.items()):
W= np.asarray(var[1][0])
b= np.asarray(var[1][1])
params.extend([W, b])
tl.files.assign_params(sess, params, net_vgg)print('ok')###======================== TRAIN =======================###
sample_imgs =train_hr_img[0:batch_size]#進(jìn)行隨機(jī)裁剪,保證其維度為384
sample_imgs_384 = tl.prepro.threading_data(sample_imgs, fn=crop_sub_imgs_fn, is_random=False)#進(jìn)行像素的降低
sample_imgs_96 = tl.prepro.threading_data(sample_imgs_384, fn=downsample_fn)#進(jìn)行圖片的保存
tl.vis.save_images(sample_imgs_96, [ni, ni], save_dir_ginit + '/_train_sample_96.png')
tl.vis.save_images(sample_imgs_384, [ni, ni], save_dir_ginit+ '/_train_sample_384.png')
tl.vis.save_images(sample_imgs_96, [ni, ni], save_dir_gan+ '/_train_sample_96.png')
tl.vis.save_images(sample_imgs_384, [ni, ni], save_dir_gan+ '/_train_sample_384.png')###======================== initial train G =====================###
for epoch inrange(n_epoch_init):
n_iter=0
init_loss_total=0for idx inrange(0, len(train_hr_img), batch_size):
b_img_384= tl.prepro.threading_data(train_hr_img[idx:idx+batch_size], fn=crop_sub_imgs_fn, is_random=False)
b_img_96= tl.prepro.threading_data(b_img_384, fn=downsample_fn)
_, MSE_LOSS= sess.run([g_optim_init, mse_loss], feed_dict={t_image:b_img_96, t_target_image:b_img_384})
init_loss_total+=MSE_LOSSif (epoch != 0) and (epoch % 10 ==0):
out= sess.run(net_g_test.outputs, feed_dict={t_image:sample_imgs_96})print('[*] save image')
tl.vis.save_images(out, [ni, ni], save_dir_ginit+ '/train_%d.png' %epoch)if (epoch != 0) and (epoch % 10 ==0):
tl.files.save_npz(net_g.all_params, name=checkpoint + '/g_init_{}.npz'.format(tl.global_flag['mode']))### ======================== train GAN ================== ###
for epoch in range(0, n_epoch+1):if epoch != 0 and epoch % decay_every ==0:
new_lr= lr_decay ** (epoch //decay_every)
sess.run(tf.assign(lr_v, new_lr*lr_v))
log= '** new learning rate: %f(for GAN)' % (lr_init *new_lr)print(log)elif epoch ==0:
sess.run(tf.assign(lr_v, lr_init))
log= '** init lr: %f decay_every_init: %d, lr_decay: %f(for GAN)'%(lr_init, decay_every, lr_decay)print(log)
epoch_time=time.time()
total_d_loss, total_g_loss, n_iter=0, 0, 0for idx inrange(0, len(train_hr_img), batch_size):
b_img_384= tl.prepro.threading_data(train_hr_img[idx:idx+batch_size], fn=crop_sub_imgs_fn, is_random=False)
b_img_96= tl.prepro.threading_data(b_img_384, fn=downsample_fn)
_, errD= sess.run([d_optim, d_loss], feed_dict={t_image:b_img_96, t_target_image:b_img_384})
_, errG, errM, errV, errA= sess.run([g_optim, g_loss, mse_loss, vgg_loss, g_gan_loss], feed_dict={t_image:b_img_96, t_target_image:b_img_384})
total_d_loss+=errD
total_g_loss+=errGif epoch != 0 and epoch % 10 ==0:
out= sess.run(net_g_test.outputs, feed_dict={t_image:sample_imgs_96})print('[*] save image')
tl.vis.save_images(out, [ni, ni], save_dir_gan+ '/train_%d' %epoch)if epoch != 0 and epoch % 10 ==0:
tl.files.save_npz(net_g.all_params, name= checkpoint + '/g_{}.npz'.format(tl.global_flag['mode']))
tl.files.save_npz(net_d.all_params, name= checkpoint + '/d_{}.npz'.format(tl.global_flag['mode']))defevaluate():
save_dir= 'sample/{}'.format(tl.global_flag['mode'])
tl.files.exists_or_mkdir(save_dir)
checkpoints= 'checkpoints'evaluate_hr_img_list= sorted(tl.files.load_file_list(config.VALID.hr_img_path, regx='.*.png', printable=False))
evaluate_lr_img_list= sorted(tl.files.load_file_list(config.VALID.lr_img_path, regx='.*.png', printable=False))
valid_lr_imgs= tl.vis.read_images(evaluate_lr_img_list, path=config.VALID.lr_img_path, n_threads=8)
valid_hr_imgs= tl.vis.read_images(evaluate_hr_img_list, path=config.VALID.hr_img_path, n_threads=8)### ==================== DEFINE MODEL =================###
imid = 64valid_lr_img=valid_lr_imgs[imid]
valid_hr_img=valid_hr_imgs[imid]
valid_lr_img= (valid_lr_img / 127.5) - 1t_image= tf.placeholder('float32', [1, None, None, 3])
net_g=SGRAN_g(t_image, False, False)
sess=tf.Session()
tl.files.load_and_assign_npz(sess, checkpoints+ '/g_{}.npz'.format(tl.global_flag['mode']), network=net_g)
output= sess.run([net_g.outputs], feed_dict={t_image:[valid_lr_img]})
tl.vis.save_images(output[0], [ni, ni], save_dir+ '/valid_gen.png')
tl.vis.save_images(valid_lr_img, [ni, ni], save_dir+ '/valid_lr.png')
tl.vis.save_images(valid_hr_img, [ni, ni], save_dir+ '/valid_hr.png')
size=valid_hr_img.shape
out_bicu= scipy.misc.imresize(valid_lr_img, [size[0]*4, size[1]*4], interp='bicubic', mode=None)
tl.vis.save_images(out_bicu, [ni, ni], save_dir+ '/valid_out_bicu.png')if __name__ == '__main__':importargparse
parse=argparse.ArgumentParser()
parse.add_argument('--mode', type=str, default='srgan', help='srgan evaluate')
args=parse.parse_args()
tl.global_flag['mode'] =args.modeif tl.global_flag['mode'] == 'srgan':
train()elif tl.global_flag['mode'] == 'evaluate':
evaluate()
model.py 構(gòu)建模型
importtensorflow as tfimporttensorlayer as tlfrom tensorlayer.layers import *
importtimedefSRGAN_g(input_image, is_train, reuse):
w_init= tf.random_normal_initializer(stddev=0.2)
b_init=None
g_init= tf.random_normal_initializer(1, 0.02)
with tf.variable_scope('SRGAN_g', reuse=reuse):
n= InputLayer(input_image, name='in')
n= Conv2d(n, 64, (3, 3), (1, 1), act=tf.nn.relu, padding='SAME', W_init=w_init, name='n64s1/c')
temp=nfor i in range(16):
nn= Conv2d(n, 64, (3, 3), (1, 1), act=None, padding='SAME', W_init=w_init, name='n64s1/c1/%d' %i)
nn= BatchNormLayer(nn, act=tf.nn.relu, is_train=is_train, gamma_init=g_init, name='n64s1/b1/%d' %i)
nn= Conv2d(nn, 64, (3, 3), (1, 1), act=None, padding='SAME', W_init=w_init, name='n64s1/c2/%d' %i)
nn= BatchNormLayer(nn, act=None, is_train=is_train, gamma_init=g_init, name='n64s1/b2/%d'%i)
nn= ElementwiseLayer([n, nn], tf.add, name='b_residual_add_%d' %i)
n=nn
n= Conv2d(n, 64, (3, 3), (1, 1), act=None, padding='SAME', W_init=w_init, name='n64s1/c3')
n= BatchNormLayer(n, act=None, is_train=is_train, gamma_init=g_init, name='n64s1/b3')
n= ElementwiseLayer([temp, n], tf.add, name='add3')#進(jìn)行反卷積操作
n = Conv2d(n, 256, (3, 3), (1, 1), act=None, padding='SAME', W_init=w_init, name='n64s1/c4')
n= SubpixelConv2d(n, scale=2, n_out_channel=None, act=tf.nn.relu, name='pixelshuffler2/1')
n= Conv2d(n, 256, (3, 3), (1, 1), act=None, padding='SAME', W_init=w_init, name='n64s1/c5')
n= SubpixelConv2d(n, scale=2, n_out_channel=None, act=tf.nn.relu, name='pixelshuffle2/2')
n= Conv2d(n, 3, (1, 1), (1, 1), act=tf.nn.tanh, padding='SAME', W_init=w_init, name='out')returnndef SRGAN_d(input_image, is_training=True, reuse=False):
w_init= tf.random_normal_initializer(stddev=0.2)
b_init=None
g_init= tf.random_normal_initializer(1.0, stddev=0.02)
lrelu= lambda x: tl.act.lrelu(x, 0.2)
df_dim= 64with tf.variable_scope('SRGAN_d', reuse=reuse):
tl.layers.set_name_reuse(reuse)
net_in= InputLayer(input_image, name='input/image')
net_h0= Conv2d(net_in, df_dim, (4, 4), (2, 2), act=lrelu, padding='SAME', W_init=w_init, name='h0/c')
net_h1= Conv2d(net_h0, df_dim*2, (4, 4), (2, 2), act=None, padding='SAME', W_init=w_init, name='h1/c')
net_h1= BatchNormLayer(net_h1, act=lrelu, is_train=is_training, gamma_init=g_init, name='h1/bn')
net_h2= Conv2d(net_h1, df_dim*4, (4, 4), (2, 2), act=None, padding='SAME', W_init=w_init, name='h2/c')
net_h2= BatchNormLayer(net_h2, act=lrelu, is_train=is_training, gamma_init=g_init, name='h2/bn')
net_h3= Conv2d(net_h2, df_dim*8, (4, 4), (2, 2), act=None, padding='SAME', W_init=w_init, name='h3/c')
net_h3= BatchNormLayer(net_h3, act=lrelu, is_train=is_training, gamma_init=g_init, name='h3/bn')
net_h4= Conv2d(net_h3, df_dim*16, (4, 4), (2, 2), act=None, padding='SAME', W_init=w_init, name='h4/c')
net_h4= BatchNormLayer(net_h4, act=lrelu, is_train=is_training, gamma_init=g_init, name='h4/bn')
net_h5= Conv2d(net_h4, df_dim*32, (4, 4), (2, 2), act=None, padding='SAME', W_init=w_init, name='h5/c')
net_h5= BatchNormLayer(net_h5, act=lrelu, is_train=is_training, gamma_init=g_init, name='h5/bn')
net_h6= Conv2d(net_h5, df_dim*16, (1, 1), (1, 1), act=None, padding='SAME', W_init=w_init, name='h6/c')
net_h6= BatchNormLayer(net_h6, act=lrelu, is_train=is_training, gamma_init=g_init, name='h6/bn')
net_h7= Conv2d(net_h6, df_dim*8, (1, 1), (1, 1), act=None, padding='SAME', W_init=w_init, name='h7/c')
net_h7= BatchNormLayer(net_h7, act=lrelu, is_train=is_training, gamma_init=g_init, name='h7/bn')
net= Conv2d(net_h7, df_dim*2, (1, 1), (1, 1), act=None, padding='SAME', W_init=w_init, name='reg/c')
net= BatchNormLayer(net, act=lrelu, is_train=is_training, gamma_init=g_init, name='reg/bn')
net= Conv2d(net, df_dim*2, (3, 3), (1, 1), act=None, padding='SAME', W_init=w_init, name='reg/c2')
net= BatchNormLayer(net, act=lrelu, is_train=is_training, gamma_init=g_init, name='reg/bn2')
net= Conv2d(net, df_dim*8, (3, 3), (1, 1), act=None, padding='SAME', W_init=w_init, name='reg/c3')
net= BatchNormLayer(net, act=lrelu, is_train=is_training, gamma_init=g_init, name='reg/bn3')
net_h8= ElementwiseLayer([net_h7, net], tf.add, name='red/add')
net_h8.outputs= tl.act.lrelu(net_h8.outputs, 0.2)
net_ho= FlattenLayer(net_h8, name='ho/flatten')
net_ho= DenseLayer(net_ho, n_units=1, act=tf.identity, W_init=w_init, name='ho/dense')
logits=net_ho.outputs
net_ho.outputs=tf.nn.sigmoid(net_ho.outputs)returnnet_ho, logitsdefVgg_19_simple_api(input_image, reuse):
VGG_MEAN= [103.939, 116.779, 123.68]#將輸入的rgb圖像轉(zhuǎn)換為bgr
with tf.variable_scope('VGG19', reuse=reuse) as vs:
start_time=time.time()print('build the model')
input_image= input_image * 255red, green, blue= tf.split(input_image, 3, 3)assert red.get_shape().as_list()[1:] == [224, 224, 1]assert green.get_shape().as_list()[1:] == [224, 224, 1]assert blue.get_shape().as_list()[1:] == [224, 224, 1]
bgr= tf.concat([blue-VGG_MEAN[0], green-VGG_MEAN[1], red-VGG_MEAN[2]], axis=3)assert input_image.get_shape().as_list()[1:] == [224, 224, 3]
net_in= InputLayer(bgr, name='input')#構(gòu)建網(wǎng)絡(luò)
"""conv1"""network= Conv2d(net_in, 64, (3, 3), (1, 1), act=tf.nn.relu, padding='SAME', name='conv1_1')
network= Conv2d(network, 64, (3, 3), (1, 1), act=tf.nn.relu, padding='SAME', name='conv1_2')
network= MaxPool2d(network, (2, 2), (2, 2), padding='SAME', name='pool1')'''conv2'''network= Conv2d(network, 128, (3, 3), (1, 1), act=tf.nn.relu, padding='SAME', name='conv2_1')
network= Conv2d(network, 128, (3, 3), (1, 1), act=tf.nn.relu, padding='SAME', name='conv2_2')
network= MaxPool2d(network, (2, 2), (2, 2), padding='SAME', name='pool2')'''conv3'''network= Conv2d(network, 256, (3, 3), (1, 1), act=tf.nn.relu, padding='SAME', name='conv3_1')
network= Conv2d(network, 256, (3, 3), (1, 1), act=tf.nn.relu, padding='SAME', name='conv3_2')
network= Conv2d(network, 256, (3, 3), (1, 1), act=tf.nn.relu, padding='SAME', name='conv3_3')
network= Conv2d(network, 256, (3, 3), (1, 1), act=tf.nn.relu, padding='SAME', name='conv3_4')
network= MaxPool2d(network, (2, 2), (2, 2), padding='SAME', name='pool3')'''conv4'''network= Conv2d(network, 512, (3, 3), (1, 1), act=tf.nn.relu, padding='SAME', name='conv4_1')
network= Conv2d(network, 512, (3, 3), (1, 1), act=tf.nn.relu, padding='SAME', name='conv4_2')
network= Conv2d(network, 512, (3, 3), (1, 1), act=tf.nn.relu, padding='SAME', name='conv4_3')
network= Conv2d(network, 512, (3, 3), (1, 1), act=tf.nn.relu, padding='SAME', name='conv4_4')
network= MaxPool2d(network, (2, 2), (2, 2), padding='SAME', name='pool4')'''conv5'''network= Conv2d(network, 512, (3, 3), (1, 1), act=tf.nn.relu, padding='SAME', name='conv5_1')
network= Conv2d(network, 512, (3, 3), (1, 1), act=tf.nn.relu, padding='SAME', name='conv5_2')
network= Conv2d(network, 512, (3, 3), (1, 1), act=tf.nn.relu, padding='SAME', name='conv5_3')
network= Conv2d(network, 512, (3, 3), (1, 1), act=tf.nn.relu, padding='SAME', name='conv5_4')
network= MaxPool2d(network, (2, 2), (2, 2), padding='SAME', name='pool5')
conv=network"""fc6-8"""network= FlattenLayer(network, name='flatten')
network= DenseLayer(network, n_units=4096, act=tf.nn.relu, name='fc6')
network= DenseLayer(network, n_units=4096, act=tf.nn.relu, name='fc7')
network= DenseLayer(network, n_units=1000, act=tf.identity, name='fc8')print('finish the bulid %fs' % (time.time() -start_time))return network, conv
config.py? 參數(shù)文件
from easydict importEasyDict as edictimportjson
config=edict()
config.TRAIN=edict()#Adam
config.TRAIN.batch_size = 1config.TRAIN.lr_init= 1e-4config.TRAIN.betal= 0.9
### initialize G
config.TRAIN.n_epoch_init = 100
### adversarial_leaning
config.TRAIN.n_epoch = 2000config.TRAIN.lr_decay= 0.1config.TRAIN.decay_every= int(config.TRAIN.n_epoch / 2)## train set location
config.TRAIN.hr_img_path = r'C:\Users\qq302\Desktop\srdata\DIV2K_train_HR'config.TRAIN.lr_img_path= r'C:\Users\qq302\Desktop\srdata\DIV2K_train_LR_bicubic\X4'
#valid set location
config.VALID=edict()
config.VALID.hr_img_path= r'C:\Users\qq302\Desktop\srdata\DIV2K_valid_HR'config.VALID.lr_img_path= r'C:\Users\qq302\Desktop\srdata\DIV2K_valid_LR_bicubic/X4'
utils.py? 操作文件
from tensorlayer.prepro import *
def crop_sub_imgs_fn(img, is_random=True):
x= crop(img, wrg=384, hrg=384, is_random=is_random)#進(jìn)行 -1 - 1 的歸一化
x = x / 127.5 - 1
returnxdefdownsample_fn(img):
x= imresize(img, [96, 96], interp='bicubic', mode=None)#存在一定的問(wèn)題
x = x / 127.5 - 1
return x
總結(jié)
以上是生活随笔為你收集整理的pythonb超分辨成像_深度原理与框架-图像超分辨重构-tensorlayer的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LeetCode 105. 已知前序中序
- 下一篇: python重命名窗口_为《Python