这是一个神奇的项目,甚至是其他项目的母项目,但是,这不是最原版的项目了。
最原版的项目使用 2.7
,这个已经改成 3+
了。
这里我推荐使用 python 3.6
。
项目相关
配置环境
其虚拟环境我用的是 python3.6
,关于配置环境,我直接用的是
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple Tensorflow==1.4.1
这样简单的安装之后就可以直接用了,本来我想用 docker
的,结果使用校园网出现了网络链接不行,需要认证之类的,所以,最后直接安装了,然后发现,真的只需要装 tensorflow
就足够了。
制作数据集
这个暂时忽略
使用
训练
这里假设你已经制作好自己的数据集,使用
如果你没有自己的数据集,又想运行这个项目,可以,下载官方的数据集
1 | python tools/download-dataset.py facades |
训练
1 | # train the model (this may take 1-8 hours depending on GPU, on CPU you will be waiting for a bit) |
这里先展示我的目录结构
|___docker
|___docs
|___facades_train 「存储输出 model 的目录」
|___facades
|___train 「存储数据集」
|___server
|___tools
|___export-checkpoint.py
|___tools 「存储转化 model 的脚本」
|___static 「自建目录,存储 model 转化为 pict」
|___pix2pix.py
这里展示一下,我的文件目录的内容
output_dir
我的 output_dir
是 facades_train
经过训练,我得到的结果如下面所示
input_dir
我的 input_dir
是 facades/train
这里贴一张,我的数据集中的一张照片
测试
1 | # test the model |
转化 model
有的时候,我们虽然可以用 python
直接使用 model
,但是,有的时候,我们想用 js
直接调用训练好的 model
。
这个时候有两个思路。
思路一
部署该模型为一个服务,在客户端浏览器中利用JS
把Canvas数据
发送请求至该服务来获得手绘风格的输出。
这个我没操作过,但是,还需要部署一个服务器,想来也是比较麻烦,但是,该项目同样给出了如何部署服务器的代码。
进入该项目的 server
目录。
可以看到里面有一个转换的过程
Exporting
1 | python tools/export-checkpoint.py \ |
这个代码块的意思是,将 facades_BtoA
里面的训练好的模型转化为文件 facades_BtoA.bin
。
开启服务
1 | python serve.py --port 8000 |
If you open http://localhost:8000/
in a browser, you should see an interactive demo.
这个方案我没试过,因为,我见过一个更加简便的方式,那就是不需要开启服务,直接用 js
调用 model
,把 model
看成一个方法。
思路二
网上的一个思路是
利用Keras训练该模型并利用tensorflowJs直接部署到浏览器,这样做就不需要服务器端的交互,更利于集成。
但是,我看到的那个项目没有这么采用,那个项目是
我也对这个项目进行了分析,在
这个项目的思路是直接使用 deeplearn.js
来调用 model
,但是,他的 model
的格式是 pict
的,我们的是 **
,所以下一步就是如何转化模型。
查了很久终于在一个帖子上看到
其中有一代码块是
python tools/export-checkpoint.py --checkpoint ../export --output_file static/models/facades_BtoA.pict
按照这个项目,其命令为
python ./server/tools/export-checkpoint.py --checkpoint facades_train --output_file static/models/facades_BtoA2.pict
原来还是利用了上面格式转换,只不过最后的后缀变了,尝试以后,果然成功了。
不过,原贴主用的是 ml5.js
。
1 | pix2pix = ml5.pix2pix('model/MY_OWN_MODEL.pict', modelLoaded); |
我那个项目用的是 deeplearn.js
,感兴趣的可以研究一下。