本章主要学习生成式对抗网络GAN,GAN的提出最初主要是因为训练样本太少,但是构造训练样本是一件比较麻烦的事,就想让他自己产生,所以就有了GAN。GAN的产生的意义就是要构造一些真实的样本。以及他的常见的改进的形式DCGAN是通过深度学习的卷积层的堆叠的改进,尤其是WGAN是里程碑式的一个改进,他在传统GAN的基础上只要改四个点就可以很好的解决传统GAN上的各种问题,目前为止还没有发现在WGAN上有传统GAN上的问题,还有SRGAN是可以让一个低分辨率的图变成一个高分辨率图,是特别的一种GAN。
医学影像技术的发展为临床决策提供了有力的支持。然而,成像质量差,如照度不均匀或强度不平衡,给疾病的自动筛查、分析和诊断带来了挑战。在此之前,已经有人提出了双向gan(如CycleGAN),以提高输入图像的质量,而不需要成对的图像。然而,这些方法关注的是整体外观,没有对结构或光照的限制,这是医学图像解释的基本特征。在本文中,我们提出了一种新的、通用的双向GAN,命名为结构和光照约束GAN (StillGAN),用于医学图像质量增强。我们的StillGAN将低质量和高质量图像视为两个不同的领域,并引入局部结构和光照约束来学习整体特征和局部细节。在角膜共聚焦显微镜、视网膜彩色眼底和内窥镜图像三种医学图像数据集上的大量实验表明,我们的方法优于传统方法和其他基于深度学习的方法。此外,我们还研究了所提出的方法对不同的医学图像分析和临床任务的影响,如神经分割,弯曲分级,中央凹定位和疾病分类
提出一种新的医学图像增强框架,称为结构和光照约束GAN (StillGAN)。
•提出了一种新的双向GAN,称为StillGAN,以提高低质量医学图像的可读性。新模型引入了光照正则化和结构损失,分别改善了光照条件和保留了结构细节。光照正则化的目的是通过减小增强图像中光照分布的差异来改善光照均匀性,而结构损耗则是通过减少低质量图像与增强图像在结构上的差异来尽可能地保留结构细节。与其他深度学习方法相比,本文提出的StillGAN在增强多模态图像的各种指标上取得了更好的整体性能。
•采用三种不同的医学图像模式——共聚焦显微镜、彩色眼底和内窥镜图像,对提出的方法进行了严格的定量和定性评价。对于每种医学图像模式,我们根据其各自的成像特点和临床兴趣,采用不同的图像质量评估方法。
上图是文章提出的模型,它包括两个生成器、鉴别器,两个类型的循环一致性,a代表低质量域,b代表高质量域,L cyc表示循环一致性项(周期损失),Lidt表示身份丢失。在周期一致性和身份约束下,生成程序可以很好地获取将输入图像转换为输出图像所需的知识,同时保持图像在转换前后的整体外观。
图像增强是从低质量域(LQ)向高质量域(HQ)的转换,非配对学习框架StillGAN还引入了两个新的损耗项——Lill表示光照正则化,Lst表示结构损耗,目的是实现增强图像中的光照均匀性和结构细节的恢复。此外,我们的结构损失进一步限制了外观
所构建的生成网络由8个编码器层和带有跳跃连接的对称解码器层组成,如图3所示。对于每个编码器层,我们使用残差块后面跟着最大池化层;而对于每个解码器层,我们采用双线性插值的上采样层,然后采用结构相同的残差块。与传统鉴别器对这整幅图像评价不同,stillGAN的鉴别器采用的是patchGAN,设计成全卷积的形式,(PatchGAN和普通GAN判别器是有区别的,普通的GAN判别器是将输入映射成一个实数,即输入样本为真样本的概率.PatchGAN将输入映射为NxN的patch(矩阵)X,X_{ij}的值代表每个patch为真样本的概率,将X_{ij}求均值,即为判别器最终输出,X XX其实就是卷积层输出的特征图.从这个特征图可以追溯到原始图像中的某一个位置,可以看出这个位置对最终输出结果的影响.)
照明正则化是为了提高整体照明均匀性。它的实现是最小化局部斑块与整个图像之间的光照差异。它是反映增强图像中光照不均匀性的校正因子,通过减小增强图像中光照分布的差异来改善光照均匀性,
计算给定图像的光照校正因子的步骤如下,
1)计算全局平均强度I;
2)分割相同大小n*m的图像;然后计算每个斑块的平均强度,得到光照矩阵d;
3)将d的每个元素减去f的平均强度I,得到光照差矩阵E;
4)通过双三次插值将E重新缩放为与I相同大小的光照分布矩阵R;
5)计算元素R的平均绝对值。
步骤1计算得到的全局平均强度表示输入图像的整体光照水平。步骤2中每个分割的patch的平均强度是为了得到输入图像中的局部光照分布。从步骤3到步骤4,我们得到输入图像的光照误差分布图。最后,在5中计算平均光照误差。
而结构损耗通过减少低质量图像与增强图像在结构上的差异来尽可能地保留结构细节。结构相似性(SSIM)[31]提供了一个相对合适的度量这种相似性程度的方法。与均方误差(mean squared error, MSE)相比,SSIM可以从亮度、对比度和结构三个方面有效地表征两幅图像之间的结构相似性。基于SSIM中的结构比较函数,我们提出了一种基于结构感知的先验结构损失算法,该算法基于低质量图像与其增强图像之间的不相似性。
数据验证
1、共聚焦显微镜–使用预先训练的CS-Net[4],在人工追踪神经纤维的高质量角膜共聚焦显微镜图像上进行训练, 说明可以显著提高神经纤维分割性能,特别是在降低缺失率方面,更有利于神经相关疾病的监测和诊断。
2、彩色眼底–使用预先训练的MCF-Net来预测低质量图像的高质量得分
,StillGAN可以显著提高彩色眼底图像的整体视觉感知。
3、内窥镜图像–使用几个指标评价,自然图像质量评价器(NIQE)[39]、盲/无参考图像空间质量评价器(BRISQUE)[40]和基于感知的图像质量评价器(PIQE)[41]。与其他方法相比,效果很好。
1、采用GAN模型进行图像增强操作
2、在GAN的基础上增加了两个约束条件,光照正则化和结构损失来实现图像增强的光照均匀和细节恢复。
Skip to content
Sign up
CSsaan
/
Deep-learning-of-machine-vision
Public
Code
Issues
Pull requests
1
Actions
More
Deep-learning-of-machine-vision/ch14.图像生成/14:代码GAN/wgan_conv.py /
@CSsaan
CSsaan ch14
…
History
1 contributor
104 lines (81 sloc) 3.08 KB
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import numpy as np
import matplotlib as mpl
mpl.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import os,sys
sys.path.append('utils')
from nets import *
from datas import *
def sample_z(m, n):
return np.random.uniform(-1., 1., size=[m, n])
class WGAN():
def __init__(self, generator, discriminator, data):
self.generator = generator
self.discriminator = discriminator
self.data = data
self.z_dim = self.data.z_dim
self.size = self.data.size
self.channel = self.data.channel
self.X = tf.placeholder(tf.float32, shape=[None, self.size, self.size, self.channel])
self.z = tf.placeholder(tf.float32, shape=[None, self.z_dim])
# nets
self.G_sample = self.generator(self.z)
self.D_real, _ = self.discriminator(self.X)
self.D_fake, _ = self.discriminator(self.G_sample, reuse = True)
# loss
self.D_loss = - tf.reduce_mean(self.D_real) + tf.reduce_mean(self.D_fake)
self.G_loss = - tf.reduce_mean(self.D_fake)
self.D_solver = tf.train.RMSPropOptimizer(learning_rate=1e-4).minimize(self.D_loss, var_list=self.discriminator.vars)
self.G_solver = tf.train.RMSPropOptimizer(learning_rate=1e-4).minimize(self.G_loss, var_list=self.generator.vars)
# clip
self.clip_D = [var.assign(tf.clip_by_value(var, -0.01, 0.01)) for var in self.discriminator.vars]
gpu_options = tf.GPUOptions(allow_growth=True)
self.sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
def train(self, sample_folder, training_epoches = 1000000, batch_size = 64):
i = 0
self.sess.run(tf.global_variables_initializer())
for epoch in range(training_epoches):
# update D
n_d = 100 if epoch < 25 or (epoch+1) % 500 == 0 else 5
for _ in range(n_d):
X_b, _ = self.data(batch_size)
self.sess.run(self.clip_D)
self.sess.run(
self.D_solver,
feed_dict={self.X: X_b, self.z: sample_z(batch_size, self.z_dim)}
)
# update G
self.sess.run(
self.G_solver,
feed_dict={self.z: sample_z(batch_size, self.z_dim)}
)
# print loss. save images.
if epoch % 100 == 0 or epoch < 100:
D_loss_curr = self.sess.run(
self.D_loss,
feed_dict={self.X: X_b, self.z: sample_z(batch_size, self.z_dim)})
G_loss_curr = self.sess.run(
self.G_loss,
feed_dict={self.z: sample_z(batch_size, self.z_dim)})
print('Iter: {}; D loss: {:.4}; G_loss: {:.4}'.format(epoch, D_loss_curr, G_loss_curr))
if epoch % 1000 == 0:
samples = self.sess.run(self.G_sample, feed_dict={self.z: sample_z(16, self.z_dim)})
fig = self.data.data2fig(samples)
plt.savefig('{}/{}.png'.format(sample_folder, str(i).zfill(3)), bbox_inches='tight')
i += 1
plt.close(fig)
if __name__ == '__main__':
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
sample_folder = 'Samples/mnist_wgan_conv'
if not os.path.exists(sample_folder):
os.makedirs(sample_folder)
# param
generator = G_conv_mnist()
discriminator = D_conv_mnist()
data = mnist()
# run
wgan = WGAN(generator, discriminator, data)
wgan.train(sample_folder)