亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++?AnimeGAN實(shí)現(xiàn)照片一鍵動(dòng)漫化

 更新時(shí)間:2021年11月26日 10:29:04   作者:知來者逆  
AnimeGAN是是由神經(jīng)網(wǎng)絡(luò)風(fēng)格遷移加生成對(duì)抗網(wǎng)絡(luò)(GAN)而成,它是基于CartoonGAN的改進(jìn),并提出了一個(gè)更加輕量級(jí)的生成器架構(gòu)。本文將介紹如何運(yùn)用AnimeGAN實(shí)現(xiàn)照片一鍵動(dòng)漫化,需要的可以參考一下

前言

AnimeGAN是來自武漢大學(xué)和湖北工業(yè)大學(xué)的AI項(xiàng)目,是由神經(jīng)網(wǎng)絡(luò)風(fēng)格遷移加生成對(duì)抗網(wǎng)絡(luò)(GAN)而成,它是基于CartoonGAN的改進(jìn),并提出了一個(gè)更加輕量級(jí)的生成器架構(gòu)。原理和訓(xùn)練代碼轉(zhuǎn)Github,Pytorch版本。官方的有放出三個(gè)試玩的模型,有兩個(gè)模型是針對(duì)人臉的,有一個(gè)是卡通效果,可以用來試試別的圖像的,熟悉python和pytorch的直接git下來就可以本地部署了,就可以試玩了。

先看看人像的效果

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

風(fēng)景的效果:

我這里用的是C++,環(huán)境是Win10,VS2019,OpenCV4.5,用的推理庫(kù)是ncnn-20210720, 要用到GPU,所以要下VulkanSDK,GPU 是GTX1650。

環(huán)境安裝

1.安裝Vulkan各它的依賴庫(kù)。

Vulkan?

版本:VulkanSDK-1.2.141.2

直接點(diǎn)擊安裝,把之后驗(yàn)證是否安裝成功,運(yùn)行xxx\VulkanSDK\1.2.141.2\Bin\vkcube.exe,出現(xiàn)下面圖像代表安裝成功。

glfw

https://www.glfw.org/

把glfw-3.3.2.bin.WIN64復(fù)制到VulkanSDK\1.2.141.2\Third-Party

GLM

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

把GLM復(fù)制到VulkanSDK\1.2.141.2\Third-Party

添加系統(tǒng)環(huán)境變量

3.下載NCNN,可以直接下載對(duì)應(yīng)自己IDE的relese版本的,免得編譯麻煩,下載地址

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

C++推理

1.先從 GitHub 下載權(quán)重文件。然后按官方給的文檔和腳本轉(zhuǎn)成onnx模型。轉(zhuǎn)成onnx之后也可以有用onnxruntime進(jìn)行推理,我這里又把onnx轉(zhuǎn)ncnn的推理模型,ncnn帶有模型轉(zhuǎn)換腳本,直接轉(zhuǎn)就行。

2.把ncnn庫(kù),OpenCV,VulkanSDK的lib都加vs的庫(kù)依賴?yán)?,然后加上OpenCV和VulkanSDK的動(dòng)態(tài)庫(kù)環(huán)境變量,就可以開始擼代碼了。

3.測(cè)試代碼:

#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為推理尺寸,越往大的改,細(xì)節(jié)保留就越多,也越吃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;
}

//調(diào)用,三種風(fēng)格
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;
}

運(yùn)行結(jié)果

5.跑起來很費(fèi)GPU,如果有好一些的GPU,推理尺寸可以開大一點(diǎn),細(xì)節(jié)的保留會(huì)更完整些,如果是前兩種風(fēng)格,圖像盡量大于512*512,人像人臉特征明顯,因?yàn)樗惴ㄊ腔居谌四橁P(guān)鍵點(diǎn)做的。

6.源碼和可執(zhí)行文件以上傳到csdn,下載下來,把自己想試的圖像放在images目錄下,運(yùn)行.exe文件,就可以在當(dāng)前的得到最終合并的效果圖像。源碼下載地址可執(zhí)行文件地址

?以上就是C++ AnimeGAN實(shí)現(xiàn)照片一鍵動(dòng)漫化的詳細(xì)內(nèi)容,更多關(guān)于C++ AnimeGAN照片動(dòng)漫化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言版猜數(shù)字小游戲

    C語言版猜數(shù)字小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言版猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++ Eigen庫(kù)計(jì)算矩陣特征值及特征向量

    C++ Eigen庫(kù)計(jì)算矩陣特征值及特征向量

    這篇文章主要為大家詳細(xì)介紹了C++ Eigen庫(kù)計(jì)算矩陣特征值及特征向量,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • C語言、C++中的union用法總結(jié)

    C語言、C++中的union用法總結(jié)

    這篇文章主要介紹了C語言、C++中的union用法總結(jié),本文講解了什么是union、C中使用union、當(dāng)union遇到對(duì)象等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • C語言實(shí)現(xiàn)圖書管理系統(tǒng)

    C語言實(shí)現(xiàn)圖書管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C語言三子棋小游戲的實(shí)現(xiàn)

    C語言三子棋小游戲的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了C語言三子棋小游戲的實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++類中的static和const用法實(shí)例教程

    C++類中的static和const用法實(shí)例教程

    這篇文章主要介紹了C++類中的static和const用法,是C++面向?qū)ο蟪绦蛟O(shè)計(jì)中非常重要的概念,需要的朋友可以參考下
    2014-08-08
  • c++中為什么可以通過指針或引用實(shí)現(xiàn)多態(tài)詳解

    c++中為什么可以通過指針或引用實(shí)現(xiàn)多態(tài)詳解

    這篇文章主要給大家介紹了關(guān)于c++中為何可以通過指針或引用實(shí)現(xiàn)多態(tài),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 從匯編看c++中變量類型的深入分析

    從匯編看c++中變量類型的深入分析

    本篇文章是對(duì)c++中的變量類型進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • C語言簡(jiǎn)單實(shí)現(xiàn)門禁系統(tǒng)

    C語言簡(jiǎn)單實(shí)現(xiàn)門禁系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言簡(jiǎn)單實(shí)現(xiàn)門禁系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C語言實(shí)現(xiàn)括號(hào)匹配的方法

    C語言實(shí)現(xiàn)括號(hào)匹配的方法

    這篇文章主要介紹了C語言實(shí)現(xiàn)括號(hào)匹配的方法,文中代碼簡(jiǎn)單易懂,方便大家更好的學(xué)習(xí),感興趣的朋友可以參考下
    2020-06-06

最新評(píng)論