Python使用AI photo2cartoon制作属于你的漫画头像

这篇具有很好参考价值的文章主要介绍了Python使用AI photo2cartoon制作属于你的漫画头像。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

git clone https://github.com/minivision-ai/photo2cartoon.git
cd ./photo2cartoon
python test.py --photo_path images/photo_test.jpg --save_path images/cartoon_result.png

1. 效果图

官方效果图如下:

Python使用AI photo2cartoon制作属于你的漫画头像
效果图1如下:
Python使用AI photo2cartoon制作属于你的漫画头像
效果图2如下:

Python使用AI photo2cartoon制作属于你的漫画头像
效果图3如下:

Python使用AI photo2cartoon制作属于你的漫画头像

2. 原理

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

但是图像卡通化任务面临着一些难题:

  • 卡通图像往往有清晰的边缘,平滑的色块和经过简化的纹理,与其他艺术风格有很大区别。使用传统图像处理技术生成的卡通图无法自适应地处理复杂的光照和纹理,效果较差;基于风格迁移的方法无法对细节进行准确地勾勒。
  • 数据获取难度大。绘制风格精美且统一的卡通画耗时较多、成本较高,且转换后的卡通画和原照片的脸型及五官形状有差异,因此不构成像素级的成对数据,难以采用基于成对数据的图像翻译(Paired Image Translation)方法。
  • 照片卡通化后容易丢失身份信息。基于非成对数据的图像翻译(Unpaired Image Translation)方法中的循环一致性损失(Cycle Loss)无法对输入输出的 id 进行有效约束。

小视科技的研究团队提出了一种基于生成对抗网络的卡通化模型,只需少量非成对训练数据,就能获得漂亮的结果。卡通风格渲染网络是该解决方案的核心,它主要由特征提取、特征融合和特征重建三部分组成。

3. 源码

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

Python使用AI photo2cartoon制作属于你的漫画头像

  • 代码下载 https://github.com/minivision-ai/photo2cartoon

  • 模型下载 https://drive.google.com/uc?id=1eDNGZT3jszHLXQ9XGIUPtcu72HdBmHuX&export=download

    人像卡通化预训练模型:photo2cartoon_weights.pt,存放在 models 路径下。
    头像分割模型:seg_model_384.pb,存放在 utils 路径下。
    人脸识别预训练模型:model_mobilefacenet.pth,存放在 models 路径下。
    卡通画开源数据:cartoon_data,包含 trainB 和 testB文章来源地址https://www.toymoban.com/news/detail-431076.html

# 使用预训练的模型生成漫画头像
# python test.py --photo_path images/ml.jpg --save_path images/cartoon_ml_result.png

import argparse
import os

import cv2
import numpy as np
import torch

from models import ResnetGenerator
from utils import Preprocess

parser = argparse.ArgumentParser()
parser.add_argument('--photo_path', type=str, default='images/photo_test.jpg', help='input photo path')
parser.add_argument('--save_path', type=str, default='images/photo_test_cartoon.jpg', help='cartoon save path')
args = parser.parse_args()

os.makedirs(os.path.dirname(args.save_path), exist_ok=True)


class Photo2Cartoon:
    def __init__(self):
        self.pre = Preprocess()
        self.device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
        self.net = ResnetGenerator(ngf=32, img_size=256, light=True).to(self.device)

        assert os.path.exists(
            './models/photo2cartoon_weights.pt'), "[Step1: load weights] Can not find 'photo2cartoon_weights.pt' in folder 'models!!!'"
        params = torch.load('./models/photo2cartoon_weights.pt', map_location=self.device)
        self.net.load_state_dict(params['genA2B'])
        print('[Step1: load weights] success!')

    def inference(self, img):
        # face alignment and segmentation
        face_rgba = self.pre.process(img)
        if face_rgba is None:
            print('[Step2: face detect] can not detect face!!!')
            return None

        print('[Step2: face detect] success!')
        face_rgba = cv2.resize(face_rgba, (256, 256), interpolation=cv2.INTER_AREA)
        face = face_rgba[:, :, :3].copy()
        mask = face_rgba[:, :, 3][:, :, np.newaxis].copy() / 255.
        face = (face * mask + (1 - mask) * 255) / 127.5 - 1

        face = np.transpose(face[np.newaxis, :, :, :], (0, 3, 1, 2)).astype(np.float32)
        face = torch.from_numpy(face).to(self.device)

        # inference
        with torch.no_grad():
            cartoon = self.net(face)[0][0]

        # post-process
        cartoon = np.transpose(cartoon.cpu().numpy(), (1, 2, 0))
        cartoon = (cartoon + 1) * 127.5
        cartoon = (cartoon * mask + 255 * (1 - mask)).astype(np.uint8)
        cartoon = cv2.cvtColor(cartoon, cv2.COLOR_RGB2BGR)
        print('[Step3: photo to cartoon] success!')
        return cartoon


if __name__ == '__main__':
    img = cv2.cvtColor(cv2.imread(args.photo_path), cv2.COLOR_BGR2RGB)
    c2p = Photo2Cartoon()
    cartoon = c2p.inference(img)
    if cartoon is not None:
        cv2.imwrite(args.save_path, cartoon)
        print('Cartoon portrait has been saved successfully!')
        origin = cv2.resize(cv2.imread(args.photo_path), (256, 256))
        res = cv2.imread(args.save_path)
        print(origin.shape, res.shape)
        cv2.imshow("origin VS cartoon", np.hstack([origin, res]))
        cv2.waitKey(0)

参考

  • https://blog.csdn.net/weixin_47196664/article/details/106542463
  • 代码下载 https://github.com/minivision-ai/photo2cartoon
  • 模型下载 https://drive.google.com/uc?id=1eDNGZT3jszHLXQ9XGIUPtcu72HdBmHuX&export=download
  • https://blog.csdn.net/kexuanxiu1163/article/details/105858528

到了这里,关于Python使用AI photo2cartoon制作属于你的漫画头像的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • uniapp中使用photo-sphere-viewer.js实现全景VR图

    uniapp中使用photo-sphere-viewer.js实现全景VR图

    最近项目中要求vr功能,可以进行图片的全景查看,在此,用到了vue里的一个实现全景预览的插件:photo-sphere-viewer.js。这些插件,在uniapp中不能直接用。不过uniapp有个组件web-view,可以引入内部或外部的HTML。 首先写一个html,在html中引入三个js文件 在body中放一个div 在js中ne

    2024年02月11日
    浏览(57)
  • P2207 Photo(区间取点问题)

    核心思路: 其实就是区间取点问题 两个照片之间相当于有一个断点,那么就相当于取最少的断点,使得每一对关系不好的牛之间都有断点,这样子每一对关系不好的牛都不会出现在同一个照片里。 那么问题就转化为了给出K个区间,求出最少取几个点,使得每个区间都有点。

    2024年02月16日
    浏览(9)
  • 专业修图软件 Affinity Photo 2 mac中文版编辑功能

    专业修图软件 Affinity Photo 2 mac中文版编辑功能

    Affinity Photo for Mac是应用在MacOS上的专业修图软件,支持多种文件格式,包括psD、PDF、SVG、Eps、TIFF、JPEG等。 Affinity Photo mac提供了许多高级图像编辑功能,如无限制的图层、非破坏性操作、高级的选择工具、高级的调整层、HDR合成、全景图拼接、RAW文件处理、高级的滤镜和效果

    2024年02月07日
    浏览(11)
  • 1109 Group Photo(40行代码+超详细注释+题目分析,双端队列实现)

    分数 25 全屏浏览题目 切换布局 作者 CHEN, Yue 单位 浙江大学 Formation is very important when taking a group photo. Given the rules of forming K rows with N people as the following: The number of people in each row must be N/K (round down to the nearest integer), with all the extra people (if any) standing in the last row; All the

    2024年02月07日
    浏览(46)
  • 群晖DSM7.0-7.1.1 Synology Photos 视频缩略图处理

    群晖DSM7.0-7.1.1 Synology Photos 视频缩略图处理

    提前安装矿神SPK源里面的ffmpeg套件 DSM7.x矿神SPK套件源:https://spk7.imnks.com/ 仅适用于X86_64的黑群晖7.0-7.1.1机型,目前测试识别正常,索引期间CPU占用率也不高。 原理修改为不调用GPU显卡,只用CPU,所以不算完美!仅测试了DS918+、DS920+,其它机型自行研究! 进入DSM后台,“控制

    2024年02月11日
    浏览(15)
  • photo-sphere-viewer 全景图Vr 720全景查看(vue篇)

    图库列表切换场景及图标点击切换实现场景 注:图库插件本身对于图库列表切换,场景的标记点会是初始时设置的标记点,不会更新新的标记点,需要自己写监听调用更新标记的方法(handleGalleryChange)。同时对于标记切换场景用了viewer.setPanorama,图库列表当前选中的active没

    2024年02月11日
    浏览(27)
  • 【Python】使用百度AI能力

    【Python】使用百度AI能力

    大家好!我是初心,希望我们一路走来能坚守初心! 今天跟大家分享的文章是 Python调用百度AI能力进行植物识别。 ,希望能帮助到大家!本篇文章收录于 初心 的 Python从入门到精通 专栏。 🏠 个人主页:初心%个人主页 🧑 个人简介:大家好,我是初心,和大家共同努力 💕

    2024年02月06日
    浏览(5)
  • 使用python进行AI选股之同花顺问财

    使用python进行AI选股之同花顺问财

      通过问财python库,可以输入中文就能获取AI选股结果,而不需要写很多代码来进行股票选取,如上图就是输入中文”均线多头排列的股票”获取的结果。本文主要介绍问财python库的选股功能和使用步骤。 同花顺i问财是同花顺旗下的AI投顾平台,专注于使用AI技术改进财经数

    2024年01月18日
    浏览(77)
  • Python使用Open-AI接口实现ChatGPT

    一、前言 近年来,人工智能技术的广泛应用,为社会带来了自动化和智能化的效率提升。自然语言处理技术的快速发展也提供了更多的人工智能应用场景。本文将介绍如何使用Python编程语言,结合Open-AI接口实现ChatGPT的简单应用。 二、介绍 ChatGPT是一个能够执行在线对话的人

    2024年02月02日
    浏览(13)
  • 使用Python语言和TensorFlow Lite快速搭建AI模型

    作者:禅与计算机程序设计艺术 人工智能(Artificial Intelligence,AI)是指机器具有可以模仿或自己学习的能力,能够从经验中获取知识并解决问题。它可以自动分析、理解、交流及学习数据以提高决策力、洞察力以及创造力。近年来,基于深度学习(Deep Learning)技术的计算机

    2024年02月06日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包