迁移学习︱艺术风格转化:Artistic style-transfer+ubuntu14.0+caffe(only CPU)
说起来这门技术大多是秀的成分高于实际,但是呢,其也可以作为图像增强的工具,看到一些比赛拿他作训练集扩充,还是一个比较好的思路。如何在caffe上面实现简单的风格转化呢?
好像网上的博文都没有说清楚,而且笔者也没有GPU机器,于是乎,走上了漫漫的研究逼死自己之路...
作者实践机器配置:
服务器:ubuntu16.04(8 core)+caffe+only CPU
突然觉得楷体是不是好看多了...哈哈,接下来的博客要改字体喽~
——————————————————————————————
一、图像风格迁移:image style transfer
本节内容来源于CDA深度学习课程,由唐宇迪老师所述,主要参考论文:《Image Style Transfer Using Convolutional Neural Networks》(下载链接)
训练模型要准备四样内容:
1、训练好的模型+参数,官方参考的是VGG16 VGG19、caffenet、googlenet四类,官方准备好下载链接;
2、一张style风格图,用来做模仿;
3、一张content内容图,即可。
4、一张底图N,用来准备改写图,一般都是拿content内容图来做,caffe里面默认也是拿内容图来作为底图。
来看到论文里面的内容,以及训练好一些图像模型,保持权重不变。怎么训练?
把style和content图都过卷积层(如上图),然后输出,不计算权重的loss,而是计算图片的loss。
保持权重不变了,那么训练的时候loss是什么?
算法使用随机的一个白噪声图(white noise image)作为输入,定义与内容图的content loss和风格图的`style loss’,之后使用标准的BP算法更新weight,调整输入的图像(白噪声图)
注意这里是调整输入的图,目的就是对于某个特定的输入图像x,其loss(包含content loss和style losss)达到最小
(参考博客:Image Style Transfer Using Convolutional Neural Network(理论篇))
那么现在loss改变为
loss=α(底图-风格图)+(1-α)(底图-内容图)=α(N-style)+(1-α)(N-content)
其中的参数α可以理解为转化比率,就是一张图可以长得多像风格图,默认为1e4。
这样就可以把两张图融合在一起,成为一张带有风格特点的图像。
——————————————————————————————
二、caffe实现(单CPU)
本文不累述caffe+单CPU如何实现安装,都是在caffe可以使用的前提下进行后续。不明白可参考另外caffe+单CPU安装教程:caffe+CPU︱虚拟机+Ubuntu16.04+CPU+caffe安装笔记
1、实现前提
pycaffe是否可以使用?
答:来到caffe文件夹下的Python文件夹(./caffe/python),打开python 然后:import caffe
有报错:
如果是“no module caffe”的报错,修改一下环境变量:
- export PYTHONPATH=/caffe/python:$PYTHONPATH
如果其他报错,那你得再看看caffe安装哪一步出错了。
2、style-transfer实现步骤
(1)github下载,style-transfer相关代码,下载链接;
(2)pycaffe环境布置,因为github上的代码是基于pycaffe的,所以需要配置python progressbar,
- pip install progressbar
(3)下载训练好模型,放在对的地方:
方法一:官方有下载链接,执行在\scripts 下的download_models.sh 就会出现下载
方法二:上面方法下载不了,可以直接用他们的链接下载:
googlenet:http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel caffenet:http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel vgg16:http://www.robots.ox.ac.uk/~vgg/software/very_deep/caffe/VGG_ILSVRC_16_layers.caffemodel vgg19:http://www.robots.ox.ac.uk/~vgg/software/very_deep/caffe/VGG_ILSVRC_19_layers.caffemodel
都挺大的,VGG16就有500+MB,下载好了,还不行,还要注意,放在对的文件夹下:./model/vgg16
那么一个可以使用的训练好的模型文件夹有三样东西:ilsvrc_2012_mean.npy、VGG_ILSVRC_16_layers.caffemodel、VGG_ILSVRC_16_layers_deploy.prototxt
(4)运行模型
- python style.py -s <style_image> -c <content_image> -m <model_name> -g 0
要对应在style-transfer文件夹然后才执行上述代码才可以哟,才使用上述内容。
主要必须有的参数解析:
-s,风格图位置;
-c,内容图位置;
-m,模型位置;
-g,什么模式,-1为CPU,0为单个GPU,1为两个GPU。
其他默认或不必须参数:
parser.add_argument("-r", "--ratio", default="1e4", type=str, required=False, help="style-to-content ratio")
非必要,转化比率,有默认值,1e4,10^-4,0.00001
parser.add_argument("-n", "--num-iters", default=512, type=int, required=False, help="L-BFGS iterations")
非必要,有默认值,多少次会输出一次结果
3、风格/内容的比率ratio对结果的影响
比值越小合成的图风格化越明显(参考:Image Style Transfer Using Convolutional Neural Network(理论篇))
4、初始化方法对结果的影响(以风格图作为底图还是随机产生底图)
作者表示,扔入不同的底图方案都不会十分影响最后的结果。但是区别在于,如果你想一次性输出很多张图片的话,那么你就需要设置初始化为白噪声图,如果你一开始选择的就是内容图作为底图,那么这么多张图片都会长得一样,不具有其他分布了。
——————————————————————————————
三、网络上的案例
来自于网上:基于caffe的艺术迁移学习 style-transfer-windows+caffe
下面是运行代码的格式: python style.py -s <style_image> -c <content_image> -m <model_name> -g 0
在windows下 切换到style.py 所在的目录,输入代码如下
python style.py -s images/style/starry_night.jpg -c images/content/nanjing.jpg -m vgg19 -g 0
可见上面例子中,style-image对应starry_night.jpg 即风格图像, content_image对应自己的照片nanjing.jpg, 模型选择vgg19, g 0对应选择默认的GPU,如果是g -1则为CPU
然后回车就能运行,得到上述结果了。 下面是运行的示意图:
可以看到,选择GPU、然后加载图像和模型成功后就开始跑了,左侧是显示运行进度,已经是6%,还需要54分钟左右,由于图像比较大,时间比较长。
网络上有人在titanX上合成图片,(参考:Image Style Transfer Using Convolutional Neural Network(理论篇))
一张140*480的图,迭代300次,在titan x上用时30s左右
——————————————————————————————
四、优化以及报错问题探究
1、报错一:
- 报错:WARNING: Logging before InitGoogleLogging() is written to STDERR
- F1226 22:43:57.664203 10578 common.cpp:66] Cannot use GPU in CPU-only Caffe: check mode.
是因为你写代码的时候写错了,因为我的是CPU环境,所以要-g -1,我当时写成-g 0了(GPU环境),于是就报错了。
2、报错二:显示不了进度条:Optimizing: 0% | | ETA: --:--:--
CPU太慢了,要等他一会,才能有时间估计...
3、优化一:为啥输出的图片都是512的呢?
系统默认的,你风格图+内容图是什么尺寸,输出的图片都是512.当然你可以修改参数来获得更大的尺寸。参考:基于caffe的艺术迁移学习 style-transfer-windows+caffe
更改style.py的一些内容:
parser.add_argument("-l", "--length", default=1024, type=float, required=False, help="maximum image length") def transfer_style(self, img_style, img_content, length=1024, ratio=1e5, n_iter=512, init="-1", verbose=False, callback=None)
可以设置图像输出的尺寸大小,例如你自己的照片图像大小是1024*500 ,更改输出length=1024,可以获得与原始图像一致的尺寸。
不更改的话,程序中默认输出是512宽度,和输入原始图像一致的宽长比。
——————————————————————————————
五、caffe在CPU环境下如何优化效率?
CPU运行caffe简直就是闹着玩一样...超级慢,自己的游戏笔记本,i7-6700HQ,单核合成一张图要25h... 要人命...
1、优化办法一:多核CPU
执行多CPU核操作,那么如何让caffe可以适应多个CPU一起用呢?笔者在网络上看了很多博文,基本在caffe配置中,就得进行修改。
来到caffe文件夹,make clean之后,可以用多线程加速(需要sudo?):
- make all -j4
- make test -j4
- make runtest -j4
(PS,网上也有说单独在make all后面加-j4就可以了,笔者也不知道这块内容是不是这样)
(PS,而且好像-j4,利用4核是最优的方案,核心数用多了反而不好,会出现错误或者速度变慢,why??)
执行如下命令编译 pycaffe:
- make pycaffe -j4
之后,再执行就ok了。但是呢,笔者在实践的过程中发现好像-j4之后,都make了,还是使用的是单核运算? 不知道有看客大牛可以留下你们的经验不..
当然,在make pycaffe之后,还有网友有再执行make distribute的,不知道有没有用(深度学习工具caffe详细安装指南)
1、深度学习框架Caffe的编译安装
3、开源深度学习框架Caffe在Ubuntu14.04下的搭建
2、优化办法二:caffe使用工具开启多线程:openblas-openmp(多线程版本)
Caffe用到的Blas可以选择Altas,OpenBlas,Intel MKL,Blas承担了大量了数学工作,所以在Caffe中Blas对性能的影响很大。 MKL要收费,Altas略显慢(在我的电脑上运行Caffe自带的example/mnist/lenet_solver.prototxt,大概需要45分钟。。。)
根据网上资料的介绍使用OpenBlas要快一些,于是尝试安装使用OpenBlas来加速训练过程。
用OpenBlas时,OPENBLAS_NUM_THREADS设置为最大,让CPU负载跑满,并不能大幅提高速度,这是为什么?一直没搞明白。
3、优化办法三——修改迭代次数
修改迭代次数。作者也说特别是CPU版本的caffe,减少迭代次数,是一个非常好的办法,因为cpu太慢了。。
作者分别尝试了 50, 100, 200, 400, and 800这样5中的迭代次数。
内容图和风格图是:
之后的效果是:
感觉50的已经差不多了,迭代越多,也就是背景纹理在改变。
——————————————————————————————
六、哪种训练模型比较好?
效率优化方面,因为不同的模型参数不一样,所以喽,你可以down一些比较小的模型也可以加速,不过其实不明显,还不如修改迭代次数来着更简单粗暴。
从外观来看,VGG模型效果比较好。caffeNet太丑,就没放,但是caffeNet是最快的(作者也是任性...)
googleNet比AlexNet参数少,网络还深,当然效果看起来,学得没VGG好。
迁移学习︱艺术风格转化:Artistic style-transfer+ubuntu14.0+caffe(only CPU)的更多相关文章
- 【迁移学习】2010-A Survey on Transfer Learning
资源:http://www.cse.ust.hk/TL/ 简介: 一个例子: 关于照片的情感分析. 源:比如你之前已经搜集了大量N种类型物品的图片进行了大量的人工标记(label),耗费了巨大的人力物 ...
- 课程四(Convolutional Neural Networks),第四 周(Special applications: Face recognition & Neural style transfer) —— 2.Programming assignments:Art generation with Neural Style Transfer
Deep Learning & Art: Neural Style Transfer Welcome to the second assignment of this week. In thi ...
- [C4W4] Convolutional Neural Networks - Special applications: Face recognition & Neural style transfer
第四周:Special applications: Face recognition & Neural style transfer 什么是人脸识别?(What is face recogni ...
- Google Tensorflow 迁移学习 Inception-v3
附上代码加数据地址 https://github.com/Liuyubao/transfer-learning ,欢迎参考. 一.Inception-V3模型 1.1 详细了解模型可参考以下论文: [ ...
- 项目总结四:神经风格迁移项目(Art generation with Neural Style Transfer)
1.项目介绍 神经风格转换 (NST) 是深部学习中最有趣的技术之一.它合并两个图像, 即 内容图像 C(content image) 和 样式图像S(style image), 以生成图像 G(ge ...
- 迁移学习( Transfer Learning )
在传统的机器学习的框架下,学习的任务就是在给定充分训练数据的基础上来学习一个分类模型:然后利用这个学习到的模型来对测试文档进行分类与预测.然而,我们看到机器学习算法在当前的Web挖掘研究中存在着一个关 ...
- 迁移学习(Transfer Learning)(转载)
原文地址:http://blog.csdn.net/miscclp/article/details/6339456 在传统的机器学习的框架下,学习的任务就是在给定充分训练数据的基础上来学习一个分类模型 ...
- 【深度学习系列】迁移学习Transfer Learning
在前面的文章中,我们通常是拿到一个任务,譬如图像分类.识别等,搜集好数据后就开始直接用模型进行训练,但是现实情况中,由于设备的局限性.时间的紧迫性等导致我们无法从头开始训练,迭代一两百万次来收敛模型, ...
- 迁移学习(Transfer Learning)
原文地址:http://blog.csdn.net/miscclp/article/details/6339456 在传统的机器学习的框架下,学习的任务就是在给定充分训练数据的基础上来学习一个分类模型 ...
随机推荐
- 刚买个炼狱蝰蛇1800dpi的下完驱动提示没有发现鼠标
2017-02-19补充:可以下载下面的程序 ,也可以访问 http://cn.razerzone.com/synapse/ 下载雷云 也可解决问题 ------------------------ ...
- 浅谈最大流的Dinic算法
PART 1 什么是网络流 网络流(network-flows)是一种类比水流的解决问题方法,与线性规划密切相关.网络流的理论和应用在不断发展,出现了具有增益的流.多终端流.多商品流以及网络流的分解与 ...
- 备忘:Junit单元测试
junit 目前测试都是在main方法中调用目前的结果都需要人工对比是否是想要的 1.使用Junit测试方法,绿色条条代表方法测试成功,没有bug,如果是红色条条代表有异常,测试不通过2.点击方法名. ...
- web.xml组件加载顺序
在配置项目组件的过程中, 了解Tomcat加载组件顺序很有必要. 例如某些框架如Quartz的集群功能需要数据库的支持, 数据库的加载肯定要在框架组件加载之前. 经过查阅和Debug发现, web.x ...
- Java垃圾回收机制[转]
原文地址:http://blog.csdn.net/zsuguangh/article/details/6429592 综合了若干人的blog- 1. 垃圾回收的意义 在C++中,对象所占的内存在程序 ...
- bzoj 4872: [Shoi2017]分手是祝愿 [期望DP]
4872: [Shoi2017]分手是祝愿 题意:n个灯开关游戏,按i后i的约数都改变状态.随机选择一个灯,如果当前最优策略\(\le k\)直接用最优策略.问期望步数\(\cdot n! \mod ...
- 自己动手实践 spring retry 重试框架
前序 马上过年了,预祝大家,新年快乐,少写bug 什么是spring retry? spring retry是从spring batch独立出来的一个能功能,主要实现了重试和熔断. 什么时候用? 远程 ...
- iOS学习——UIView的研究
在iOS开发中,我们知道有一个共同的基类——NSObject,但是对于界面视图而言,UIView是非常重要的一个类,UIView是很多视图控件的基类,因此,对于UIView的学习闲的非常有必要.在iO ...
- 事务与隔离级别------《Designing Data-Intensive Applications》读书笔记10
和数据库打交道的程序员绕不开的话题就是:事务,作为一个简化访问数据库的应用程序的编程模型.通过使用事务,应用程序可以忽略某些潜在的错误场景和并发问题,由数据库负责处理它们.而并非每个应用程序都需要事务 ...
- shell编程之运算符(3)
declare声明变量类型 declare[+/-][选项]变量名 选项: - : 给变量设定类型属性 + : 取消变量的类型属性 -a : 将变量声明为数组型 -i : 将变量声明为整数型(inte ...