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

目录

前言

项目结构

核心代码

总结


前言

接着我上一篇开源机器学习的使用:如何将照片变成卡通图,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,没什么问题。

总结

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

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

分享:

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

                                                                                                        ·        ——《夏目友人帐》

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/52666.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能画画 yyds

最近 AI 绘画火的一塌糊涂&#xff0c;你输一句话 AI 自动把你描述的场景画出来。本文盘点 GitHub 上几个较火的 AI 绘画开源项目。 本期推荐开源项目目录&#xff1a; 1. Latent Diffusion 2. PI-REC 3. Disco Diffusion 4. DALLE 01 Latent Diffusion Stable Diffusion 是 St…

人脸动漫化AnimeGAN V2的具体实施步骤

本文提供应对课设&#xff0c;毕设的小伙伴们一些参考&#xff1a;项目是参照网络上比较火的一个项目AnimeGAN V2&#xff0c;然后当时的一个课题也是跟这个相关&#xff0c;然后我是直接调用这个的&#xff0c;但是中间遇到过很多的问题&#xff0c;现在想说明一些问题&#x…

详解生成对抗网络(GAN)- 体验AI作画

目录 1.GAN是什么&#xff1f; 2.GAN的计算 3.编写GAN的小小示例 4.GAN的发展与应用 5.AI作画体验-Disco Diffusion 1.GAN是什么&#xff1f; 2014年&#xff0c;因为朋友邀请协助一个计算机生成图像的项目&#xff0c;lanGooddellow发明了GAN&#xff08;Generative ad…

人工智能下象棋,走一步,能看几步?|漫画

图文原创&#xff1a;谭婧 谭婧老师爱下象棋&#xff0c;就是谁也赢不了。 去公园下了一盘棋 &#xff0c;第一步我就走了一个当头炮 &#xff0c;剩下的都是大爷们帮我走的。 结果&#xff0c;我输了。 经过他们的总结研究&#xff0c;我第一步走错了 。 2022年&#xff0c;象…

参考文献怎么查找,去哪里查找?一篇文章讲明白这些问题

在我们撰写论文查找参考文献时&#xff0c;往往不知道从哪里入手&#xff0c;本文小编就针对下面这三个方面给大家详细讲解下&#xff1a; 一、查找参考文献方法 二、参考文献资料查找网站 三、参考文献格式规范 一、查找参考文献方法&#xff1a; 1、知网全球最大的中文数据…

与外文文献有关的那些事儿

目录 SCI是什么 一、SCI分区依据&#xff1f; 二、如何查找外文文献 1.常用的外文文献数据库​编辑 2.Web of Science数据库 总结 SCI是什么 SCI是美国《科学引文索引》的英文简称&#xff0c;其全称为&#xff1a;Science Citation Index,&#xff0c;创刊于1961年&…

从算力到存力:存储芯片研究框架(2023)

2023年3月31日&#xff0c;我国发起对美光在华销售产品的网络安全审查&#xff0c;体现出存储产业安全的重要性。此外&#xff0c;AI算力需求拉动高算力服务器出货&#xff0c;而AI服务器的存力需求更强&#xff0c;AI将驱动“从算力到存力”的中长期需求&#xff1a; 1、海外…

Python为什么有那么多人在学?有了ChatGPT还有必要学习Python吗?

为什么学习Python呢&#xff1f; 学习 Python 的原因有很多&#xff0c;以下是一些常见的原因&#xff1a; 简单易学&#xff1a; Python 是一门易于学习的编程语言&#xff0c;语法简单、清晰明了&#xff0c;可以快速掌握基本的编程概念。 应用广泛&#xff1a; Python 是…

在数字化质变“奇点”时刻,看数字生产力跃升的华为观

&#xff08;华为轮值董事长孟晚舟&#xff09; 进入2023年&#xff0c;以大语言模型为代表的新AI&#xff0c;打开了全球对于数字生产力的全新认知&#xff1a;高盛集团经济学家认为&#xff0c;ChatGPT等生成式AI最终可能在10年的时间里使得全球年GDP增长7%&#xff08;近7万…

chatgpt赋能python:Python照片换底:让您的照片更具艺术感

Python照片换底&#xff1a;让您的照片更具艺术感 Python是一种高级编程语言&#xff0c;拥有丰富的库和工具&#xff0c;可以实现多种应用。其中&#xff0c;照片换底技术是很多人感兴趣的内容之一。通过使用Python&#xff0c;您可以自动抠出照片中的主体&#xff0c;并将其…

chatgpt赋能Python-pycharm怎么重新配置python环境

Pycharm重新配置Python环境方法概述 如果您是Python编程的专业人士或者是刚开始学习Python&#xff0c;您可能已经听说了Pycharm这个IDE。Pycharm不仅可以提高您Python编程的效率&#xff0c;而且也大大改善了整个开发过程。不过&#xff0c;如果您需要使用Pycharm重新配置Pyt…

运营小红书需要注意什么?这4个方法助你成为小红书达人!(上)

在小红书这个平台上&#xff0c;大部分人都心照不宣的意识到成为小红书的博主就能赚到钱&#xff0c;这是事实。比如粉丝5千的博主就可以申请成为小红书的创作者&#xff0c;开始推广赚钱&#xff0c;而粉丝过万的博主除了申请创作者外&#xff0c;可能还会有品牌主动找你合作。…

小红书「高效达人筛选攻略」

三八女神节降临&#xff0c;诸多品牌纷纷开启铺垫预热&#xff0c;在各大平台借势宣传。而聚集庞大年轻女性消费群体的小红书&#xff0c;对“她营销”的重要性不言而喻。节点序幕拉开&#xff0c;面对海量达人信息&#xff0c;如何提前积草屯粮、高效备战&#xff1f; 本期千瓜…

小红书达人怎么找?保姆级教程来了~

在小红书推广营销中&#xff0c;寻找优质的达人是最头疼的事&#xff0c;许多品牌往往会根据简单的小红书排名来直接进行判断认定&#xff0c;其实在挑选小红书达人时有许多要注意的点&#xff0c;接下来和小编一起根据小红书数据分析工具来筛选合适、优质的达人。 千瓜数据—…

阿里云版GPT官宣,我们问了它10个问题

4月7日&#xff0c;阿里云宣布自研大模型“通义千问”&#xff0c;目前已开始邀请用户测试体验。 阿里达摩院在NLP自然语言处理等前沿科研领域早已布局多年&#xff0c;并于2019年启动大模型研发&#xff0c;通义千问便是其最新成果&#xff0c;相当于阿里云版的“ChatGPT”。 …

《长津湖》,我没看够

大家好&#xff0c;我是校长。 今天我比较期待的一个电影《长津湖》终于上映了&#xff0c;下午的时候&#xff0c;我就去电影院看了这部电影。 其实&#xff0c;我这个人从小喜欢看历史&#xff0c;看近现代史&#xff0c;我小学和中学的时候&#xff0c;历史经常考满分&#…

前端和HTML基础

本文重点&#xff1a; 1. 介绍什么是前端。 2. 简单介绍了html以及html中常用的一些标签。 前端 1.含义 使用web技术栈解决多终端图形界面下的人机交互问题 前端技术栈分为三层&#xff1a; HTML为内容&#xff0c;CSS为样式&#xff0c;JavaScript为行为&#xff0c;三者通过H…

中文影评分类的神经网络模型

本文旨在利用Tensorflow训练一个中文影评二分类神经网络,由于分词处理是以词为最小单位的&#xff0c;所以该模型同时也是word-based NLP模型。 准备文本训练集 训练集为一个文本文件&#xff0c;数字部分为影评的标签&#xff0c;1表示影评是消极的&#xff0c;0表示影评是积极…

5.springboot整合thymeleaf

1.创建数据库 DROP TABLE IF EXISTS movie; CREATE TABLE movie (id int(255) NOT NULL AUTO_INCREMENT,name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,author varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,score varchar(2…

2.springboot整合mybatisplus

1.创建数据库 DROP TABLE IF EXISTS movie; CREATE TABLE movie (id int(255) NOT NULL AUTO_INCREMENT,name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,author varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,score varchar(2…