Day19 放之四海而皆准

《21天实战Caffe》学习笔记第19天

艺术风格迁移

运行http://github.com/fzliu/style-transfer的脚本,运行中有几个小问题。

测试命令如下。

1
2
cd style-transfer
python style.py -s images/style/starry_night.jpg -c images/content/johannesburg.jpg -g -1

(以下几个Error依次发生,即解决Error 1后才引发Error 2。)

Error 1

1
ValueError: can not convert object to float64.

根据https://github.com/BVLC/caffe/issues/438中@RawanMG的说法,可以使用matplotlib解决这个问题。

即在style.py开头添加如下语句。

1
from skimage import io; io.use_plugin('matplotlib')

Error 1解决。

(这个Error可能是我的python site-packages版本较旧的原因?)

Error 2

1
ImportError: No module named Tkinter

缺少Tkinter包,安装即可。

1
yum install tkinter

测试通过。

1
import Tkinter

Error 2解决。

Error 3

1
IOError: decoder jpeg not available

没有jpeg解码器,安装即可。

1
yum install libjpeg-devel

根据https://stackoverflow.com/questions/8915296/python-image-library-fails-with-message-decoder-jpeg-not-available-pil的说法,需要重装相应的pyhon site-packages,涉及PIL和Pillow。

根据https://blog.csdn.net/qq562029186/article/details/52972152,得知Pillow是PIL的替代品,且我目前的Python2安装的就是Pillow,所以重装Pillow。

1
2
pip2 uninstall Pillow
pip2 install Pillow==2.3.0

(限制版本是防止pyhon site-packages间相互依赖、引发冲突,或不支持Python2。)

Error 3解决。

运行

1
2
3
4
5
style.py:main:21:22:07.489 -- Starting style transfer.
style.py:main:21:22:07.489 -- Running net on CPU.
style.py:main:21:22:07.683 -- Successfully loaded images.
style.py:main:21:22:35.974 -- Successfully loaded model vgg16.
Optimizing: 1% |- | ETA: 20:25:50

由于只用了CPU,运行速度过慢,放弃了,至少代码是能正常运行的。

一点感想

艺术风格迁移的核心思路是图像的“内容”和“风格”看似为一个整体,但却是可以分开表达的。基于此,有两个输入——想要的内容和想要的风格,进而获得艺术迁移的结果。

也就是说,从一张图片上可以剥离出独立于物体概念的风格信息。比如有一张煎蛋的真实照片,那么就可以分离出“煎蛋”这个概念、这个物体,同时分离出“现实拍摄”这一风格。进而以这张图片的“煎蛋”概念作为内容输入,以另一张图片的动画风格作为风格,就能获得动画煎蛋的图片。

这有些像经典图像处理中的高频信息,人们很难感受到、或者说不是人们关注的重点,但这些高频信息确实能够影响图像清晰度、图像体积乃至记录其他肉眼看不到的信息。

应当是这才是深度学习发展的一个思路——总归要有思路,才能去用深度学习的工具;而不能说就只盯着输入输出,把深度学习完全当成一个黑箱,只管扔进去和出来的东西。

自然语言处理(nlp-caffe)

编译过程

(编译环境:CentOS 7.6 )

用nlpcaffe自带的makefile.config,在改成仅CPU模式(CPU := 1)并检查了python路径后,开始编译。

但报错。报错内容是缺少cblas。

1
2
cannot find -lcblas
cannot find -latlas

查了一下解决方法,有人说CentOS下没有cblas,需用tatlas和satlbas代替,应该将makefile中的cblas和atlas替换掉(CentOS论坛上也有类似的说法)。

但我按上述方法做了之后,仍是同样的报错。又去看了一下caffe的makefile,相应地方写的也是cblas——所以这么写也没问题吧。

于是直接将之前编译caffe的makefile.config复制过来,再编译就正常了。

(粗看没发现这两个makefile.config有什么区别orz…)

共存的问题

但其实我好奇一件事情,虽然caffe没有写入环境变量,调用不同版本的caffe对应好路径就OK,但相应的接口怎么办?

比如在Python下import caffe,这里import进来的caffe是哪个caffe?最后一次编译的吗?

训练模型

操作和看日志已经比较熟练了

但又发生了一件尴尬的事..这个模型训练的是啥…orz…

模型结构图

画example的结构模型画了大概20min orz…

(而且似乎最后什么都没有…)