知识点:
扩展数据维数
img1 = tf.expand_dims(img1, 0)
img1 = tf.expand_dims(img1, -1)
tf1.x中,numpy与tensor的格式互换
data = np.random.random([2,3])
data_tensor = tf.convert_to_tensor(data) #numpy-tensor
with tf.Session() as sess:
print("sess.run(tensor): {}".format(sess.run(data_tensor)))
print("tensor.eval(session=sess): {}".format(data_tensor.eval(session=sess)))
安装skimage库:
参考链接
conda install scikit-image
from skimage.measure import compare_ssim as sk_cpt_ssim
为
from skimage.metrics import structural_similarity as sk_cpt_ssim
此时可以使用了!
还有一种方法,安装旧版本,可以使用上面第一条命令
查看skimage对应scipy版本
conda install scikit-image=0.15.0
pip install scipy=1.4.1 -U -i https://pypi.tuna.tsinghua.edu.cn/simple
这下可以使用:
from skimage.measure import compare_ssim as ssim_fn
使用ssim算法,numpy版本参考
def batch_ssim(im1,im2):
imgsize=im1.shape[1]*im1.shape[2]
avg1=im1.mean((1,2),keepdims=1)
avg2=im2.mean((1,2),keepdims=1)
std1=im1.std((1,2),ddof=1)
std2=im2.std((1,2),ddof=1)
cov=((im1-avg1)*(im2-avg2)).mean((1,2))*imgsize/(imgsize-1)
avg1=np.squeeze(avg1)
avg2=np.squeeze(avg2)
k1=0.01
k2=0.03
c1=(k1*255)**2
c2=(k2*255)**2
c3=c2/2
return np.mean((2*avg1*avg2+c1)*2*(cov+c3)/(avg1**2+avg2**2+c1)/(std1**2+std2**2+c2))
一个生成器及调用,用于返回已经训练好的参数数据
def uni_initial_iter(self,layer_num): #在test中测试过了
path = ['fusion_model/layer{0:d}/w{0:d}'.format(layer_num)]
path.append('fusion_model/layer{0:d}/b{0:d}'.format(layer_num))
if not FLAGS.is_train:
for wb_path in path:
yield self.reader.get_tensor(wb_path)
else:
yield tf.truncated_normal_initializer(stddev=1e-3)
yield tf.constant_initializer(0.0)
init_iter = self.uni_initial_iter(1)
weights = tf.get_variable("w1", initializer=tf.constant(next(init_iter)))
bias = tf.get_variable("b1", initializer=tf.constant(next(init_iter)))
模型训练及使用
- 模型的读取和使用
读取已保存的模型,模型路径./CGAN_120/CGAN.model-17
reader = tf.train.NewCheckpointReader('./CGAN'+path+'/CGAN.model-'+ str(num_epoch))
读取特定变量的值
weights=tf.get_variable("w1",initializer=tf.constant(reader.get_tensor('fusion_model/layer1/w1')))
bias=tf.get_variable("b1",initializer=tf.constant(reader.get_tensor('fusion_model/layer1/b1')))
- denseNet的使用案例
dense本来是将当前层的卷积结果插入到后面每一层,比如5层网络,第一层结果conv1_ir不仅输入给layer2,而且给layer3,layer4,layer5;而conv2也间接给了layer4,layer5;以此类推。
如下,是通过更新一个添加列表(XX_add)实现的。
这里结合的,还在每层再插入了一张可见光图像(只需要在第一个列表加入该可见光图像)
vivi = tf.concat([images_vi, images_vi], axis=-1) #可见光图像插入
conv2_add =tf.concat([vivi,conv1_ir],axis=-1) #
conv2_ir= tf.contrib.layers.batch_norm(tf.nn.conv2d(conv2_add,...)) #conv2_add 卷积后规范化
conv2_ir = lrelu(conv2_ir) #激活函数
conv3_add = tf.concat([conv2_add, conv2_ir], axis=-1) #含[conv1_ir],实现denseblock;含vivi,实现可见光图像插入
conv4_add = tf.concat([conv3_add, conv3_ir], axis=-1) #含[conv1_ir,conv2_ir], 实现denseblock;含vivi,实现可见光图像插入
conv5_add = tf.concat([conv4_add, conv4_ir], axis=-1) #含[conv1_ir,conv2_ir,conv3_ir] 实现denseblock;含vivi,实现可见光图像插入
一些小trick
- 禁用warning(具体什么warning忘了,反正tf1.x在一开始特别多):
import warnings
warnings.filterwarnings("ignore")
- 禁止:Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
还有一大堆warning
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"] = '2'
import warnings
warnings.filterwarnings("ignore")
-
解决AttributeError: module ‘scipy.misc’ has no attribute 'imread’报错问题
直接上答案:pip install scipy==1.2.1
-
安装cv2:
pip install opencv-python