Sirajology的视频链接

前一段时间特别火的 Prisma 大家都玩了么,看了这篇文章后,你也可以自己写一个 Prisma 迷你版了。

这个 idea 最开始起源于 Google Research Blog
Here’s the initial Google DeepDream blog post:

他们用大量的图片数据来训练深度神经网络,使这个网络可以判断出图片中的事物,然后投入一个新的图片,让图片识别,不仅仅是识别,还要把图片修正为网络学到的东西。

然后另一个团队发表了一篇相似的论文

他们用名画来训练模型,然后投入一个生活中的图片,通过强化一些 feature,将这个图片修正为更像名画风格的图片。

原理就是用一个 Convolutional Neural Network 学习一张图片的 style ,然后把另一张图片转换成这种 style。

用到的工具是 python 和 keras 包,文章后面有作者的源码的地址。

引入需要的包

from scipy.misc import imread, imresize, imsave
from scipy.optimize import fmin_l_bfgs_b
from sklearn.preprocessing import normalize
import numpy as np
import time
import os
import argparse
import h5pyfrom keras.models import Sequential
from keras.layers.convolutional import Convolution2D, ZeroPadding2D, AveragePooling2D
from keras import backend as K

定义三个图片变量

#Define base image, style image, and result image paths
args = parser.parse_args()
base_image_path = args.base_image_path
style_reference_image_path = args.style_reference_image_path
result_prefix = args.result_prefix

引用事先计算好的 weights vgg16

这是提前训练好的,可以识别生活中的图片,以它作为模型的起点。

#Get the weights file
weights_path = r"vgg16_weights.h5"

定义 booleans 决定是否 reshape 图片

#Init bools to decide whether or not to resize
rescale_image = strToBool(args.rescale_image)
maintain_aspect_ratio = strToBool(args.maintain_aspect_ratio)

然后初始化 style-content weights

什么是style-content weights?

在神经网络学习的过程中,不同的层学到的东西是不一样的,例如识别一个小狗,一层学到的是 edge,下一层学到的是 shape,再下一层是更复杂的 shape,最后学到的是整个的 dog。

在学习艺术风格的网络中发现,低层次学到的是 style,如纹理 颜色框架等,高层次学到的是 content,如太阳等具体的物体,CNN会把 content 和 style 分离开,所以要达到不同的效果,需要不同的权重分配。

# Init variables for style and content weights.
total_variation_weight = args.tv_weight
style_weight = args.style_weight * args.style_scale
content_weight = args.content_weight

然后设定图片维度,定义tensor代表三个图片 base image,style image,output image。

# Init dimensions of the generated picture.
img_width = img_height = args.img_size
assert img_height == img_width, 'Due to the use of the Gram matrix, width and height must match.'
img_WIDTH = img_HEIGHT = 0
aspect_ratio = 0# get tensor representations of our images
base_image = K.variable(preprocess_image(base_image_path, True))
style_reference_image = K.variable(preprocess_image(style_reference_image_path))# this will contain our generated image
combination_image = K.placeholder((1, 3, img_width, img_height))

再组合到一个 tensor 中

# combine the 3 images into a single Keras tensor
input_tensor = K.concatenate([base_image,style_reference_image,combination_image], axis=0)

放在一个 tensor 中,因为更容易被 神经网络 解析,这样一个高维的图片也可以有可以计算的复杂度。

建立 31 层的神经网络

# build the VGG16 network with our 3 images as input
first_layer = ZeroPadding2D((1, 1))
first_layer.set_input(input_tensor, shape=(3, 3, img_width, img_height))model = Sequential()
model.add(first_layer)
model.add(Convolution2D(64, 3, 3, activation='relu', name='conv1_1'))
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(64, 3, 3, activation='relu'))
model.add(AveragePooling2D((2, 2), strides=(2, 2)))。。。

一共有3种:
convolution2D layer:拥有可学习的filters,这些filters有receptive field,用来将神经元连接到下一层的一个局部的区域,而不是连接到每一个神经元

ZeroPadding layer:用来控制 output 的大小

Pooling layer:只用图片的子集来计算,减少参数数量,用来避免 overfitting。

激活函数用的是 ReLU,比sigmoid更快一些。

各个层的参数分别是:

定义完模型后,引入 vgg16 的权重

# load the weights of the VGG16 networks
load_weights(weights_path, model)

定义 Loss Function:计算预测和实际的差别

# get the symbolic outputs of each "key" layer (we gave them unique names).
outputs_dict = dict([(layer.name, layer.output) for layer in model.layers])# get the loss (we combine style, content, and total variation loss into a single scalar)
loss = get_total_loss(outputs_dict)

得到 gradients

# get the gradients of the generated image wrt the loss
grads = K.gradients(loss, combination_image)

最后用 back propagation 训练模型,此处用到的算法是 limit-memory BFGS,可以最小化 loss function 而且空间效率较高。

#combine loss and gradient
f_outputs = combine_loss_and_gradient(loss, grads)# Run scipy-based optimization (L-BFGS) over the pixels of the generated image to minimize the neural style loss
# 5 Step process
x, num_iter = prepare_image()
for i in range(num_iter):#Step 1 - Record iterationsprint('Start of iteration', (i+1))start_time = time.time()#Step 2 - Perform l_bfgs optimization function using loss and gradientx, min_val, info = fmin_l_bfgs_b(evaluator.loss, x.flatten(),fprime=evaluator.grads, maxfun=20)print('Current loss value:', min_val)#Step 3 - Get the generated imageimg = deprocess_image(x.reshape((3, img_width, img_height)))#Step 4 - Maintain aspect ratioif (maintain_aspect_ratio) & (not rescale_image):img_ht = int(img_width * aspect_ratio)print("Rescaling Image to (%d, %d)" % (img_width, img_ht))img = imresize(img, (img_width, img_ht), interp=args.rescale_method)if rescale_image:print("Rescaling Image to (%d, %d)" % (img_WIDTH, img_HEIGHT))img = imresize(img, (img_WIDTH, img_HEIGHT), interp=args.rescale_method)

最后,rescale 并且保存图片

    #Step 5 - Save the generated imagefname = result_prefix + '_at_iteration_%d.png' % (i+1)imsave(fname, img)end_time = time.time()print('Image saved as', fname)print('Iteration %d completed in %ds' % (i+1, end_time - start_time))

这个算法也可以用到视频中。

另外还找到一篇《我是如何用TensorFlow 做出属于自己的Prisma的?》

感兴趣就动手写一下吧。

The code for this video is here:
Here’s the initial Google DeepDream blog post:
A Deepdream web app:
The Neural Style Paper:


推荐阅读
历史技术博文链接汇总
也许可以找到你想要的

自己写个 Prisma相关推荐

  1. 自己写一个PRISMA 让两张图片融合起来

    原文:http://blog.askfermi.me/2016/09/27/diy-prisma/ 大约2个月前的一天,一款叫做PRISMA的应用突然刷爆了朋友圈,后来还出现了叫做Ostagram之类 ...

  2. 机器学习、人工智能 博文链接汇总

    [入门问题]  [TensorFlow]  [深度学习]  [好玩儿的算法应用实例]  [聊天机器人]  [神经网络]  [机器学习]  [机器学习算法应用实例]  [自然语言处理]  [数据科学]  ...

  3. js node 打包mac应用_混搭 TypeScript + GraphQL + DI + Decorator 风格写 Node.js 应用

    阅读本文的知识前提:熟悉 TypeScript + GraphQL + Node.js + Decorator + Dependency Inject 等概念.前言 恰逢最近需要编写一个简单的后端 N ...

  4. 寻找下一款Prisma APP:深度学习在图像处理中的应用探讨

    在9月23日到9月24日的MDCC 2016年中国移动者开发大会"人工智能与机器人"专场中,阿里云技术专家周昌进行了题为<寻找下一款Prisma APP:深度学习在图像处理中 ...

  5. 写在2021: 值得关注/学习的前端框架和工具库

    前言 最近在知乎看到了这么个问题:学完Vue还有必要学习React和Node吗?[1], 有很奇妙的感觉,因为我在最开始入门前端时,也是以Vue入的门,在"学完"Vue之后, 我也 ...

  6. AI绘画与虚拟人生成实践(二):智能不智障!用chatgpt自动写爆款内容

    书接上回,本篇的目的是结合上篇生成的虚拟的女生形象,给它配上一段关于介绍AI绘画领域的脚本,下一篇会让生成的虚拟形象来念这段文案.先进入正题说明怎么使用chatgpt来生成想要的文案. 本文中使用的是 ...

  7. 精读《Prisma 的使用》

    ORM(Object relational mappers) 的含义是,将数据模型与 Object 建立强力的映射关系,这样我们对数据的增删改查可以转换为操作 Object(对象). Prisma 是 ...

  8. TypeORM vs Prisma

    TypeORM 开发环境:可以打开同步功能,entity文件的更改会自动同步到数据库中. https://typeorm.io/#/using-ormconfig/using-environment- ...

  9. 使用hello word写小说

    2021-11-12 使用hello word写小说

最新文章

  1. matlab实现将一个文件夹里面的pcm文件依次合并成一个信号的函数
  2. 切换控制器的三种手段push modal 切换window的rootViewController
  3. POJ 2513 Colored Sticks
  4. 如果你是IT技术人员,请思考这15个问题
  5. 算法- 分治算法(实现汉诺塔)
  6. JavaScript中的数学对象Math
  7. python 打开pdf文件_Python3检验pdf文件是否有效
  8. linux c语言 电子相册,纯C语言开发(电子相册).doc
  9. ORA-01747: user.table.column, table.column 或列说明无效
  10. LoadRunner 详细使用教程
  11. ios python3.0编程软件_ios编程软件-7款学习Python编程的iPhone/iPad应用
  12. 计算机 模板 样式 母版,电脑PPT软件的母版怎么设置
  13. 用SQL表达并交差操作
  14. Laravel将Word文档转化为pdf文件
  15. 弘辽电商专题三:打赢店铺翻身仗,提升淘宝权重很重
  16. 层次低的人复杂,境界高的人简单,总结得真深刻!
  17. 2022年全球市场旋转压片机总体规模、主要生产商、主要地区、产品和应用细分研究报告
  18. IDEA/GoLand 添加自定义特殊注释【注释高亮】
  19. linux批量修改文件时间
  20. 卸载k8s和docker

热门文章

  1. 倾听您的游戏面板说话
  2. SuperMap iObject常见问题解答集锦(五)
  3. 一个用于ocr中文本检测的数据集生成工具
  4. (1/7)Electron教程(一)什么是 Electron,由来、适用场景 和 Electron 的环境搭建(1/7)
  5. 云计算职业技能大赛组件介绍(一)
  6. mac OS 软件下载地址 (不断更新)
  7. 【Barracuda】后处理使用plot manager画线图的方法总结(包括残差,探针,通过某个面的组分质量流量等)(持续更新)
  8. 大数据驱动社会治理的创新转向
  9. 润乾服务器的授权文件,V4.0系列软件如何替换授权文件
  10. python生日快乐歌_用Micro:bit播放生日快乐歌