рдХреИрд╕реЗ рдПрдХ рдмреЙрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдПрдХ рдлреЛрдЯреЛ рдХреЛ рдХреЙрдорд┐рдХ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рднрд╛рдЧ рддреАрди рдирд┐: рд╢реБрд▓реНрдХ рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд + GPU рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдореЙрдбрд▓

тЗи рднрд╛рдЧ рез
тЗи рднрд╛рдЧ реи


рдареАрдХ рд╣реИ, рдЖрд░рд╛рдо рдХрд┐рдпрд╛ рдФрд░ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рд╡рд╛рдкрд╕ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!


рдкрд┐рдЫрд▓реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ, рдЖрдкрдиреЗ рдФрд░ рдореИрдВрдиреЗ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ред
рдлрд┐рд░, рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рднрдпрднреАрдд, рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ рджрд░реНрдЬрди рд╕реЗ рдЕрдзрд┐рдХ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ред
рдпрд╣ рджреБрдирд┐рдпрд╛ рдХреЛ рд╣рдорд╛рд░реА рд░рдЪрдирд╛ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ!


рдирд┐рд░реНрдпрд╛рдд рдореЙрдбрд▓


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЬрдирд░реЗрдЯрд░ рдореЙрдбрд▓ рдХреЛ рдПрдХ рдЙрдкрдпреБрдХреНрдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд╕рд╣реЗрдЬреЗрдВрдЧреЗ рддрд╛рдХрд┐ рд╣рдореЗрдВ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕ рдХреА рдШреЛрд╖рдгрд╛рдУрдВ рдХреЛ рдЦреАрдВрдЪрдирд╛ рди рдкрдбрд╝реЗред


* .Py рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреА рдлрд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рдиреАрдЪреЗ рд╕реЗ рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВред
рдЗрд╕реЗ jit.py рд╣реЛрдиреЗ рджреЗрдВ:


рдкрде, рдЖрдЙрдЯрдкреБрдЯ_рдкрде рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд╡рд┐рдЪрд╛рд░рдкреВрд░реНрд╡рдХ рдХреЙрдкреА рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб
#  path       #    *G_A.pth -   ->  # output_path -      #      *.jit,  -  ,     path= '/checkpoints/resnet9_nowd_nodo_128to400_c8/60_net_G_A.pth' output_path ='/checkpoints/resnet9_nowd_nodo_128to400_c8/resnet9_nowd_nodo_128to400_c8_160-50-60_1.jit' import torch from torch import nn class ResnetGenerator(nn.Module): """Resnet-based generator that consists of Resnet blocks between a few downsampling/upsampling operations. We adapt Torch code and idea from Justin Johnson's neural style transfer project(https://github.com/jcjohnson/fast-neural-style) """ def __init__(self, input_nc, output_nc, ngf=64, norm_layer=nn.BatchNorm2d, use_dropout=False, n_blocks=6, padding_type='reflect'): """Construct a Resnet-based generator Parameters: input_nc (int) -- the number of channels in input images output_nc (int) -- the number of channels in output images ngf (int) -- the number of filters in the last conv layer norm_layer -- normalization layer use_dropout (bool) -- if use dropout layers n_blocks (int) -- the number of ResNet blocks padding_type (str) -- the name of padding layer in conv layers: reflect | replicate | zero """ assert(n_blocks >= 0) super(ResnetGenerator, self).__init__() if type(norm_layer) == functools.partial: use_bias = norm_layer.func == nn.InstanceNorm2d else: use_bias = norm_layer == nn.InstanceNorm2d model = [nn.ReflectionPad2d(3), nn.Conv2d(input_nc, ngf, kernel_size=7, padding=0, bias=use_bias), norm_layer(ngf), nn.ReLU(True)] n_downsampling = 2 for i in range(n_downsampling): # add downsampling layers mult = 2 ** i model += [nn.Conv2d(ngf * mult, ngf * mult * 2, kernel_size=3, stride=2, padding=1, bias=use_bias), norm_layer(ngf * mult * 2), nn.ReLU(True)] mult = 2 ** n_downsampling for i in range(n_blocks): # add ResNet blocks model += [ResnetBlock(ngf * mult, padding_type=padding_type, norm_layer=norm_layer, use_dropout=use_dropout, use_bias=use_bias)] for i in range(n_downsampling): # add upsampling layers mult = 2 ** (n_downsampling - i) model += [nn.ConvTranspose2d(ngf * mult, int(ngf * mult / 2), kernel_size=3, stride=2, padding=1, output_padding=1, bias=use_bias), norm_layer(int(ngf * mult / 2)), nn.ReLU(True)] model += [nn.ReflectionPad2d(3)] model += [nn.Conv2d(ngf, output_nc, kernel_size=7, padding=0)] model += [nn.Tanh()] self.model = nn.Sequential(*model) def forward(self, input): """Standard forward""" return self.model(input) class ResnetBlock(nn.Module): """Define a Resnet block""" def __init__(self, dim, padding_type, norm_layer, use_dropout, use_bias): """Initialize the Resnet block A resnet block is a conv block with skip connections We construct a conv block with build_conv_block function, and implement skip connections in <forward> function. Original Resnet paper: https://arxiv.org/pdf/1512.03385.pdf """ super(ResnetBlock, self).__init__() self.conv_block = self.build_conv_block(dim, padding_type, norm_layer, use_dropout, use_bias) def build_conv_block(self, dim, padding_type, norm_layer, use_dropout, use_bias): """Construct a convolutional block. Parameters: dim (int) -- the number of channels in the conv layer. padding_type (str) -- the name of padding layer: reflect | replicate | zero norm_layer -- normalization layer use_dropout (bool) -- if use dropout layers. use_bias (bool) -- if the conv layer uses bias or not Returns a conv block (with a conv layer, a normalization layer, and a non-linearity layer (ReLU)) """ conv_block = [] p = 0 if padding_type == 'reflect': conv_block += [nn.ReflectionPad2d(1)] elif padding_type == 'replicate': conv_block += [nn.ReplicationPad2d(1)] elif padding_type == 'zero': p = 1 else: raise NotImplementedError('padding [%s] is not implemented' % padding_type) conv_block += [nn.Conv2d(dim, dim, kernel_size=3, padding=p, bias=use_bias), norm_layer(dim), nn.ReLU(True)] if use_dropout: conv_block += [nn.Dropout(0.5)] p = 0 if padding_type == 'reflect': conv_block += [nn.ReflectionPad2d(1)] elif padding_type == 'replicate': conv_block += [nn.ReplicationPad2d(1)] elif padding_type == 'zero': p = 1 else: raise NotImplementedError('padding [%s] is not implemented' % padding_type) conv_block += [nn.Conv2d(dim, dim, kernel_size=3, padding=p, bias=use_bias), norm_layer(dim)] return nn.Sequential(*conv_block) def forward(self, x): """Forward function (with skip connections)""" out = x + self.conv_block(x) # add skip connections return out import functools norm_layer = functools.partial(nn.InstanceNorm2d, affine=False, track_running_stats=False) model = ResnetGenerator(3,3,64, norm_layer=norm_layer, use_dropout=False, n_blocks=9) model.load_state_dict(torch.load(path)) model.eval() model.cuda() model.half() trace_input = torch.ones(1,3,256,256).cuda() model = model.eval() jit_model = torch.jit.trace(model.float(), trace_input) torch.jit.save(jit_model, output_path) 

рдЪрд░ рдХреЛ рдЕрдкрдиреЗ рд╕реЗ рдмрджрд▓реЗрдВ:


  • рдкрде - рдореЙрдбрд▓ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдкрде рдЬрд┐рд╕реЗ рдЖрдк рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред
    рд╣рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ * G_A.pth - рдлреЛрдЯреЛ рдЬрдирд░реЗрдЯрд░ -> рдХреЙрдорд┐рдХ рдмреБрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  • output_path - рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдореЙрдбрд▓ рдХрд╛ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо, рдпрд╣ рдПрдХреНрд╕рдЯреЗрдВрд╢рди * .jit рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рдирд╣реАрдВ рднреВрд▓рдирд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЗрд╕реЗ рдХрд╣рд╛рдБ рдмрдЪрд╛рдпрд╛ рдерд╛ред

рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рдЕрдВрддрд┐рдо рдпреБрдЧ рд╕реЗ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рд╣реИред

рдЕрдЧрд▓рд╛, рдХрдВрд╕реЛрд▓ рдкрд░ рдЬрд╛рдПрдВ, рд╣рдорд╛рд░реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рд▓рд┐рдЦреЗрдВ:


 python jit.py 

рджреЗрдЦрд╛! рдореЙрдбрд▓ рдмрд╛рд╣рд░реА рджреБрдирд┐рдпрд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред


рдорд╢рд╛рд▓ рдЬреАрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА

рдкреНрд░рд▓реЗрдЦрди: https://pytorch.org/docs/stable/jit.html
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЬреАрдЯ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдореЙрдбрд▓ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдЬрдЧрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЦреАрдВрдЪ рд╕рдХрддреЗ, рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдФрд░ рдмрд╛рд╣рд░реА рдореЙрдбреНрдпреВрд▓ рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдорд╢рд╛рд▓ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдмрд┐рд▓реНрдХреБрд▓ред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо рдЗрд╕реЗ рдПрдХ рдЕрдЬрдЧрд░ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╣реЛрд╕реНрдЯ рдХрд░реЗрдВрдЧреЗ, рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЬреАрдЯ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдк


рдореИрдВ рдмрд╣реБрдд рдлреНрд░реИрдВрдХ рд╣реЛ рдЬрд╛рдКрдВрдЧрд╛ рдФрд░ рддреБрд░рдВрдд рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реВрдВрдЧрд╛: рдореЗрд░реЗ рдЖрдВрддрд░рд┐рдХ рдЧрд╣рди рд╕реАрдЦрдиреЗ рдХреЗ рдЙрддреНрд╕рд╛рд╣ рдХреЛ GPU рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреА рдЦреЛрдЬ рдХреЗ рджреВрд╕рд░реЗ рдШрдВрдЯреЗ рдореЗрдВ рдХрд╣реАрдВ рдорд░ рдЧрдпрд╛ред рдЗрд╕рд▓рд┐рдП рдЕрдЧрд░ рдХреЛрдИ рдореБрдЭреЗ рд╕рд╕реНрддреА рд╕рд░реНрд╡рд░рд▓реЗрд╕ рдЬреАрдкреАрдпреВ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдмрддрд╛рдПрдЧрд╛, рддреЛ рдореИрдВ рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред

рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрдирд╛рдИ рдереА, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ред


Google рдФрд░ рдЕрдореЗрдЬрд╝реЕрди рдХреА рдмрд╣реБ-рдкреГрд╖реНрда рдЯреИрд░рд┐рдл рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рдвреЛрдВрдЧреА рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореЗрд░реА рдкрд╕рдВрдж рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдбреЙрдЯ рдХреЙрдо рдкрд░ рдЧрд┐рд░ рдЧрдИ


рдЗрд╕рдХреЗ рдХрдИ рдХрд╛рд░рдг рд╣реИрдВ:


  • рд╡реЗрдм рдЖрдИрдбреАрдИ рдбрдореА рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИ, рдпрджреНрдпрдкрд┐ рдмрд╣реБрдд рдзреАрдореА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдорд╛рдг рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рдмрд╛рд╣рд░, рдореИрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╕рдм рдХреБрдЫ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рдЪрд░рдг рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВред


  • рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдиреНрдпреВрдирддрдо рд╕рдВрдЦреНрдпрд╛ - рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рдмреБрдврд╝рд╛рдкреЗ рд╕реЗ рдорд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдЕрдВрдд рддрдХ рдирд╣реАрдВ рдкрдврд╝рдирд╛ред


  • рдЦреИрд░, рдЕрдВрддрд┐рдо рддрд░реНрдХ - рд▓рдЧрднрдЧ рдЖрдзреЗ рд╕рд╛рд▓ рдХреЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрднреА рднреА рдПрдХ рдореБрдлреНрдд рд╢реБрд░реБрдЖрддреА рд╢реЗрд╖ рд░рд╛рд╢рд┐ рдЦрд░реНрдЪ рдирд╣реАрдВ рдХреА рд╣реИред



рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдм рдЬрдм рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЦрд╛рддрд╛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╡реЗ рдкрд┐рдЫрд▓реА рдЧрд░реНрдорд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рджреЗрддреЗ рд╣реИрдВ, рдпрд╣ рдЕрднреА рднреА рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рд╕рднреА рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдПред рдорд╣реАрдиреЗ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдЕрдзрд┐рдХ рдЛрдг рдлреЗрдВрдХреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдмрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдореБрдЭреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдмрд░реНрдмрд╛рджреА рд╕реЗ рдмрдЪрд╛рддреЗ рд╣реИрдВред


Minuses рдореЗрдВ рд╕реЗ, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб 12GB рд░реИрдо рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ рдкреБрд░рд╛рдиреЗ рдЯреЗрд╕реНрд▓рд╛ K80 рд╣реИрдВ, рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддреЗ рд╣реИрдВред рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЬрдм рддрдХ рд╣рдо рдЙрддреНрдкрд╛рджрди рдирд╣реАрдВ рдХрд░ рд▓реЗрддреЗ, рддрдм рддрдХ рд╣рдо рдкрд╣рд▓реЗ рд╣реА рд╕рдордЭ рдЬрд╛рдПрдВрдЧреЗ рдХрд┐ рд╣рдореЗрдВ рд╕рд░реНрд╡рд░ рд╕реЗ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдПред


рдореЙрдбрд▓ рддреИрдирд╛рдд рдХрд░реЗрдВ


рдЦреИрд░, рд▓рдбрд╝рд╛рдИ рдХреЗ рд▓рд┐рдП!


рдкрдВрдЬреАрдХрд░рдг


рд╣рдо https://algorithmia.com/signup рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрдВрдЬреАрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдВрддрд░ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕рд╛ рдкреЗрд╢реЗ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдПрдХ рдЧреЛрд▓реНрдб рдХреЙрдореНрдмреЛ рдкрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЕрдзрд┐рдХрддрдо рдХреНрд░реЗрдбрд┐рдЯ рджреЗрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдмрддрд╛рдПрдВ!


рдореЙрдбрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ


рдкрдВрдЬреАрдХрд░рдг рдХреЗ рдмрд╛рдж, рд╣рдо рдЖрдкрдХреА рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реЛрдВрдЧреЗред
рд╣рдореЗрдВ рдореЙрдбрд▓ рдФрд░ рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╛рдИрдВ рдУрд░ рдореЗрдиреВ рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред


рдирдпрд╛ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд -> рд╣реЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
рдЪрд▓реЛ рдлрд╝реЛрд▓реНрдбрд░ рдХрд╛ рдирд╛рдо "рдореЗрд░реЗ рдореЙрдбрд▓"ред
рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдлрд╝реЛрд▓реНрдбрд░реНрд╕ рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдПрдХ рдкреГрд╖реНрда рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдПрдХ рдФрд░ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ: рдирдпрд╛ рд╕рдВрдЧреНрд░рд╣ -> "photo2comics_out"


рдпрд╣ рд╣рдорд╛рд░реЗ рд╣реМрд╕рд▓реЗ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдореЙрдбрд▓ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ!
рдореЗрд░реЗ рдореЙрдбрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рдПрдВ рдФрд░ рдореЙрдбрд▓ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рдЦреАрдВрдЪреЗрдВ, рдпрд╛ рдореЗрдиреВ рд╕реЗ рдЕрдкрд▓реЛрдб рдлрд╛рдЗрд▓реЗрдВ рдЪреБрдиреЗрдВред


рдЕрдм рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ, рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЗ рджрд╛рдИрдВ рдУрд░ рджрд┐рдП рдЧрдП рджреАрд░реНрдШрд╡реГрддреНрдд рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред


рдбреЗрдЯрд╛ рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдПрд▓реНрдЧреЛрд░рд┐рдердо рдкрд░ рдЬрд╛рдПрдВред


рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо


рд╣рдо рдмрд╛рдИрдВ рдУрд░ рдореЗрдиреВ рдореЗрдВ рд╣реЛрдо рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВред


рдЗрд╕рдХреЗ рдмрд╛рдж Create New -> Algorithm рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдирд╛рдо рдЪреБрдиреЗрдВред рд╣рдо рд╢реЗрд╖ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рднрд░рддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджреА рдЧрдИ рддрд╕реНрд╡реАрд░ рдореЗрдВ рд╣реИред


рдиреАрдЪреЗ рдЪрд┐рддреНрд░


рдирдИ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдмрдирд╛рдПрдБ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдВрдбреЛ рдореЗрдВ рд╡реЗрдмрдЗрдб рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред
рдпрджрд┐ рдЖрдкрдиреЗ рдЧрд▓рддреА рд╕реЗ рдкреЙрдкрдЕрдк рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рд╣рдорд╛рд░реЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдореЗрдиреВ рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВред


рд╣рдо рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛрдб рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдирд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:


рдФрд░ рднреА рдЕрдзрд┐рдХ рд╡рд┐рдЪрд╛рд░рд╣реАрди рдирдХрд▓ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдХреЛрдб
 import Algorithmia import torch import torchvision import torchvision.transforms as transforms import cv2 from torch import * import uuid import gc import requests import numpy as np client = Algorithmia.client() #     file_path,      #   model_file   . def load_model(): file_path = "{      }" model_file = client.file(file_path).getFile().name model = torch.jit.load(model_file).half().cuda() return model model = load_model().eval() torch.cuda.empty_cache() torch.cuda.ipc_collect() torch.backends.cudnn.benchmark = True #    ,    , #     , # ..      def preprocessing(image_path, max_size): response = requests.get(image_path) response = response.content nparr = np.frombuffer(response, np.uint8) img_res = cv2.imdecode(nparr, cv2.IMREAD_COLOR) img_res = cv2.cvtColor(img_res, cv2.COLOR_BGR2RGB) x = img_res.shape[0] y = img_res.shape[1] #if image is bigger than the target max_size, downscale it if x>max_size and x<=y: y = y*(max_size/x) x = max_size if y>max_size and y<x: x = x*(max_size/y) y = max_size size = (int(y),int(x)) img_res = cv2.resize(img_res,size) t = Tensor(img_res/255.)[None,:] t = t.permute(0,3,1,2).half().cuda() # standartize t = (t-0.5)/0.5 return(t) def predict(input): gc.collect() with torch.no_grad(): res = model(input).detach() return res #   ,     #      def save_file(res, file_uri): #de-standartize res = (res*0.5)+0.5 tempfile = "/tmp/"+str(uuid.uuid4())+".jpg" torchvision.utils.save_image(res,tempfile) client.file(file_uri).putFile(tempfile) # API calls will begin at the apply() method, with the request body passed as 'input' # For more details, see algorithmia.com/developers/algorithm-development/languages def apply(input): processed_data= preprocessing(input["in"], input["size"]) res = predict(processed_data) save_file(res, input["out"]) input = None res = None processed_data = None gc.collect() return "Success" 

рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдбрд╛рд▓рдирд╛ рди рднреВрд▓реЗрдВред рд╣рдордиреЗ рдореЙрдбрд▓ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдЗрд╕реЗ рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдерд╛ред


WebIDE рдореЗрдВ, рдКрдкрд░реА рджрд╛рдИрдВ рдУрд░ DEPENDENCIES рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдкрд╛рда рдХреЛ рд╣рдорд╛рд░реЗ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рд╕реВрдЪреА рд╕реЗ рдмрджрд▓ рджреЗрдВ:


 algorithmia>=1.0.0,<2.0 opencv-python six torch==1.3.0 torchvision numpy 

рдорд╢рд╛рд▓ рд╕рдВрд╕реНрдХрд░рдг рдПрдХ рд╣реА рдпрд╛ рдирдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕ рдкрд░ рд╣рдордиреЗ рдореЙрдбрд▓ рдХреЛ рдмрдЪрд╛рдпрд╛ рдерд╛ред рдЕрдиреНрдпрдерд╛, рдЬреЗрдЯ рдореЙрдбрд▓ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред


рд╕рд╣реЗрдЬреЗрдВ, рдирд┐рд░реНрдорд╛рдг рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдирд┐рд░реНрдорд╛рдг рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рдЬреИрд╕реЗ рд╣реА рдПрдХ рд╕рдлрд▓ рдмрд┐рд▓реНрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрджреЗрд╢ рдиреАрдЪреЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рд╣рдо рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЕрдиреБрд░реЛрдз рднреЗрдЬрдХрд░ рдореЙрдбрд▓ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 {"in":"https://cdn3.sportngin.com/attachments/photo/9226/3971/JABC-9u_medium.JPG", "out":"data://username/photo2comics_out/test.jpg", "size":512} 

рдЬрд╣рд╛рдБ {username} рдЖрдкрдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рд╣реИред рдпрджрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЧрдпрд╛, рддреЛ "рд╕рдлрд▓рддрд╛" рдХрдВрд╕реЛрд▓ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА, рдФрд░ рдЙрддреНрдкрдиреНрди рдЫрд╡рд┐ рдЙрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдерд╛ (рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ photo2comics_out)ред


рдкрд░рд┐рдгрд╛рдо


рдмрдзрд╛рдИ рд╣реЛ, рд╣рдордиреЗ рд╕рд╕реНрддреЗ рдФрд░ рдЧреБрд╕реНрд╕реЗ рдореЗрдВ рд╣рдорд╛рд░реЗ рд╡рд┐рдирдореНрд░ рдореЙрдбрд▓ рдХреЛ рдЯрд╛рд▓ рджрд┐рдпрд╛!


рдЕрдЧрд▓реЗ рдЕрдВрдХ рдореЗрдВ, рд╣рдо рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдмреЙрдЯ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рджреЛрд╕реНрдд рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрд╣ рд╕рдм рд╕рд╛рдорд╛рди рдЬрд╛рд░реА рдХрд░реЗрдВрдЧреЗред
рдпрджрд┐ рдЖрдк рдореЙрдбрд▓ рдХреЛ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ: https://algorithmia.com/developersers/ap//


рдЦреИрд░, рдЕрдЧрд▓реЗ рд▓реЗрдЦ рддрдХ рд╕рдордп рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХреБрдЫ рдмреЙрдЯреНрд╕, рдореЙрдбрд▓, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдерд╛, рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ:


@ selfie2animebot - рдПрдХ рд╕реЗрд▓реНрдлреА рдХреЛ рдПрдиреАрдореЗ рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИ
@pimpmyresbot - x2 рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдмрдврд╝рд╛рддрд╛ рд╣реИ (рдЕрдзрд┐рдХрддрдо 1400x1400)
@photozoombot - рдПрдХ рдлрд╝реЛрдЯреЛ рд╕реЗ 3D рдЬрд╝реВрдо рд╡реАрдбрд┐рдпреЛ рдмрдирд╛рддрд╛ рд╣реИ
@ photo2comicsbot - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рдЕрд╡рд╕рд░ рдХреЗ рдирд╛рдпрдХ


рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЖрдП рдкрд░рд┐рдгрд╛рдореЛрдВ, рд╡рд┐рдЪрд╛рд░реЛрдВ рдФрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред
рдЖрдЬ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдЬрд▓реНрдж рдорд┐рд▓рддреЗ рд╣реИрдВ!

Source: https://habr.com/ru/post/hi485824/


All Articles