你想要一份“搞怪”型画风的照片么?看这里,风格迁移帮你搞定!

简介: 你想要一份“搞怪”型画风的照片么?看这里,风格迁移帮你搞定!

项目需求


  趁着双休,有属于自己的时间了,赶紧给自己做几张“搞怪”画风照片(本文后面会附上照片),现在需求如下:


  1. 输入自己的照片;


  1. 通过某种手段可以获得到比较搞怪画风的照片;


  1. 这种手段具备一定的泛化能力。


注意事项: 本文着重于实践操作,不过讲解源理,望见晾!



需求分析


  上述需求不禁让我想起了初学GAN时候的风格迁移网络,该类型的网络可以正好满足上述需求,于是自己在网上搜刮下来了一些训练好的权重给自己使用。(双休在家,无GPU训练)



  实践步骤逻辑:


  1. CV读取图像;


  1. 读取网络Net;


  1. 调整图像的尺寸和格式;


  1. 计算网络对原图像处理的结果;


  1. 输出结果的尺寸和通道数;


  1. 将输出结果存放到图像中去;


  1. 获取原图像的通道数及均值;


  1. 恢复图像剔除掉的均值;


  1. 对输出图像进行归一化;


  1. 显示结果搞怪图




实践调试


  在电脑里面找到了自己以前做人脸检测的样图,现在正好可以拿来使用以下: 在centos7中运行如下代码,创建CMakeLists.txt 进行cmake和make即可获取下面的图像。


#include <opencv2/opencv.hpp>
#include <iostream>
#include<vector>
#include<string>
using namespace cv;
using namespace cv::dnn;
using namespace std;
int main()
{
  Mat image = imread("/home/kiven/Demo/Imgs/lena.png");
  String models[5] = { "Net1.t7","Net2.t7","Net3.t7","Net4.t7","Net5.t7" };
  for (int i = 0; i < 5; i++)
  {
    Net net = readNet(models[i]);
    Scalar imgaeMean = mean(image);
    Mat blobImage = blobFromImage(image, 1.0, Size(256, 256), imgaeMean, false, false);
    net.setInput(blobImage);
    Mat output = net.forward();
    int outputChannels = output.size[1];
    int outputRows = output.size[2];
    int outputCols = output.size[3];
    Mat result = Mat::zeros(Size(outputCols, outputRows), CV_32FC3);
    float* data = output.ptr<float>();
    for (int channel = 0; channel < outputChannels; channel++)
    {
      for (int row = 0; row < outputRows; row++)
      {
        for (int col = 0; col < outputCols; col++)
        {
          result.at<Vec3f>(row, col)[channel] = *data++;
        }
      }
    }
    result = result + imgaeMean;
    result = result / 255.0;
    resize(result, result, image.size());
    //显示结果
    string OutImgName = format("/home/kiven/Demo/SaveImgs/%d.jpg", i); 
    imwrite(OutImgName, result);
  }
  return 0;
}
复制代码


image.png

相关文章
|
存储 数据可视化 安全
一张图的七十二变——阿里云OSS图片处理实践
      小张是某视频网站的新入职的UED,日常工作就是创作各式各样的海报banner。踌躇满志的小张,上了三天班就蔫了。因为他在完成一张图的创作后,还需要考虑:• 同一张图会以不同的形式应用于网站各处:有时候需裁剪成不同形状,有时需要加水印,有时需转换格式....• 为了风格统一,不同的图需要保持样式统一:不同图片排列组成成一组,每组图片风格(
2793 0
|
12月前
|
人工智能 缓存 并行计算
【AI系统】CPU 计算本质
本文深入探讨了CPU计算性能,分析了算力敏感度及技术趋势对CPU性能的影响。文章通过具体数据和实例,解释了算力计算方法、数据加载与计算的平衡点,以及如何通过算力敏感度分析优化性能瓶颈。同时,文章还讨论了服务器、GPU和超级计算机等不同计算平台的性能发展趋势,强调了优化数据传输速率和加载策略的重要性。
553 4
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
安全 中间件 数据安全/隐私保护
一文带你掌握nestjs的Guard(守卫)
一文带你掌握nestjs的Guard(守卫)
一文带你掌握nestjs的Guard(守卫)
|
Kubernetes 负载均衡 监控
一文读懂 Kubernetes Ingress Controller 选型实践
Hello folks,众所周知,Ingress 对于任何成功的 Kubernetes 集群部署拓扑架构都至关重要,尤其是在自建的容器云平台。 Ingress 允许我们在实际的业务场景中能够基于当前的网络环境定义外部(或内部)流量以及其如何路由至集群内的服务。
735 0
|
存储 弹性计算 安全
阿里云服务器ECS介绍_云主机_服务器托管_弹性计算
阿里云服务器(Elastic Compute Service, 简称ECS)是一种处理能力可弹性伸缩的云计算服务器,云服务器可以帮助构建更加安全稳定的应用,让您更专注于核心业务创新。云服务器可以助力降低开发运维投入和整体的IT成本,并支持包年包月、按量付费等模式,方便更好的财务管理
2704 0
阿里云服务器ECS介绍_云主机_服务器托管_弹性计算
|
安全
PROMETRIC
ROMETRIC是一家提供在线考试服务的公司,许多认证考试都使用PROMETRIC的平台进行在线考试。如果您要参加一项PROMETRIC考试,
314 0
|
存储 缓存 算法
带你读《存储漫谈Ceph原理与实践》第三章接入层3.1块存储 RBD(四)
带你读《存储漫谈Ceph原理与实践》第三章接入层3.1块存储 RBD
带你读《存储漫谈Ceph原理与实践》第三章接入层3.1块存储 RBD(四)