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. 效果图

官方效果图如下:

在这里插入图片描述
效果图1如下:
在这里插入图片描述
效果图2如下:

在这里插入图片描述
效果图3如下:

在这里插入图片描述

2. 原理

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

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

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

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

3. 源码

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

在这里插入图片描述

# 使用预训练的模型生成漫画头像
# 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)

参考

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 作为一个人工智能语言模型,我可以告诉你如何使用Python编写一个类似于我这样的人工智能系统。 首先,你需要选择一个适合你的Python机器学习框架,比如TensorFlow或PyTorch。这些框架可以帮助你训练神经网络和构建人工智能系统。 接下来,你需要决定你的人工智能系统要解决什么问题,比如自然语言处理、图像识别或机器翻译等。然后,你需要收集和准备用于训练的数据集。 接着,你可以根据你选择的框架和问题类型设计你的神经网络模型。你需要选择适当的网络架构和层类型,并为它们配置参数。 一旦你的模型构建好了,你就可以使用训练数据集来训练它。你需要为模型选择适当的损失函数和优化器,并设置训练超参数。然后,你可以使用训练数据集对模型进行训练,并使用验证数据集来评估模型的性能。 最后,当你的模型训练好后,你可以将其部署到生产环境中,让用户可以与你的人工智能系统进行交互。 需要注意的是,这只是人工智能系统开发的基本步骤。实际上,人工智能的开发需要深入的专业知识和经验,因此在开始这个项目之前,你可能需要进行更深入的学习和研究。 ### 回答2: 要使用Python编写一个类似于我这样的人工智能,可以考虑以下步骤: 1. 学习基本的Python语法和编程概念,了解面向对象编程(OOP)的概念。 2. 构建一个类作为人工智能的基础,例如创建一个名为"AI"的类。 3. 在"AI"类中定义必要的属性和方法。属性可以包括人工智能的名称、年龄、性别等信息,而方法可以包括回答问题、处理语音/图像数据等功能。 4. 在AI类的初始化方法中,可以设置一些默认的属性值,如名称为"人工智能",年龄为"未知"等。 5. 实现一个方法,例如"回答问题",接受用户输入的问题,并返回相应的答案。这可以通过使用自然语言处理(NLP)技术和机器学习算法来实现。 6. 可以使用第三方库如NLTK、Spacy等来进行自然语言处理,分词、词性标注、实体识别等操作。 7. 对于图像/视觉方面的处理,可以使用OpenCV、PIL等库来进行图像的读取、处理和识别等。 8. 在AI类中实现其他功能,如语音合成或语音识别。可以使用第三方库如PyTTSx、SpeechRecognition等。 9. 在主程序中创建一个AI对象,并调用其方法进行交互,例如接收用户问题并打印出答案。 10. 可以根据需求进一步扩展人工智能的功能,如增加自我学习的能力,与其他外部系统进行交互,等等。 总之,编写一个类似于我这样的人工智能需要基本的Python编程知识,以及对各种人工智能相关技术和第三方库的学习和应用。这只是一个初步的指导,实际的实现过程会更加复杂和细致。 ### 回答3: 要使用Python编写一个类似于我的这样的人工智能,可以使用以下步骤: 1. 确定功能:首先,确定您希望此人工智能具备哪些功能。例如,能够回答问题、进行自然语言处理、进行机器学习等。 2. 学习Python基础知识:学习Python编程语言的基础知识,掌握语法、数据类型和操作等。这将帮助您理解和编写代码。 3. 导入相关库:Python拥有许多用于人工智能开发的库和框架。例如,可以使用NLTK或SpaCy进行自然语言处理,使用TensorFlow或PyTorch进行机器学习和深度学习等。 4. 设计类结构:定义一个类来表示您的人工智能。可以考虑将其定义为一个聊天机器人类,其中包含与用户交互的方法、处理输入的方法以及回答问题的方法。 5. 编写代码:根据类的设计,在Python中编写代码来实现类的功能。例如,使用条件语句和循环来处理用户输入,并根据输入提供相应的回答。 6. 调试和测试:在编写代码过程中,不断进行调试和测试以确保人工智能工作正常。可以模拟用户输入并观察输出结果,以发现潜在的错误并加以修正。 7. 添加扩展功能:如果希望人工智能具备更多功能,可以进一步扩展代码。例如,可以集成图像处理库以实现对图像的分析和识别。 8. 改进性能:优化代码以提高人工智能的性能和效率。可以使用技术如并行化、异步编程来改善响应速度等。 9. 持续学习:随着技术的发展,持续学习和探索新的人工智能算法和技术。参与开源社区、参加相关会议和研讨会等,保持对最新技术动态的了解。 总而言之,要编写一个类似于我的这样的人工智能,关键是确定功能、学习Python基础知识、使用相关库和框架、设计类结构、编写代码、调试和测试、添加扩展功能、改进性能以及持续学习和更新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序媛一枚~

您的鼓励是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值