Python通过通过VGG16模型实现图像风格转换操作详解模型实现图像风格转换操作详解
主要介绍了Python通过VGG16模型实现图像风格转换操作,结合实例形式详细分析了Python使用VGG16模型实
现图像风格转换的具体原理、操作步骤与实现方法,需要的朋友可以参考下
本文实例讲述了Python通过VGG16模型实现图像风格转换操作。分享给大家供大家参考,具体如下:
1、图像的风格转化、图像的风格转化
卷积网络每一层的激活值可以看作一个分类器,多个分类器组成了图像在这一层的抽象表示,而且层数越深,越抽象
内容特征:图片中存在的具体元素,图像输入到CNN后在某一层的激活值
风格特征:绘制图片元素的风格,各个内容之间的共性,图像在CNN网络某一层激活值之间的关联
风格转换:在一幅图片内容特征的基础上添加另一幅图片的风格特征从而生成一幅新的图片。在卷积模型训练中,通过
输入固定的图片来调整网络的参数从而达到利用图片训练网络的目的。而在生成特定风格图片时,固定已有的网络参数不变,
调整图片从而使图片向目标风格转化。在内容风格转换时,调整图像的像素值,使其向目标图片在卷积网络输出的内容特征靠
拢。在风格特征计算时,通过多个神经元的输出两两之间作内积求和得到Gram矩阵,然后对G矩阵做差求均值得到风格的损
失函数。
将内容损失函数和风格损失函数对应乘以权重再加起来就得到了总的损失函数,最后的生成图既有内容特征也有风格特
征
2、通过、通过Vgg16实现实现
2.1、预训练模型读取、预训练模型读取
通过预训练好的Vgg16模型来对图片进行风格转换,首先需要准备好vgg16的模型参数。链接:
https://pan.baidu.com/s/1shw2M3Iv7UfGjn78dqFAkA 提取码: ejn8
通过numpy.load()导入并查看参数的内容:
import numpy as np
data=np.load('./vgg16_model.npy',allow_pickle=True,encoding='bytes')
# print(data.type())
data_dic=data.item()
# 查看网络层参数的键值
print(data_dic.keys())
打印键值如下,可以看到分别有不同的卷积和全连接层:
dict_keys([b'conv5_1', b'fc6', b'conv5_3', b'conv5_2', b'fc8', b'fc7', b'conv4_1',
b'conv4_2', b'conv4_3', b'conv3_3', b'conv3_2', b'conv3_1', b'conv1_1', b'conv1_2',
b'conv2_2', b'conv2_1'])
接着查看具体每层的参数,通过data_dic[key]可以获取到key对应层次的参数,例如可以看到卷积层1_1的权值w为3个
3×3的卷积核,对应64个输出通道
# 查看卷积层1_1的参数w,b
w,b=data_dic[b'conv1_1']
print(w.shape,b.shape) # (3, 3, 3, 64) (64,)
# 查看全连接层的参数
w,b=data_dic[b'fc8']
print(w.shape,b.shape) # (4096, 1000) (1000,)
2.2、构建、构建VGG网络网络
通过将已经训练好的参数填充到网络之中就可以搭建VGG网络了。
在类初始化函数中读取预训练模型文件中的参数到self.data_dic
首先构建卷积层,通过传入的各个卷积层name参数,读取模型中对应的卷积层参数并填充到网络中。例如读取第一个卷
积层的权值和偏置值,传入name='conv1_1,则data_dic[name][0]可以得到权值weight,data_dic[name][1]得到偏置值bias。
通过tf.constant构建常量,再执行卷积操作,加偏置项,经激活函数后输出。
评论0