C++ AnimeGAN实现照片一键动漫化

目录
  • 前言
  • 环境安装
  • C++推理
  • 运行结果

前言

AnimeGAN是来自武汉大学和湖北工业大学的AI项目,是由神经网络风格迁移加生成对抗网络(GAN)而成,它是基于CartoonGAN的改进,并提出了一个更加轻量级的生成器架构。原理和训练代码转GithubPytorch版本。官方的有放出三个试玩的模型,有两个模型是针对人脸的,有一个是卡通效果,可以用来试试别的图像的,熟悉python和pytorch的直接git下来就可以本地部署了,就可以试玩了。

先看看人像的效果

我的demo里面的图像第一张是原图,第二第三张是人像模型,第四张是卡通效果。

风景的效果:

我这里用的是C++,环境是Win10,VS2019,OpenCV4.5,用的推理库是ncnn-20210720, 要用到GPU,所以要下VulkanSDK,GPU 是GTX1650。

环境安装

1.安装Vulkan各它的依赖库。

Vulkan 

版本:VulkanSDK-1.2.141.2

直接点击安装,把之后验证是否安装成功,运行xxx\VulkanSDK\1.2.141.2\Bin\vkcube.exe,出现下面图像代表安装成功。

glfw

https://www.glfw.org/

把glfw-3.3.2.bin.WIN64复制到VulkanSDK\1.2.141.2\Third-Party

GLM

https://github.com/g-truc/glm/

把GLM复制到VulkanSDK\1.2.141.2\Third-Party

添加系统环境变量

3.下载NCNN,可以直接下载对应自己IDE的relese版本的,免得编译麻烦,下载地址

4.下载OpenCV, 4.0以上就可以。

C++推理

1.先从GitHub 下载权重文件。然后按官方给的文档和脚本转成onnx模型。转成onnx之后也可以有用onnxruntime进行推理,我这里又把onnx转ncnn的推理模型,ncnn带有模型转换脚本,直接转就行。

2.把ncnn库,OpenCV,VulkanSDK的lib都加vs的库依赖里,然后加上OpenCV和VulkanSDK的动态库环境变量,就可以开始撸代码了。

3.测试代码:

#include <opencv2/opencv.hpp>
#include <ncnn/gpu.h>
#include <ncnn/net.h>

//模型路径
std::string celeba_model = "models/Celeba.bin";
std::string celeba_param = "models/Celeba.param";
std::string face_v1_model = "models/FacePointV1.bin";
std::string face_v1_param = "models/FacePointV1.param";
std::string face_v2_model = "models/FacePointV2.bin";
std::string face_v2_param = "models/FacePointV2.param";

//读取模型
int readModels(ncnn::Net& ncnn_net, std::string param_path, std::string model_path, bool use_gpu = true);

//推理,target_w,target_h为推理尺寸,越往大的改,细节保留就越多,也越吃GPU算力
int animeInference(const ncnn::Net& ncnn_net, const cv::Mat& cv_src, cv::Mat& cv_dst,int target_w = 512, int target_h = 512)
{
    cv::Mat cv_backup = cv_src.clone();
    const int w = cv_src.cols;
    const int h = cv_src.rows;

    const float mean_vals[3] = { 127.5f, 127.5f,  127.5f };
    const float norm_vals[3] = { 1 / 127.5f, 1 / 127.5f, 1 / 127.5f };
    ncnn::Mat in = ncnn::Mat::from_pixels_resize(cv_backup.data, ncnn::Mat::PIXEL_BGR2RGB, w, h, target_w, target_h);
    in.substract_mean_normalize(mean_vals, norm_vals);
    ncnn::Mat out;

    ncnn::Extractor ex = ncnn_net.create_extractor();

    ex.input("input", in);
    ex.extract("out", out);

    cv::Mat result(out.h, out.w, CV_32FC3);
    for (int i = 0; i < out.c; i++)
    {
        float* out_data = out.channel(i);
        for (int h = 0; h < out.h; h++)
        {
            for (int w = 0; w < out.w; w++)
            {
                result.at<cv::Vec3f>(h, w)[2 - i] = out_data[h * out.h + w];
            }
        }
    }
    cv::Mat result8U(out.h, out.w, CV_8UC3);
    result.convertTo(result8U, CV_8UC3, 255.0/2, 255.0/2);
    result8U.copyTo(cv_dst);
    cv::resize(cv_dst, cv_dst, cv_src.size());
    return 0;
}

//调用,三种风格
int styletransferResult(const cv::Mat& cv_src, std::vector<cv::Mat>& cv_dsts, ncnn::Net& face_v1_net, ncnn::Net& face_v2_net, ncnn::Net& celeba_net)
{
    animeInference(face_v1_net, cv_src, cv_dsts.at(0));
    animeInference(face_v2_net, cv_src, cv_dsts.at(1));
    animeInference(celeba_net, cv_src, cv_dsts.at(2));

}

int main(int argc, char** argv)
{
	//图像路径
    std::string path = "images";
    std::vector<std::string> filenames;
    cv::glob(path, filenames, false);

    ncnn::Net face_v1_net, face_v2_net, celeba_net;

    readModels(face_v1_net, face_v1_param, face_v1_model);
    readModels(face_v2_net, face_v1_param, face_v1_model);
    readModels(celeba_net, celeba_param, celeba_model);

    for(auto v : filenames)
    {

        cv::Mat cv_src = cv::imread(v, 1);

        std::vector<cv::Mat> cv_dsts(3);

        double start = static_cast<double>(cv::getTickCount());
        styletransferResult(cv_src, cv_dsts, face_v1_net, face_v2_net, celeba_net);
        double time = ((double)cv::getTickCount() - start) / cv::getTickFrequency();
        std::cout << "time:" << time << "(s)" << std::endl;

        cv_src.push_back(cv_dsts.at(0));
        cv_dsts.at(1).push_back(cv_dsts.at(2));

        cv::Mat des;
        des.create(cv_src.rows, cv_src.cols*2, cv_src.type());
        cv::Mat r1 = des(cv::Rect(0, 0, cv_src.cols, cv_src.rows));
        cv_src.copyTo(r1);

        cv::Mat r2 = des(cv::Rect(cv_src.cols, 0, cv_src.cols,cv_src.rows));
        cv_dsts.at(1).copyTo(r2);

        imshow("style", des);
        cv::imwrite(std::to_string(j)+".jpg", des);

      // cv::waitKey();
    }
    return 0;
}

int readModels(ncnn::Net& ncnn_net,std::string param_path,std::string model_path, bool use_gpu)
{
    bool has_gpu = false;

#if NCNN_VULKAN
    ncnn::create_gpu_instance();
    has_gpu = ncnn::get_gpu_count() > 0;
#endif

    bool to_use_gpu = has_gpu && use_gpu;
    ncnn_net.opt.use_vulkan_compute = to_use_gpu;

    int rp = ncnn_net.load_param(param_path.c_str());

    int rb = ncnn_net.load_model(model_path.c_str());

    if (rp < 0 || rb < 0)
    {
        return 1;
    }
    return 0;
}

运行结果

5.跑起来很费GPU,如果有好一些的GPU,推理尺寸可以开大一点,细节的保留会更完整些,如果是前两种风格,图像尽量大于512*512,人像人脸特征明显,因为算法是基本于人脸关键点做的。

6.源码和可执行文件以上传到csdn,下载下来,把自己想试的图像放在images目录下,运行.exe文件,就可以在当前的得到最终合并的效果图像。源码下载地址可执行文件地址

 以上就是C++ AnimeGAN实现照片一键动漫化的详细内容,更多关于C++ AnimeGAN照片动漫化的资料请关注我们其它相关文章!

(0)

相关推荐

  • OpenCV图片漫画效果的实现示例

    我们随手拍摄的照片,很难达到摄影师的水准,因此不管是手机上还是电脑内,都有一些软件可以添加特效让照片更好看,手机拍摄时也有即时的美化效果.不过我比较好奇漫画特效,但是一直在网上看到别人的成品而找不到针对性的软件,因此只有自己实现一下,虽然跟专业的还有差距,但效果还不错. 本次使用 OpenCV,采用 Python 实现. 对比现实中的画画,一般是先画出边缘轮廓使整体规划好,再填充颜色使其完整,因此在这里我们也采用这种方式.不过对图片直接操作与从零开始着笔不一样,要将原始图片进行两次不同的处理,再

  • python实现图片转换成素描和漫画格式

    本文实例为大家分享了python实现图片转换成素描和漫画格式的具体代码,供大家参考,具体内容如下 原图 图片转换后的成果 源码 # -*- coding: utf-8 -*- import cv2 from PIL import Image, ImageOps, ImageFilter # 转换成漫画风格 def toCarttonStyle(picturePath): # 设置输入输出路径和文件名称 imgInput_FileName = picturePath imgOutput_FileN

  • OpenCV实现图像转换为漫画效果

    本文实例为大家分享了OpenCV实现图像转换为漫画的具体代码,供大家参考,具体内容如下 From <OpenCV By Example> 1.先canny提取图像的边缘并强化,翻转边缘为黑色,将像素值转换为0-1的值 2.将图像进行双边滤波处理,然后将像素值缩短为每10个灰度级为一个值 3.将前两步得到的结果相乘,显示结果 #include <iostream> using namespace std; #include "opencv2/core.hpp" #

  • C++ AnimeGAN实现照片一键动漫化

    目录 前言 环境安装 C++推理 运行结果 前言 AnimeGAN是来自武汉大学和湖北工业大学的AI项目,是由神经网络风格迁移加生成对抗网络(GAN)而成,它是基于CartoonGAN的改进,并提出了一个更加轻量级的生成器架构.原理和训练代码转Github,Pytorch版本.官方的有放出三个试玩的模型,有两个模型是针对人脸的,有一个是卡通效果,可以用来试试别的图像的,熟悉python和pytorch的直接git下来就可以本地部署了,就可以试玩了. 先看看人像的效果 我的demo里面的图像第一张

  • C++ opencv将图片动漫化介绍

    目录 边缘检测 贴边缘图到原图 双边滤波 HSI空间修改饱和度 后续: 总结 最近对图像处理十分感兴趣,也学着用opencv 实现各种简单的图像处理,因此,有了下面的实验,就是将照片处理成漫画的风格. 对照片进行动漫话一般需要四个步骤1.边缘检测2.将边缘检测得到的边缘 以黑色的形式贴在原来的画上.3.对贴了边缘的图进行双边滤波,双边滤波可以较好的滤波的同时保留边缘.4.修改图像的颜色的饱和度,本文采用的是将RGB转化为HSI空间,然后调整S分量. 边缘检测 对于边缘检测,本文采用的是canny

  • python实现人像动漫化的示例代码

    利用百度api实现人像动漫化 百度API地址:https://ai.baidu.com/tech/imageprocess/selfie_anime 技术文档:https://ai.baidu.com/ai-doc/IMAGEPROCESS/Mk4i6olx5 注册百度账号,开通实现人像动漫化,创建应用. # encoding:utf-8 import requests import base64 # client_id 为官网获取的AK, client_secret 为官网获取的SK host

  • python实战之百度智能云使人像动漫化

    一.目标 之前无意中看到有某位博主写过人像动漫化这样的文章,看着还挺好玩,所以我也想尝试一下. 利用百度智能云中的人工智能,对图片进行处理达到人像动漫化的效果. 二.准备工作 1.百度云智能账号创建 2.图像特效应用 3.开发环境python3.7+pycharm 首先要注册一个百度智能云账号,并创建这个图像特效应用 三.操作流程 3.1 阅读官方文档 当我们要使用一个我们不太了解的东西时,阅读官方文档无疑是最重要的,官方文档一般都写的特别详细,对每一个功能描述的很细节,我们先来看一下 而且这里

  • Unity 百度AI实现人像动漫化效果

    接口介绍: 运用对抗生成网络技术,结合人脸检测.头发分割.人像分割等技术,为用户量身定制千人千面的二次元动漫形象,并支持通过参数设置,生成二次元动漫人像. 创建应用: 在产品服务中搜索图像增强与特效,创建应用,获取AppID.APIKey.SecretKey信息: 查阅官方文档,以下是人像动漫画接口返回数据参数详情: 定义数据结构: using System; /// <summary> /// 人像动漫化接口响应数据结构 /// </summary> [Serializable]

  • Python OpenCV实现人物动漫化效果

    目录 前言 效果展示 代码展示 前言 前几天玩抖音,发现一个人像动漫化的操作,觉得很好玩儿.我心想:python既然这么强大,是不是也可以使用python程序来实现这样一个操作呢? 哈哈!我自己当然是没有这个本事编写这样一个牛逼的程序出来,但是百度可以呀,并且还很好用.百度AI开放平台给我们提供了完整的接口,甚至贴心的将代码都给我们写好了.这些接口还支持很多主流语言都呢,像Java.Python.PHP.C#等,我们做的就是直接调用它即可. 效果怎么样呢?我们先来看看下方的对比图吧. 效果展示

  • 火遍全网的Python二次元特效轻松掌握

    导语 昨天下班,回家吃完饭就直接躺了,无聊的时候大家都会干什么呢? 当然是刷刷刷--抖音啦,嗯哼,然后返现了抖音上一款特效--「变身漫画」,简直好看到不行. 从明星到路人,堪称全民参与,刷了很多类似的视频发现效果竟然这么好看,来看下效果吧~ 登场的是张艺兴和戚薇. 可以看到,这个特效基于人物的面容,很好的转换成了二次元漫画风格. 尤其是眼睛的处理,把张艺兴慵懒的眼神.戚薇水汪汪的大眼睛,诠释的淋漓尽致. 当然发型也都是「满分转换」,分叉.造型等细节可以说是丝毫不差了. 突破「次元壁」的关键技术:

  • 利用 Python 把小伙伴制作成表情包

    目录 一.项目说明 二.实现步骤 三.Python实现 1.导入需要的库 2.绘图函数 3.导入前景照片 4.等比例缩放前景照片 5.对前景照片进行二值化处理 6.提取出感兴趣区域 7.旋转图片 8.将一些不需要的黑色区域删除掉 9.再次提取感兴趣区域并缩放 10.导入背景图片 11.组合两张图片成表情包 12.在表情包下面添加文本 12.1添加英文文本 12.2添加中文文本 13.保存表情包 四.完整代码 一.项目说明 在日常生活中,我们经常会存取一些朋友们的丑照,在这个项目中,我们以萌萌哒的

  • 利用Python实现一键将头像转成动漫风

    目录 PyQt5框架 代码逻辑 最近在Github上面有看到将头像转化成动漫风的项目,但是对于不少没有技术背景的同学来说可能就不知道该怎么使用了,小编今天制作了一个UI界面,大家可以通过一键点击就实现头像照片转化成动漫风格的功能. PyQt5框架 用Python编程语言来制作UI界面的框架有很多哈,大家原则上哪种框架用的顺手就用哪种框架,小编这里使用的是PyQt的框架,因为它支持手动绘制控件,并且可以动态加载,我们在Pycharm当中添加上QtDesigner作为外部工具,来进行界面设置,生成u

  • Asp.net Core Jenkins Docker实现一键化部署的实现

    写在前面 在前段时间尝试过用Jenkins来进行asp.net core 程序在IIS上面的自动部署.大概的流程是Jenkins从git上获取代码 最开始Jenkins是放在Ubuntu的Docker中,但是由于Powershell执行的原因,就把Jenkins搬到了windows上.因为我们网站的部署需要停掉IIS站点,所以需要Powershell来远程操作服务器(上传文件,停止站点,启动站点),也很顺利的利用WinRM+Powershell脚本实现了上面的功能,但是最后在实际使用中发现,脚本

随机推荐