这部分是利用pytorch 进行实战,利用迁移vgg16 来实现图片的风格迁移
代码基于python3.7, pytorch 1.0,cuda 10.0 .
pytorch图像风格迁移实战
获取一张内容图片和一张风格图片;定义两个度量值,一个度量叫作内容度量值,另一个度量叫作风格度量值,其中的内容度量值用于衡
量图片之间的内容差异程度,风格度量值用于衡量图片之间的风格差异程度;最后,建立神经网络模型,对内容图片中的内容和风格图片
的风格进行提取,以内容图片为基准将其输入建立的模型中,并不断调整内容度量值和风格度量值,让它们趋近于最小,最后输出的图片
就是内容与风格融合的图片。----来自《深度学习之PyTorch实战计算机视觉》
import torch
from torch.autograd import Variable
import torchvision
from torchvision import transforms, models
import copy
from PIL import Image
import matplotlib.pyplot as plt
%matplotlib inline
# 数据预处理,加载数据
transform = transforms.Compose([transforms.Resize([224,224]),
transforms.ToTensor()])
def loading(path = None):
img = Image.open(path)
img = transform(img)
img = img.unsqueeze(0)
return img
content_img = loading('images/4.jpg')
content_img = Variable(content_img).cuda()
style_img = loading('images/5.jpg')
style_img = Variable(style_img).cuda()
# 内容度量值可以使用均方误差作为损失函数:
class Content_loss(torch.nn.Module):
def __init__(self,weight,target):
super(Content_loss,self).__init__()
self.weight = weight # weight 是一个权重用来控制最后风格和内容的占比
self.target = target.detach() * weight # target是通过卷积获取到的输入图像中的内容,target.detach()用于对提取到的内容进行锁定,不需要进行梯度
self.loss_fn = torch.nn.MSELoss()
def forward(self, input):
self.loss = self.loss_fn(input*self.weight, self.target) # 进行计算损失值
return