for i in trange(channel_line): for j in range(channel_row): # *调用calculate函数完成每个像素点的滤波计算并赋值给新图像 new_img[i][j] = calculate(img[i:i+core_line, j:j+core_row], core)
最后把三通道合并,将函数分块获得最终代码:
import matplotlib.pyplot as plt import pylab import numpy as np from tqdm import trange
for i in trange(channel_line): for j in range(channel_row): # *调用calculate函数完成每个像素点的滤波计算并赋值给新图像 new_img[i][j] = calculate(img[i:i+core_line, j:j+core_row], core) return new_img
defcalculate(img, core): result = (img * core).sum() # *矩阵乘法获得结果像素值 if(result < 0): # *过滤无效像素值 result = 0 elif result > 255: result = 255 return result
for i in trange(channel_line): for j in range(channel_row): # *调用calculate函数完成每个像素点的滤波计算并赋值给新图像 new_img[i][j] = calculate(img[i:i+core_line, j:j+core_row], core) return new_img
defcalculate(img, core):
result = (img * core).sum() # *矩阵乘法获得结果像素值 if(result < 0): # *过滤无效像素值 result = 0 elif result > 255: result = 255 return result
defgaussian_cal(): public() # *初始化卷积核 core = [[1.0for i in range(core_line)] for j in range(core_row)] sums = 0 # *计算卷积核半径 for i in range(core_line): for j in range(core_row): x = abs(j - (core_row // 2)) y = abs(i - (core_line // 2)) core[i][j] = gaussian(sigma, x, y) sums = sums + core[i][j] core = core / sums # *保证卷积核元素总和为1 return core
# *创建一个新的nn.Sequential来放入按序激活的模块 model = nn.Sequential(normalization)
i = 0# *每次检视层的增量 for layer in cnn.children(): if isinstance(layer, nn.Conv2d): i += 1 name = 'conv_{}'.format(i) elif isinstance(layer, nn.ReLU): name = 'relu_{}'.format(i) # *在下面插入的ContentLoss和StyleLoss的本地版本不能很好地发挥作用。所以在这里替换不合适的 layer = nn.ReLU(inplace=False) elif isinstance(layer, nn.MaxPool2d): name = 'pool_{}'.format(i) elif isinstance(layer, nn.BatchNorm2d): name = 'bn_{}'.format(i) else: raise RuntimeError('Unrecognized layer: {}'.format( layer.__class__.__name__))
model.add_module(name, layer)
if name in content_layers: # *加入内容损失: target = model(content_img).detach() content_loss = ContentLoss(target) model.add_module("content_loss_{}".format(i), content_loss) content_losses.append(content_loss)
if name in style_layers: # *加入风格损失: target_feature = model(style_img).detach() style_loss = StyleLoss(target_feature) model.add_module("style_loss_{}".format(i), style_loss) style_losses.append(style_loss)
# *移除添加的损失层 for i in range(len(model) - 1, -1, -1): if isinstance(model[i], ContentLoss) or isinstance(model[i], StyleLoss): break
model = model[:(i + 1)]
return model, style_losses, content_losses
3.完整示例代码
from __future__ import print_function
import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim
from PIL import Image import matplotlib.pyplot as plt
import torchvision.transforms as transforms import torchvision.models as models
style_img = image_loader("D:/0aJotang/#6/py_fi/input_style/style.jpg") # *读取风格图像 content_img = image_loader("D:/0aJotang/#6/py_fi/input_content/content.jpg") # *读取内容图像 # *确认传入内容和风格图像尺寸一致 assert style_img.size() == content_img.size(), \ "we need to import style and content images of the same size"
# *创建一个新的nn.Sequential来放入按序激活的模块 model = nn.Sequential(normalization)
i = 0# *每次检视层的增量 for layer in cnn.children(): if isinstance(layer, nn.Conv2d): i += 1 name = 'conv_{}'.format(i) elif isinstance(layer, nn.ReLU): name = 'relu_{}'.format(i) # *对于我们在下面插入的ContentLoss和StyleLoss, # *本地版本不能很好地发挥作用。所以我们在这里替换不合适的 layer = nn.ReLU(inplace=False) elif isinstance(layer, nn.MaxPool2d): name = 'pool_{}'.format(i) elif isinstance(layer, nn.BatchNorm2d): name = 'bn_{}'.format(i) else: raise RuntimeError('Unrecognized layer: {}'.format( layer.__class__.__name__))
model.add_module(name, layer)
if name in content_layers: # *加入内容损失: target = model(content_img).detach() content_loss = ContentLoss(target) model.add_module("content_loss_{}".format(i), content_loss) content_losses.append(content_loss)
if name in style_layers: # *加入风格损失: target_feature = model(style_img).detach() style_loss = StyleLoss(target_feature) model.add_module("style_loss_{}".format(i), style_loss) style_losses.append(style_loss)
# *移除添加的损失层 for i in range(len(model) - 1, -1, -1): if isinstance(model[i], ContentLoss) or isinstance(model[i], StyleLoss): break