|
After Width: | Height: | Size: 178 KiB |
@ -0,0 +1,49 @@
|
||||
from torch import nn
|
||||
|
||||
|
||||
def ConvLayer(in_channels, out_channels, kernel_size=3, stride=1,
|
||||
upsample=None, instance_norm=True, relu=True):
|
||||
layers = []
|
||||
if upsample:
|
||||
layers.append(nn.Upsample(mode='nearest', scale_factor=upsample))
|
||||
layers.append(nn.ReflectionPad2d(kernel_size // 2))
|
||||
layers.append(nn.Conv2d(in_channels, out_channels, kernel_size, stride))
|
||||
if instance_norm:
|
||||
layers.append(nn.InstanceNorm2d(out_channels))
|
||||
if relu:
|
||||
layers.append(nn.ReLU())
|
||||
return layers
|
||||
|
||||
|
||||
class ResidualBlock(nn.Module):
|
||||
def __init__(self, channels):
|
||||
super(ResidualBlock, self).__init__()
|
||||
self.conv = nn.Sequential(
|
||||
*ConvLayer(channels, channels, kernel_size=3, stride=1),
|
||||
*ConvLayer(channels, channels, kernel_size=3, stride=1, relu=False)
|
||||
)
|
||||
|
||||
def forward(self, x):
|
||||
return self.conv(x) + x
|
||||
|
||||
|
||||
class TransformNet(nn.Module):
|
||||
def __init__(self, base=32):
|
||||
super(TransformNet, self).__init__()
|
||||
self.downsampling = nn.Sequential(
|
||||
*ConvLayer(3, base, kernel_size=9),
|
||||
*ConvLayer(base, base * 2, kernel_size=3, stride=2),
|
||||
*ConvLayer(base * 2, base * 4, kernel_size=3, stride=2),
|
||||
)
|
||||
self.residuals = nn.Sequential(*[ResidualBlock(base * 4) for i in range(5)])
|
||||
self.upsampling = nn.Sequential(
|
||||
*ConvLayer(base * 4, base * 2, kernel_size=3, upsample=2),
|
||||
*ConvLayer(base * 2, base, kernel_size=3, upsample=2),
|
||||
*ConvLayer(base, 3, kernel_size=9, instance_norm=False, relu=False),
|
||||
)
|
||||
|
||||
def forward(self, X):
|
||||
y = self.downsampling(X)
|
||||
y = self.residuals(y)
|
||||
y = self.upsampling(y)
|
||||
return y
|
||||
|
After Width: | Height: | Size: 316 KiB |
|
After Width: | Height: | Size: 260 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 527 KiB |
@ -0,0 +1 @@
|
||||
# Register your models here.
|
||||
@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class AdvanceConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'advance'
|
||||
@ -0,0 +1 @@
|
||||
# Create your tests here.
|
||||
@ -0,0 +1,7 @@
|
||||
from django.urls import path
|
||||
|
||||
from . import views
|
||||
|
||||
urlpatterns = [
|
||||
path('transfer', views.transfer)
|
||||
]
|
||||
@ -0,0 +1,28 @@
|
||||
import json
|
||||
|
||||
from django.http import HttpResponse
|
||||
from django.views.decorators.csrf import csrf_exempt
|
||||
|
||||
from basic.helper import get_image_name
|
||||
from .utils import *
|
||||
|
||||
PREFIX = './media/'
|
||||
DEFAULT_FORMAT = '.jpg'
|
||||
|
||||
SUPPORT_MODEL = ['candy', 'composition_vii', 'feathers', 'la_muse', 'mosaic',
|
||||
'starry_night', 'the_scream', 'the_wave', 'udnie']
|
||||
|
||||
|
||||
@csrf_exempt
|
||||
def transfer(request):
|
||||
if request.method == 'POST':
|
||||
para = json.loads(request.body)
|
||||
image = para['img']
|
||||
my_type = para['model']
|
||||
if my_type not in SUPPORT_MODEL:
|
||||
return HttpResponse('不支持的风格转换')
|
||||
model = 'advance/models/' + para['type'] + '.t7'
|
||||
filename = get_image_name() + DEFAULT_FORMAT
|
||||
style_transfer(PREFIX + image, PREFIX + filename, model)
|
||||
return HttpResponse(filename)
|
||||
return HttpResponse('请使用POST方法')
|
||||
|
After Width: | Height: | Size: 367 KiB |
|
After Width: | Height: | Size: 198 KiB |
|
After Width: | Height: | Size: 314 KiB |
|
After Width: | Height: | Size: 687 KiB |
|
After Width: | Height: | Size: 76 KiB |
|
After Width: | Height: | Size: 308 KiB |
|
After Width: | Height: | Size: 212 KiB |
|
After Width: | Height: | Size: 454 KiB |
|
After Width: | Height: | Size: 145 KiB |
|
After Width: | Height: | Size: 210 KiB |
|
After Width: | Height: | Size: 256 KiB |
|
After Width: | Height: | Size: 231 KiB |
|
After Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 220 KiB |
|
After Width: | Height: | Size: 207 KiB |
|
After Width: | Height: | Size: 276 KiB |
|
After Width: | Height: | Size: 146 KiB |
|
After Width: | Height: | Size: 196 KiB |
|
After Width: | Height: | Size: 165 KiB |