#七夕快来秀一脸

用预先训练好的模型将普通人像图片转换成对应的卡通形象图片

  • 效果演示

人像1:

人像2:

  • 需要的环境和包

python

torch >= 1.7.1
torchvision

  • 代码文件
from PIL import Image
import torch
from torchvision.transforms.functional import to_tensor, to_pil_image
from torch import nn
import os
import torch.nn.functional as F
import uuid# -------------------------- hy add 01 --------------------------
class ConvNormLReLU(nn.Sequential):def __init__(self, in_ch, out_ch, kernel_size=3, stride=1, padding=1, pad_mode="reflect", groups=1, bias=False):pad_layer = {"zero": nn.ZeroPad2d,"same": nn.ReplicationPad2d,"reflect": nn.ReflectionPad2d,}if pad_mode not in pad_layer:raise NotImplementedErrorsuper(ConvNormLReLU, self).__init__(pad_layer[pad_mode](padding),nn.Conv2d(in_ch, out_ch, kernel_size=kernel_size, stride=stride, padding=0, groups=groups, bias=bias),nn.GroupNorm(num_groups=1, num_channels=out_ch, affine=True),nn.LeakyReLU(0.2, inplace=True))class InvertedResBlock(nn.Module):def __init__(self, in_ch, out_ch, expansion_ratio=2):super(InvertedResBlock, self).__init__()self.use_res_connect = in_ch == out_chbottleneck = int(round(in_ch * expansion_ratio))layers = []if expansion_ratio != 1:layers.append(ConvNormLReLU(in_ch, bottleneck, kernel_size=1, padding=0))# dwlayers.append(ConvNormLReLU(bottleneck, bottleneck, groups=bottleneck, bias=True))# pwlayers.append(nn.Conv2d(bottleneck, out_ch, kernel_size=1, padding=0, bias=False))layers.append(nn.GroupNorm(num_groups=1, num_channels=out_ch, affine=True))self.layers = nn.Sequential(*layers)def forward(self, input):out = self.layers(input)if self.use_res_connect:out = input + outreturn outclass Generator(nn.Module):def __init__(self, ):super().__init__()self.block_a = nn.Sequential(ConvNormLReLU(3, 32, kernel_size=7, padding=3),ConvNormLReLU(32, 64, stride=2, padding=(0, 1, 0, 1)),ConvNormLReLU(64, 64))self.block_b = nn.Sequential(ConvNormLReLU(64, 128, stride=2, padding=(0, 1, 0, 1)),ConvNormLReLU(128, 128))self.block_c = nn.Sequential(ConvNormLReLU(128, 128),InvertedResBlock(128, 256, 2),InvertedResBlock(256, 256, 2),InvertedResBlock(256, 256, 2),InvertedResBlock(256, 256, 2),ConvNormLReLU(256, 128),)self.block_d = nn.Sequential(ConvNormLReLU(128, 128),ConvNormLReLU(128, 128))self.block_e = nn.Sequential(ConvNormLReLU(128, 64),ConvNormLReLU(64, 64),ConvNormLReLU(64, 32, kernel_size=7, padding=3))self.out_layer = nn.Sequential(nn.Conv2d(32, 3, kernel_size=1, stride=1, padding=0, bias=False),nn.Tanh())def forward(self, input, align_corners=True):out = self.block_a(input)half_size = out.size()[-2:]out = self.block_b(out)out = self.block_c(out)if align_corners:out = F.interpolate(out, half_size, mode="bilinear", align_corners=True)else:out = F.interpolate(out, scale_factor=2, mode="bilinear", align_corners=False)out = self.block_d(out)if align_corners:out = F.interpolate(out, input.size()[-2:], mode="bilinear", align_corners=True)else:out = F.interpolate(out, scale_factor=2, mode="bilinear", align_corners=False)out = self.block_e(out)out = self.out_layer(out)return out# -------------------------- hy add 02 --------------------------def load_image(image_path, x32=False):img = Image.open(image_path).convert("RGB")if x32:def to_32s(x):return 256 if x < 256 else x - x % 32w, h = img.sizeimg = img.resize((to_32s(w), to_32s(h)))return imgdef handle(image_path: str, output_dir: str, type: int, device='cpu'):_ext = os.path.basename(image_path).strip().split('.')[-1]if type == 1:_checkpoint = './weights/paprika.pt'elif type == 2:_checkpoint = './weights/face_paint_512_v2.pt'else:raise Exception('type not support')os.makedirs(output_dir, exist_ok=True)net = Generator()net.load_state_dict(torch.load(_checkpoint, map_location="cpu"))net.to(device).eval()image = load_image(image_path)with torch.no_grad():image = to_tensor(image).unsqueeze(0) * 2 - 1out = net(image.to(device), False).cpu()out = out.squeeze(0).clip(-1, 1) * 0.5 + 0.5out = to_pil_image(out)result = os.path.join(output_dir, '{}.{}'.format(uuid.uuid1().hex, _ext))out.save(result)return resultif __name__ == '__main__':print(handle('samples/images/image.jpg', 'samples/images_result/', 1, 'cuda'))

注:模型文件和待转换图片的路径修改成自定义的

模型文件下载地址:普通图片转换成卡通图片的模型文件-深度学习文档类资源-CSDN下载

深度学习的浪漫---普通图片自动转成卡通图片相关推荐

  1. 深度学习之自编码器(2)Fashion MNIST图片重建实战

    深度学习之自编码器(2)Fashion MNIST图片重建实战 1. Fashion MNIST数据集 2. 编码器 3. 解码器 4. 自编码器 5. 网络训练 6. 图片重建 完整代码  自编码器 ...

  2. 清华大学矣晓沅:“九歌”——基于深度学习的中国古典诗歌自动生成系统

    授权自AI科技大本营(ID:rgznai100) 本文共2714字,建议阅读6分钟. 本文为你介绍清华自然语言处理与社会人文计算实验室的自动作诗系统--"九歌"及其相关的技术方法和 ...

  3. 深度学习修炼(三)——自动求导机制

    文章目录 致谢 3 自动求导机制 3.1 传播机制与计算图 3.1.1 前向传播 3.1.2 反向传播 3.2 自动求导 3.3 再来做一次 3.4 线性回归 3.4.1 回归 3.4.2 线性回归的 ...

  4. 记录|深度学习100例-卷积神经网络(CNN)彩色图片分类 | 第2天

    记录|深度学习100例-卷积神经网络(CNN)彩色图片分类 | 第2天 1. 彩色图片分类效果图 数据集如下: 测试图1如下 训练/验证精确图如下: 优化后:测试图--打印预测标签: 优化后:测试图- ...

  5. 深度学习传感器融合技术在自动驾驶汽车感知与定位中的应用研究进展

    论文研读--Deep Learning Sensor Fusion for Autonomous Vehicle Perception and Localization: A Review 深度学习传 ...

  6. 【Unity3D Editor】导入图片自动转换成Sprite

    [Unity3D Editor]导入图片自动转换成Sprite https://blog.csdn.net/july_unity/article/details/79275097 一,导入 1,无论是 ...

  7. 【实战】(字节跳动、日本东京大学)学习使用白盒表示+GAN来创作卡通图片:Learning to Cartoonize Using White-Box Cartoon Representations

    要说亚洲动漫制作的王者,当然是我们一衣带水的邻邦--日本. 2020年字节跳动和日本东京大学联合发表了一篇<Learning to Cartoonize Using White-Box Cart ...

  8. ecshop图片自动本地化插件,ECSHOP下载商品图片,ECSHOP商品详情远程图片,ecshop商品远程图片保存,ecshop图片自动本地化插件,商品图片本地化

    ecshop图片自动本地化插件,ECSHOP下载商品图片,ECSHOP商品详情远程图片,ecshop商品远程图片保存,ecshop图片自动本地化插件,商品图片本地化,图片远程本地化插件,ecshop远 ...

  9. Word图片自动编号,调整图片顺序自动更新图片编号,引用该图片的地方也对应更新

    Word图片自动编号,调整图片顺序自动更新图片编号,引用该图片的地方也对应更新 1.软件环境⚙️ 2.问题描述

最新文章

  1. L1-003 个位数统计
  2. 现代密码学3.1--定义计算安全的两种方法
  3. Java继承Thread类创建多线程
  4. App设计灵感之十二组精美的酒店预定App设计案例
  5. 同一个html自动跳转分页,一个页面有多个分页,相互影响
  6. @sql 单元测试_SQL单元测试最佳实践
  7. 关于C++ 中大小端和位域
  8. Linux LVS Keepalived实现Httpd服务器80端口的负载均衡
  9. ARM中国区大学计划
  10. 苹果手机如何深度清理_手机应用 | 推荐5款深度清理手机内存的软件
  11. php元换成万元,1000元怎么换算成万元(元怎么换成万元)
  12. matlab图片客观评价,图像质量评价(一):IQA介绍
  13. Mysql数据库repair table 修复表
  14. oracle数据投毒,Oracle Database Server ‘TNS Listener’远程数据投毒漏洞(CVE-2012-1675)的解决方案...
  15. 【附源码】计算机毕业设计java装修信息分享管理系统设计与实现
  16. 英语中学生测试软件,中考英语口语测试软件.doc
  17. NokiaS60系列的jes-lcdui1@异常的分析
  18. 【华人学者风采】汪建军 华北电力大学
  19. pdf论文图中数据自动扫描,识别和获取
  20. 微信发出去的照片服务器会保存吗,转发或保存别人微信朋友圈的照片,别人是否会知道...

热门文章

  1. Qt界面设计常用英文对照
  2. 20170929校内训练
  3. php 64位整数,32位和64位PHP和MySQL里的整型范围
  4. Google DFP广告管理系统简介:下订单
  5. linux中 samba服务器配置,linux下samba服务器安装配置方法
  6. PPT2007计算机模块试题,2015年计算机职称考试PPt2007模拟题
  7. 用Android平板模拟蓝牙耳机,与手机连接,实现接听与拨打电话-预研
  8. 基于Python的nc批量转tif
  9. 帝国时代2开源克隆版 源码下载OpenAge (c/c++)
  10. 相机SD卡无法读取提示格式化 相机SD卡无法读取怎么修复