# nnStyle
**Repository Path**: penghuailiang/nnStyle
## Basic Information
- **Project Name**: nnStyle
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-05-12
- **Last Updated**: 2021-05-12
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 基于神经网络的风格转换
[English Version](./readme.md)
[paper][i1]
[website][i2]
此项目旨在视频游戏中转换风格。
我们使用预训练好的TensorFlow模型, 并在unity使用compute shader实现了一套前向传播的网络。
如上图所示, 左边是原图,中间是unity转换的图片,右边是TensorFlow inrefrence的图片。
我们通过后处理把风格转换后的RT渲染到一个render上的实时效果图:
对应项目中的Forest Scene, 上图右下角即转换风格的RT.
## 环境
Unity2018.2
Python2.7 or 3.5
Tensorflow 1.7 or new
PIL, numpy, scipy, cv2
tqdm
## 分支
git 分支说明:
master: 复杂完整的实现,但牺牲了性能. 在PC(显卡 Geforce GTX 1060 3GB) 上大概3FPS
fast: 为了性能删除了一些不必要的网络层. 在PC(显卡Geforce GTX 1060 3GB)上大概29FPS
half: 在compute shader中把float类型转换为half类型, 为了节省运行内存
## 数据处理
### 导出网络参数命令:
```sh
python main.py \
--model_name=model_van-gogh \
--phase=export_arg \
--image_size=256
```
运行成功之后,在unity/Assets/Resources/目录中可以发现 *args.bytes* .
此配置文件包含了TensorFlow中训练的模型参数。注意这个不是protobuf格式的,而是自定义的数据格式。
生成bytes之后, 在unity中菜单栏点击Tools->GenerateMap, 生成map.asset, 然后选中map, 在Inspector中点击Analysis,可以生成参数和compute shader kernel的映射表, 如下图所示。

点击save按钮,map会序列化到磁盘中。
### 导出网络layer,运行命令:
```sh
python main.py \
--model_name=model_van-gogh \
--phase=export_layers \
--image_size=256
```
你也可以在[百度云盘](https://pan.baidu.com/s/1hNqmZv1Xvygx7nMb7PfZjg) (提取码:6thf)上下载到这些导出好的数据, 然后导入到unity.
导出之后,在unity中运行Tools->LayerVisual, 可以看到每一层的数据可视化图像,如下图所示:

### python环境中预览模型效果:
```sh
python main.py \
--model_name=model_van-gogh \
--phase=inference \
--image_size=256
```
运行命令后,会在model目录生成对应分辨率的图片。
## 训练
内容训练集图片 [microsoft coco dataset train mages (13GB)](http://mscoco.org).
风格化图片 [download link](https://hcicloud.iwr.uni-heidelberg.de/index.php/s/NcJj2oLBTYuT1tf).
1. 风格化图像下载到 `./data`.
2. 下载内容图片
3. 训练使用命令
```
CUDA_VISIBLE_DEVICES=1 python main.py \
--model_name=model_van-gogh-new \
--batch_size=1 \
--phase=train \
--image_size=256 \
--lr=0.0002 \
--dsr=0.8 \
--ptcd=/data/micro_coco _dataset \
--ptad=./data/vincent-van-gogh_road-with-cypresses-1890
```
## 说明
在compute shader中,threadgroup 优化分配满足z方向的线程。
但是z方向的受限于最大个数64个线程, 在batch-normal阶段,我们交换了thread-x和thread-z, 因为thread-x最大可以达到1024个。
在训练期间, 参数model-name应该不等同于inference阶段, 否则的话, 网络会从老的与训练好的模型载入。
## 激励函数
在unity中,有一个单独的ActiveFunc scene, 可以预览激励函数的变化。点击按钮 *Active function*, 你就会看到如下图的效果:

我们使用不同的三种颜色,代表了不同的三种不同的激励函数,R是relu, G是sigmod, B是tanh。
## 联系方式
Email: peng_huailiang@qq.com
Blog: https://huailiang.github.io/
[i1]: https://github.com/huailiang/nnStyle/blob/master/image/paper.pdf
[i2]: https://huailiang.github.io/blog/2019/nnstyle/