Python使用AI animegan2-pytorch制作属于你的漫画头像/风景图片

news2024/11/17 13:51:55

Python使用AI animegan2-pytorch制作属于你的漫画头像

    • 1. 效果图
    • 2. 原理
    • 3. 源码
    • 参考

git clone https://github.com/bryandlee/animegan2-pytorch
cd ./animegan2-pytorch
python test.py --photo_path images/photo_test.jpg --save_path images/animegan2_result.png

1. 效果图

官方效果图如下:

效果图v2 512模型如下:
在这里插入图片描述

效果图v1 512模型如下:
在这里插入图片描述

效果图v1 效果不太好如下:
在这里插入图片描述

效果图rece如下
人物会有一种病态的美,过于白了,风景上效果更好一些;
人物与photo2cartoon的效果图有点像;
在这里插入图片描述

在这里插入图片描述

效果图paprika 模型如下
人物纹理痕迹太过明显,更适合风景
下一张明兰的效果还不错,不同的模型在不同的图像上也会有些微差别;
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

origin vs v1Res vs v2Res vs paprikaRes vs celedistillResAll 风景效果对比图如下:

在这里插入图片描述
在这里插入图片描述

origin vs v1Res vs v2Res vs paprikaRes vs celedistillResAll 人物效果对比图如下:
在这里插入图片描述
在这里插入图片描述

2. 原理

人像/风景卡通风格渲染的目标是,在保持原图像 ID 信息和纹理细节的同时,将真实照片转换为卡通风格的非真实感图像。

3. 源码

源码及示例文件模型等见资源:https://download.csdn.net/download/qq_40985985/87739198

# animegan2-pytroch 生成漫画头像或者风景图
# python test.py --checkpoint weights/face_paint_512_v2.pt --input_dir samples/faces/ --device cpu --output_dir samples/resv2
# model loaded: weights/face_paint_512_v2.pt

import os
import argparse

from PIL import Image
import numpy as np

import torch
from torchvision.transforms.functional import to_tensor, to_pil_image

from model import Generator


torch.backends.cudnn.enabled = False
torch.backends.cudnn.benchmark = False
torch.backends.cudnn.deterministic = True


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 % 32
        w, h = img.size
        img = img.resize((to_32s(w), to_32s(h)))

    return img


def test(args):
    device = args.device
    
    net = Generator()
    net.load_state_dict(torch.load(args.checkpoint, map_location="cpu"))
    net.to(device).eval()
    print(f"model loaded: {args.checkpoint}")
    
    os.makedirs(args.output_dir, exist_ok=True)

    for image_name in sorted(os.listdir(args.input_dir)):
        if os.path.splitext(image_name)[-1].lower() not in [".jpg", ".png", ".bmp", ".tiff"]:
            continue
            
        image = load_image(os.path.join(args.input_dir, image_name), args.x32)

        with torch.no_grad():
            image = to_tensor(image).unsqueeze(0) * 2 - 1
            out = net(image.to(device), args.upsample_align).cpu()
            out = out.squeeze(0).clip(-1, 1) * 0.5 + 0.5
            out = to_pil_image(out)

        out.save(os.path.join(args.output_dir, image_name))
        print(f"image saved: {image_name}")


if __name__ == '__main__':

    parser = argparse.ArgumentParser()
    parser.add_argument(
        '--checkpoint',
        type=str,
        default='./weights/paprika.pt',
    )
    parser.add_argument(
        '--input_dir', 
        type=str, 
        default='./samples/inputs',
    )
    parser.add_argument(
        '--output_dir', 
        type=str, 
        default='./samples/results',
    )
    parser.add_argument(
        '--device',
        type=str,
        default='cuda:0',
    )
    parser.add_argument(
        '--upsample_align',
        type=bool,
        default=False,
        help="Align corners in decoder upsampling layers"
    )
    parser.add_argument(
        '--x32',
        action="store_true",
        help="Resize images to multiple of 32"
    )
    args = parser.parse_args()
    
    test(args)

# 原图VS效果图绘制
# python plot_sample.py

# 获取输入路径的所有图像
import cv2
import imutils
import numpy as np
from imutils import paths

imagePaths = sorted(list(paths.list_images("samples")))

list = [x for x in imagePaths if x.find('inputs') > 0]
print(list)

resv1 = [x for x in imagePaths if x.find("resv1") > 0]
resv2 = [x for x in imagePaths if x.find("resv2") > 0]
cele = [x for x in imagePaths if x.find("cele") > 0]
pap = [x for x in imagePaths if x.find("paprika") > 0]

img = None
for i in list:
    if (i.find("ml2.jpg") < 0): continue
    img = None
    for j in resv1:
        if (j.split("\\")[2].__eq__(i.split("\\")[2])):
            origin = cv2.imread(i)
            res = cv2.imread(j)
            if (origin.shape[0] != res.shape[0] or origin.shape[1] != res.shape[1]):
                res = cv2.resize(res, (origin.shape[1], origin.shape[0]))
            # print(origin.shape, res.shape)
            # print('origin vs ' + j.split("\\")[1].replace("res", "") + 'Res')
            cv2.imshow('origin vs ' + j.split("\\")[1].replace("res", "") + 'Res',
                       imutils.resize(np.hstack([origin, res]), width=300))
            if (img is None):
                img = imutils.resize(np.hstack([origin, res]), width=300)
            else:
                imgA = np.vstack([img, imutils.resize(np.hstack([origin, res]), width=300)])

                img = imgA
            cv2.imshow('origin vs ' + j.split("\\")[1].replace("res", "") + 'ResAll',
                       img)
            # cv2.waitKey(0)
    for j in resv2:
        if (j.split("\\")[2].__eq__(i.split("\\")[2])):
            origin = cv2.imread(i)
            res = cv2.imread(j)
            if (origin.shape[0] != res.shape[0] or origin.shape[1] != res.shape[1]):
                res = cv2.resize(res, (origin.shape[1], origin.shape[0]))
            # cv2.imshow('origin vs ' + j.split("\\")[1].replace("res", "") + 'Res',
            #            imutils.resize(np.hstack([origin, res]), width=300))
            if (img is None):
                img = imutils.resize(np.hstack([origin, res]), width=300)
            else:
                imgA = np.vstack([img, imutils.resize(np.hstack([origin, res]), width=300)])

                img = imgA
            # cv2.imshow('origin vs ' + j.split("\\")[1].replace("res", "") + 'ResAll',
            #            img)
            # cv2.waitKey(0)
    for j in pap:
        if (j.split("\\")[2].__eq__(i.split("\\")[2])):
            # print('--------------\t', i, j)
            origin = cv2.imread(i)
            res = cv2.imread(j)
            if (origin.shape[0] != res.shape[0] or origin.shape[1] != res.shape[1]):
                res = cv2.resize(res, (origin.shape[1], origin.shape[0]))
            # print(origin.shape, res.shape)
            # print('origin vs ' + j.split("\\")[1].replace("res", "") + 'Res')
            # cv2.imshow('origin vs ' + j.split("\\")[1].replace("res", "") + 'Res',
            #            imutils.resize(np.hstack([origin, res]), width=300))
            # list.append(imutils.resize(np.hstack([origin, res]), width=300))
            if (img is None):
                img = imutils.resize(np.hstack([origin, res]), width=300)
            else:
                imgA = np.vstack([img, imutils.resize(np.hstack([origin, res]), width=300)])

                img = imgA
            # cv2.imshow('origin vs ' + j.split("\\")[1].replace("res", "") + 'ResAll',
            #            img)
            # cv2.waitKey(0)
    for j in cele:
        if (j.split("\\")[2].__eq__(i.split("\\")[2])):
            # print('--------------\t', i, j)
            origin = cv2.imread(i)
            res = cv2.imread(j)
            if (origin.shape[0] != res.shape[0] or origin.shape[1] != res.shape[1]):
                res = cv2.resize(res, (origin.shape[1], origin.shape[0]))
            # print(origin.shape, res.shape)
            # print('origin vs ' + j.split("\\")[1].replace("res", "") + 'Res')
            # cv2.imshow('origin vs ' + j.split("\\")[1].replace("res", "") + 'Res',
            #            imutils.resize(np.hstack([origin, res]), width=300))
            # list.append(imutils.resize(np.hstack([origin, res]), width=300))
            if (img is None):
                img = imutils.resize(np.hstack([origin, res]), width=300)
            else:
                imgA = np.vstack([img, imutils.resize(np.hstack([origin, res]), width=300)])

                img = imgA
            cv2.imshow('origin vs v1Res vs v2Res vs paprikaRes vs celedistillResAll',
                       img)
            cv2.waitKey(0)

参考

  • https://alltodata.blog.csdn.net/article/details/125183830
  • https://github.com/bryandlee/animegan2-pytorch

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全球首个机器人辅助试管婴儿降生

近日&#xff0c;两名通过机器人辅助受精手术成功诞生的女婴成为全球瞩目的焦点。这是全球首批由机器人成功辅助受精的婴儿案例&#xff0c;预示着未来生育技术的发展趋势。 以往&#xff0c;试管婴儿受精过程中将精子注入卵子内的环节都是由人工完成。胚胎技术人员需要在显微镜…

最简单的循环

☃️个人主页&#xff1a;fighting小泽 &#x1f338;作者简介&#xff1a;目前正在学习C语言和数据结构 &#x1f33c;博客专栏&#xff1a;C语言学习 &#x1f3f5;️欢迎关注&#xff1a;评论&#x1f44a;&#x1f3fb;点赞&#x1f44d;&#x1f3fb;留言&#x1f4aa;&am…

6. Docker——详说镜像

本章讲解知识点 Docker 镜像 Union File System&#xff08;联合文件系统&#xff09;技术 回说 Docker 镜像分层 Docker 镜像分层原理 1. Docker 镜像 镜像是一种轻量级、可执行的独立软件包&#xff0c;用来打包软件运行环境和基于运行环境开发的软件&#xff0c;它包含…

一文了解 Zebec Labs 投资的 Coral Finance,空投计划或在不久推出

在前不久&#xff0c;Zebec Labs 宣布对链上衍生品协议 Coral Finance 进行150万美元的投资&#xff0c;以帮助该协议完成早期启动并&#xff0c;并在后续持续的为其提供孵化支持。Coral Finance 将在不久部署在 Nautilus Chain 主网上。据了解&#xff0c;Coral Finance 是 Na…

【VM服务管家】VM4.2平台SDK_6.2 模块操作类

目录 2.2.1 流程操作&#xff1a;通过流程或Group设置输入输出图像的方法2.2.2 模块操作&#xff1a;设置输入图像、参数和ROI2.2.3 N点标定&#xff1a;清空标定点、生成标定文件2.2.4 分支字符&#xff1a;控制调试模式开关的方法2.2.5 条件检测&#xff1a;条件检测模块设置…

【GAMES101】02 Review Of Linear Algebra

1.点乘&#xff1a; 向量点乘 → 一个数值 点乘在图形学中的应用&#xff1a; 找到两个方向之间的夹角。找到一个向量投影到另一个向量上是什么样的。计算两个向量的方向&#xff08;是接近还是远离&#xff09;判定高光范围&#xff0c;从1&#xff08;重合&#xff…

【VM服务管家】VM4.2平台SDK_6.5 全局类

目录 2.5.1 全局相机&#xff1a;获取全局相机列表和设置相机参数的方法 2.5.1 全局相机&#xff1a;获取全局相机列表和设置相机参数的方法 描述 环境&#xff1a;VM4.2 VS2013及以上 问题&#xff1a;问题1&#xff1a;如何获取方案中所有的全局相机的连接状态&#xff0c;…

c++基础-分支语句

目录 if语句 if-else switch语句 if语句 在C中&#xff0c;if语句是一种分支结构&#xff0c;它允许程序根据条件执行不同的操作。可以使用if语句来检查一个条件是否为真&#xff0c;如果为真就执行一个语句块&#xff0c;否则执行另一个语句块。 if语句的语法如下&#xff…

自媒体平台图文创作建议和技巧

自媒体博主在自媒体平台进行图文创作时&#xff0c;需要注意哪些方面才能创造出更好的内容获得更多的关注呢&#xff1f;今天跟大家分享自媒体创作中的一些图文创作建议和技巧。 一、确定目标受众 首先需要明确自己要传达的信息和目标受众。要考虑读者的兴趣、需求和阅读习惯&…

2001-2021年全国30省就业人数数据

2001-2021年全国30省就业人数数据/各省就业人数数据 1、时间&#xff1a;2001-2021年 2、范围&#xff1a;包括30个省市不含西藏 3、指标&#xff1a;就业人数 4、来源&#xff1a;各省NJ、社会统计NJ 5、缺失情况说明&#xff1a;无缺失 6、指标说明&#xff1a; 就业人…

【Python入门】人生苦短,我用Python

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Python零基础入门系列&#xff0c;本专栏主要内容为Python基础语法、判断、循环语句、函…

10万字城市大脑一网统管分析平台及大数据平台建设方案(WORD)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 一.1.1.督查监管子系统 督察监管子系统是指通过独立的督察队伍&#xff0c;以日常督察、专项督察的方式&#xff0c;来检查运行效果。根据工作进度&#xff0c;工作中存在的…

【无人车】无人驾驶地面车辆避障研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

ChatGPT常见问题及其解决方法汇总

好久没有更新过技术类的文章了&#xff0c;希望本篇文章能够对你有所帮助&#xff0c;今天这篇博客将会把ChatGPT注册中可能遇到的问题彻头彻尾的讲一下&#xff0c;创作不易&#xff0c;如果感觉有帮助的话就动动你发财的小手点个收藏点个赞吧。如有需要转载请附上原文链接&am…

mysql5.7以上的启动、停止、赋权命令

文章目录 1、启动mysql server2、查看初始密码3、本地登陆mysql4、修改本地root用户密码5、防火墙设置6、开启mysql的远程登录 1、启动mysql server systemctl start mysqld #启动程序 systemctl enable mysqld #开机自运行 systemctl status mysqld #查看状态…

浅谈WebGIS未来应用与技术发展趋势

前言 WebGIS&#xff08;Web GIS&#xff09;是一种基于Web的地理信息系统&#xff0c;它可以实现地理空间数据的查询、分析、管理和可视化。与传统的 GIS 相比&#xff0c;WebGIS 是通过浏览器实现客户端与服务器间的信息交流&#xff0c;成本降低&#xff0c;且界面友好&…

No.046<软考>《(高项)备考大全》【专项2】《案例分析 - 计算题(上)》

《&#xff08;高项&#xff09;备考大全》【专项2】《案例分析 - 计算题》 1 题型全部概况2 时间管理2.1 关键路径法 CMP2.1.1 原理2.1.2 关键路径的基本问题2.1.3 题目7、题目6 - 正推、反推8、题目7 2.2 PERT&#xff08;计划评审技术&#xff09;2.3 活动排序网络图 3 成本…

CesiumForUnreal、UE5实现限高分析效果

文章目录 1.实现目标2.实现过程2.1 材质2.2 Widget2.3 运行测试3.参考资料1.实现目标 在UE5中基于CesiumForUnreal插件实现简单GIS分析功能中的限高分析效果,GIF动图如下: 2.实现过程 实现限高分析功能的方法可以大致分为两种,一种是修改3DTileset的材质;另一种是基于贴花…

gitee同一台电脑使用多个账号的问题

官方文档&#xff1a;https://gitee.com/help/articles/4238#article-header0 目录 一、通过 https / ssh 协议推拉代码二、通过 https 推拉代码但是存在多个账号的问题三、通过 ssh 推拉代码四、Git配置多个SSH-Key五、TortoiseGit客户端 一、通过 https / ssh 协议推拉代码 …

Eplan 部件库导入部件的方法

1. 部件宏文件如何下载 1.1 西门子部件宏文件下载 EPLAN 的部件库是可以更新的,一般元器件厂商会提供其部件文件,以 SIEMENS 为例 进入网站,点击EPLAN 的图标 https://www.automation.siemens.com/bilddb/index.aspx?lang=en 在订货号中输入所需部件订货号,点击搜索。点…