目录

前言

项目结构

核心代码

总结


前言

接着我上一篇开源机器学习的使用:如何将照片变成卡通图,animegan2-pytorch机器学习项目使用 | 机器学习_阿良的博客-CSDN博客

我还是继续把项目稍微魔改一下,依然变为一个python文件就可以执行单一图片的处理。变为可以直接拿去使用的工具。

项目github地址:github地址

项目结构

samples目录里面有一些样例图片,可以测试用。weights目录放了原项目的4个模型。python环境需要安装一些依赖,主要是pytorch。pytorch的环境安装可以参考我的另一篇文章:机器学习基础环境部署 | 机器学习系列_阿良的博客-CSDN博客

核心代码

不废话,上核心代码了。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/12/4 22:34
# @Author  : 剑客阿良_ALiang
# @Site    :
# @File    : image_cartoon_tool.pyfrom 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/fengjing.jpg', 'samples/images_result/', 1))print(handle('samples/images/renxiang.jpg', 'samples/images_result/', 2))

代码说明

1、handle方法可以将一张图片变为卡通化图片,入参为:图片路径、输出目录、类型(1为景色类型图片、2为人物人像图片)、设备类型(默认cpu,可以选择cuda)

2、按照我上一篇文章的测试,适合风景的模型和适合人像的模型不太一样,所以做了区分。

3、输出结果图片名字为了不重复,使用uuid。

验证一下

先发一下准备的图片

执行结果

效果如下

OK,没什么问题。

总结

整体效果还不错,最近在想要不要把操作过程录制成视频,可能会让人更好理解,只是不知道有没有必要,也征求一下意见,可以私信或者评论告诉我。

这个项目我还会改改,让输入变为视频不是更香吗?

分享:

我想成为一个温柔的人,因为曾被温柔的人那样对待,深深了解那种被温柔相待的感觉。

·        ——《夏目友人帐》

如果本文对你有帮助的话,给个赞吧,谢谢!

Python实现照片卡通化,一拳打破次元壁 | 机器学习相关推荐

  1. python头像转卡通_【Python】照片卡通化

    导语 最近想换个好看点的卡通头像,于是想着可以尝试利用Python与一些图像处理技术将照片卡通化,没有使用深度学习,只是做了些简单的尝试,过来分享一波,效果一般般吧,感觉可以凑合着用用. 让我们愉快地 ...

  2. Python实现GIF动图以及视频卡通化,两脚踢碎次元壁 | 机器学习

    目录 前言 环境依赖 核心代码 gif动图卡通化 视频卡通化 总结 前言 接着我的上一篇文章:Python实现照片卡通化,一拳打破次元壁 | 机器学习_阿良的博客-CSDN博客 我继续魔改一下,让该模 ...

  3. 什么软件可以把真人照片卡通化、动漫化?

    相信大家平时也看过很多动漫,你是不是觉得动漫人物很可爱,是不是经常把自己代入动漫场景中?许多朋友说,他们想也想看看自己变成动漫卡通人物会是什么样子,并想制作自己的卡通肖像.事实上,这并不难实现. 对于 ...

  4. CartoonGAN_CVPR_2018为照片卡通化而生的对抗网络论文阅读笔记

    CartoonGAN_CVPR_2018 好了 进入正题 话不多说 快上车 CartoonGAN: Generative Adversarial Networks for Photo Cartooni ...

  5. 我们造出了打破次元壁的锤子,然后呢?

    大多数游戏玩家或多或少萌生过这样一个念头:如果可以化身游戏中的角色,生活在游戏中的世界里会是一种什么样的体验? 擅长琢磨观众心理的科幻电影大师们早就给出了答案:斯皮尔伯格在<头号玩家>讲述 ...

  6. 用 python 快速「卡通化」人物头像

    大家好,我是天作. 这个项目让我想起了以前玩QQ秀的时光.有了这个项目,再也不用找同学了,我自己也可以把头像卡通化了. 该项目为小视科技卡通肖像探索项目.可使用微信扫描下方二维码或搜索"AI ...

  7. python视频处理为卡通风格_用 python 快速「卡通化」人物头像

    这个项目让我想起了以前玩QQ秀的时光.有了这个项目,再也不用找同学了,我自己也可以把头像卡通化了. 下图是我的头像.不得不说还真是神似. 人像卡通风格渲染的目标是,在保持原图像ID信息和纹理细节的同时 ...

  8. Sketch n Cartoonize for mac(照片卡通化素描化编辑工具)

    Sketch n Cartoonize 可以使用复杂的算法来实现"逼真的"和"近乎完美"的卡通外观,获得您想要的照片效果. Sketch n Cartooniz ...

  9. 手机虚拟摄像头_新游 | 打破次元壁障,《猪猪侠AR虚拟使命》现实约战,一切尽在创酷互动!...

    今日,创酷互动游戏<猪猪侠AR虚拟使命>全网震撼首发,冬季火爆登陆.本款游戏采用知名IP<猪猪侠>,更采用<口袋妖怪GO>所应用的AR增强现实技术,全新科技AR制作 ...

最新文章

  1. 19、Java并发性和多线程-嵌套管程锁死
  2. mysql数据库的增删改查
  3. 今晚直播 | AAAI 2018论文解读:零资源机器翻译的最新进展
  4. 工作记录四-etcd与flanneld
  5. Myeclipse 6.5 优化
  6. 《网络管理员考试案例导学》复习重点
  7. nuxt解决首屏加载慢问题_Nuxt.js超过Vue.js:你什么时候应该使用它,为什么
  8. Direct2D教程(七)单色画刷
  9. easyswoole数据库连接池_Swoole Redis 连接池的实现
  10. Simple QQLogin 1.3(QQ2008 或更早版本)
  11. c语言笔试面试大全,C语言基础笔试题
  12. mysql8 启动报错:Error while setting value ‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DI
  13. ros入门--中科院软件所ros学习笔记
  14. 系统性能优化的十大策略(强烈推荐,建议收藏)
  15. 计算机等级图片背景蓝色怎么调,证件照背景颜色怎么换?白色蓝色背景都能换的方法...
  16. linux系统连接不上wifi
  17. PDF怎么编辑修改内容?教你一招轻松搞定
  18. [基础算法] 并查集
  19. java类和对象之包的定义
  20. 【数学】如何求e的值

热门文章

  1. leetcode系列--18.四数之和
  2. 《〈XNova/OGame〉源码笔记》(5)
  3. 【CTF】PGP邮件加密教程
  4. shell中的时间值提取(date)
  5. ISP图像质量调节(转)
  6. python缺少标准库_如何将python标准库缺失的进行导入?
  7. go语言html模板,go html模板的使用
  8. linux复制/移动ls |head -n 10 |xargs -i cp -r {} /target文件夹中前10个文件
  9. [操作系统] 操作系统真相还原读书笔记三:MBR加载loader到内存并跳转到loader执行
  10. 计算机组成原理 doc,计算机组成原理A.doc