Awesome
Stroke Controllable Fast Style Transfer
This repository contains the public release of the Python implementation of
Stroke Controllable Fast Style Transfer with Adaptive Receptive Fields [arXiv]
<!--[**Stroke Controllable Fast Style Transfer with Adaptive Receptive Fields**](https://arxiv.org/abs/1802.07101)-->Yongcheng Jing*, Yang Liu*, Yezhou Yang, Zunlei Feng, Yizhou Yu, Dacheng Tao, Mingli Song
If you use this code or find this work useful for your research, please cite:
@inproceedings{jing2018stroke,
title={Stroke Controllable Fast Style Transfer with Adaptive Receptive Fields},
author={Jing, Yongcheng and Liu, Yang and Yang, Yezhou and Feng, Zunlei and Yu, Yizhou and Tao, Dacheng and Song, Mingli},
booktitle={European conference on computer vision},
year={2018}
}
Please also consider citing our another work:
@article{jing2017neural,
title={Neural Style Transfer: A Review},
author={Jing, Yongcheng and Yang, Yezhou and Feng, Zunlei and Ye, Jingwen and Yu, Yizhou and Song, Mingli},
journal={arXiv preprint arXiv:1705.04058},
year={2017}
}
Getting Started
Implemented and tested on Ubuntu 14.04 with Python 2.7 and Tensorflow 1.4.1.
Dependencies
Download pre-trained VGG-19 model
The VGG-19 model of tensorflow is adopted from VGG Tensorflow with few modifications on the class interface. The VGG-19 model weights is stored as .npy file and could be download from Google Drive or BaiduYun Pan. After downloading, copy the weight file to the /vgg19 directory
Basic Usage
Train the network
Use train.py to train a new stroke controllable style transfer network. Run python train.py -h
to view all the possible parameters. The dataset used for training is MSCOCO train 2014 and could be download from here, or you can use a random selected 2k images from MSCOCO (download from here) for quick setup. Example usage:
$ python train.py \
--style /path/to/style_image.jpg \
--train_path /path/to/MSCOCO_dataset \
--sample_path /path/to/content_image.jpg
Freeze model
Use pack_model.py to freeze the saved checkpoint. Run python pack_model.py -h
to view all parameter. Example usage:
$ python pack_model.py \
--checkpoint_dir ./examples/checkpoint/some_style \
--output ./examples/model/some_style.pb
We also provide some pre-trained style model for fast forwarding, which is stored under ./examples/model/pre-trained/
.
Inference
Use inference_style_transfer.py to inference the content image based on the freezed style model. Set --interp N
to enable interpolation inference where N
is the number of the continuous stroke results.
$ python inference_style_transfer.py \
--model ./examples/model/some_style.pb \
--serial ./examples/serial/default/ \
--content ./examples/content/some_content.jpg
For CPU-users, please set os.environ["CUDA_VISIBLE_DEVICES"]=""
in the source code.
Examples
Discrete Stroke Size Control
From left to right are content, style, 256-stroke-size result, 512-stroke-size result, 768-stroke-size result.
<p align='center'> </br> <img src='examples/readme_examples/discrete_stroke/1_c.jpg' width='165'> <img src='examples/readme_examples/discrete_stroke/1_s.jpg' width='165'> <img src='examples/readme_examples/discrete_stroke/1_256.jpg' width='165'> <img src='examples/readme_examples/discrete_stroke/1_512.jpg' width='165'> <img src='examples/readme_examples/discrete_stroke/1_768.jpg' width='165'> </br> <img src='examples/readme_examples/discrete_stroke/2_c.jpg' width='165'> <img src='examples/readme_examples/discrete_stroke/2_s.jpg' width='165'> <img src='examples/readme_examples/discrete_stroke/2_256.jpg' width='165'> <img src='examples/readme_examples/discrete_stroke/2_512.jpg' width='165'> <img src='examples/readme_examples/discrete_stroke/2_768.jpg' width='165'> </br> <img src='examples/readme_examples/discrete_stroke/3_c.jpg' width='165'> <img src='examples/readme_examples/discrete_stroke/3_s.jpg' width='165'> <img src='examples/readme_examples/discrete_stroke/3_256.jpg' width='165'> <img src='examples/readme_examples/discrete_stroke/3_512.jpg' width='165'> <img src='examples/readme_examples/discrete_stroke/3_768.jpg' width='165'> </br> </p>Spatial Stroke Size Control
From left to right are content&style, mask, same stroke size across image result and spatial stroke size control result.
<p align='center'> </br> <img src='examples/readme_examples/spatial_control/1_c.jpg' width='210'> <img src='examples/readme_examples/spatial_control/1_m.png' width='210'> <img src='examples/readme_examples/spatial_control/1_256.jpg' width='210'> <img src='examples/readme_examples/spatial_control/1_result.jpg' width='210'> </br> <img src='examples/readme_examples/spatial_control/2_c.jpg' width='210'> <img src='examples/readme_examples/spatial_control/2_m.png' width='210'> <img src='examples/readme_examples/spatial_control/2_256.jpg' width='210'> <img src='examples/readme_examples/spatial_control/2_result.jpg' width='210'> </br> <img src='examples/readme_examples/spatial_control/3_c.jpg' width='210'> <img src='examples/readme_examples/spatial_control/3_m.png' width='210'> <img src='examples/readme_examples/spatial_control/3_256.jpg' width='210'> <img src='examples/readme_examples/spatial_control/3_result.jpg' width='210'> </br> <img src='examples/readme_examples/spatial_control/4_c.jpg' width='210'> <img src='examples/readme_examples/spatial_control/4_m.png' width='210'> <img src='examples/readme_examples/spatial_control/4_256.jpg' width='210'> <img src='examples/readme_examples/spatial_control/4_result.jpg' width='210'> </br> <img src='examples/readme_examples/spatial_control/5_c.jpg' width='210'> <img src='examples/readme_examples/spatial_control/5_m.jpg' width='210'> <img src='examples/readme_examples/spatial_control/5_256.jpg' width='210'> <img src='examples/readme_examples/spatial_control/5_result.jpg' width='210'> </br> </p>Continuous Stroke Size Control
Stroke grows from left to right. We zoom in on the same region (red frame) to observe the variations of stroke sizes
<p align='center'> </br> <img src='examples/readme_examples/continuous_control/1/1_rectangle.jpg' width='140'> <img src='examples/readme_examples/continuous_control/1/2_rectangle.jpg' width='140'> <img src='examples/readme_examples/continuous_control/1/3_rectangle.jpg' width='140'> <img src='examples/readme_examples/continuous_control/1/4_rectangle.jpg' width='140'> <img src='examples/readme_examples/continuous_control/1/5_rectangle.jpg' width='140'> <img src='examples/readme_examples/continuous_control/1/6_rectangle.jpg' width='140'> </br> <img src='examples/readme_examples/continuous_control/1/1_detail.png' width='140'> <img src='examples/readme_examples/continuous_control/1/2_detail.png' width='140'> <img src='examples/readme_examples/continuous_control/1/3_detail.png' width='140'> <img src='examples/readme_examples/continuous_control/1/4_detail.png' width='140'> <img src='examples/readme_examples/continuous_control/1/5_detail.png' width='140'> <img src='examples/readme_examples/continuous_control/1/6_detail.png' width='140'> </br> <img src='examples/readme_examples/continuous_control/2/1_rectangle.jpg' width='140'> <img src='examples/readme_examples/continuous_control/2/2_rectangle.jpg' width='140'> <img src='examples/readme_examples/continuous_control/2/3_rectangle.jpg' width='140'> <img src='examples/readme_examples/continuous_control/2/4_rectangle.jpg' width='140'> <img src='examples/readme_examples/continuous_control/2/5_rectangle.jpg' width='140'> <img src='examples/readme_examples/continuous_control/2/6_rectangle.jpg' width='140'> </br> <img src='examples/readme_examples/continuous_control/2/1_detail.png' width='140'> <img src='examples/readme_examples/continuous_control/2/2_detail.png' width='140'> <img src='examples/readme_examples/continuous_control/2/3_detail.png' width='140'> <img src='examples/readme_examples/continuous_control/2/4_detail.png' width='140'> <img src='examples/readme_examples/continuous_control/2/5_detail.png' width='140'> <img src='examples/readme_examples/continuous_control/2/6_detail.png' width='140'> </br> <img src='examples/readme_examples/continuous_control/3/1_rectangle.jpg' width='140'> <img src='examples/readme_examples/continuous_control/3/2_rectangle.jpg' width='140'> <img src='examples/readme_examples/continuous_control/3/3_rectangle.jpg' width='140'> <img src='examples/readme_examples/continuous_control/3/4_rectangle.jpg' width='140'> <img src='examples/readme_examples/continuous_control/3/5_rectangle.jpg' width='140'> <img src='examples/readme_examples/continuous_control/3/6_rectangle.jpg' width='140'> </br> <img src='examples/readme_examples/continuous_control/3/1_detail.png' width='140'> <img src='examples/readme_examples/continuous_control/3/2_detail.png' width='140'> <img src='examples/readme_examples/continuous_control/3/3_detail.png' width='140'> <img src='examples/readme_examples/continuous_control/3/4_detail.png' width='140'> <img src='examples/readme_examples/continuous_control/3/5_detail.png' width='140'> <img src='examples/readme_examples/continuous_control/3/6_detail.png' width='140'> </br> </p>License
© Alibaba-Zhejiang University Joint Research Institute of Frontier Technologies, 2018. For academic and non-commercial use only.
Contact
Feel free to contact us if there is any question (Yang Liu lyng_95@zju.edu.cn)