之前用CycleGAN网络训练了男女面部转换的模型,最近用之前的预训练参数作为初始参数接着训练了新的素描与彩图互相转换的模型。
原理部分
生成器与判别器
生成器将给定图像转换至目标域,判别器判别输入图像是原图还是生成器的生成图像。
生成器与鉴别器对抗至动态平衡。
生成器
编码:利用卷积神经网络从输入图象中提取特征。将图像压缩成256个64*64的特征向量。
转换:将图像在DA域中的特征向量转换为DB域中的特征向量。
解码:利用反卷积层从特征向量中还原出低级特征得出生成图像。
鉴别器
鉴别器将一张图像作为输入,并尝试预测其为原始图像或是生成器的输出图像。
利用卷积神经网络从图像中提取特征并判别是否属于特定类别。
实践部分
1.寻找训练集
由于对彩色图像范围没有具体要求,下载了imagenet网站上的图片集,使用了其中大约2.5万张作为彩图的训练集。素描图没有找到合适的大量可下载的图片集,于是自己转换了2.5万张彩图为素描图。使用了ps批处理功能:
步骤:
- 去色:转为灰度图
- 反相:求补色
- 高斯模糊:对反相后的图片做高斯模糊,根据效果测试选取了高斯半径为15
-
图像融合:将去色的灰度图与高斯模糊后的图像做图像融合,选择颜色减淡效果
2. 规整图片大小(resize)
图片大小参差不齐,需要统一调整至256*256。使用了Image库PIL/pillow
from PIL import Image
import os
from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
def convert(dir,width,height):
file_list = os.listdir(dir)
print(file_list)
for filename in file_list:
path=''
path=dir+filename
im=Image.open(path)
out=im.resize((256,256),Image.ANTIALIAS)
print "%s has been resized!"%filename
out.save(path)
print("success")
if __name__ == '__main__':
dir = raw_input('please input the operate dir:')
convert("/run/media/cumtb822/822share/sketch/",256,256)
此处需注意:如果下载PIL库,conda install PIL,会遇到不支持JPEG格式图片的问题,需要先卸载PIL库,再下载JPEG的依赖库之后重新下载编译。安装libjpeg库时建议直接到conda官网上搜索libjpeg-turbo与自己系统对应的版本与命令行,装好之后建议直接安装pillow即可(conda install pillow)
另外,如果import Image总报错,建议改为from PIL import Image试试。虽然报的错毫不相关,但是改一下很可能问题就解决了。
3. 将图片转换成tfrecords格式
这个项目中提供了一个build_data脚本,用于将图片转换成tfrecords形式。假设我们的图片存放在/Xdatasets_resized/和/Ydatasets_resized/ \目录下,对应的命令就是:
python build_data.py \
--X_input_dir ~/Xdatasets_resized/ \
--Y_input_dir ~/Ydatasets_resized/ \
--X_output_file ~/Xdatasets.tfrecords \
--Y_output_file ~/Ydatasets.tfrecords
4. 训练
恢复了上次的训练参数继续训练
训练的命令为:
python train.py \
--X ~/....Xdatasets.tfrecords \
--Y ~/....Ydatasets.tfrecords \
--image_size 256
训练的过程比较漫长,此时可以打开TensorBoard来观察训练情况(运行这个命令时需要将“20170715-1622”改成机器中对应的文件夹,下同):
tensorboard --logdir checkpoints/20180314-0900(正确的检查点路径即可)
中断训练时如果自动保存的checkpoints三个文件有问题,可以手动更改checkpoint文件中记载的model_checkpoint_path,改成需要的即可。
模型共训练了大概24*3小时,大约30万次迭代。
5. 导出模型并执行单张图片
导出模型的方法为:
python export_graph.py \
--checkpoint_dir checkpoints/20170715-1622 \
--XtoY_model color2sketch.pb \
--YtoX_model sketch2color.pb \
--image_size 256
对单张图片进行转换(将data/test.jpg替换为对应的输入图片地址):
python inference.py \
--model pretrained/man2woman.pb \
--input data/test.jpg \
--output data/output.jpg \
--image_size 256
6.过程检测及测试结果
彩图转素描图,转的素描图大体问题不大,但是素描图重建回彩图时缺少绿色。训练15万次迭代时,缺少红色和绿色元素,增加10小时训练后,产生与红色较接近的橘黄色,至今仍缺少绿色元素,原因未知。
左上为输入图(batchsize=2),右上两张为生成的素描,左下两张为由素描图重建的彩图
直接素描图转彩图,由于彩图域里的图像颜色覆盖较广,没有特定转换色彩约定,因此转换结果十分随意,只是随意上色的结果,重建回去的素描图相对比较准确,loss很小。
训练过程中:左上为输入图(batchsize=2),右上两张为生成的彩图,左下两张为由彩图重建的素描图
结束训练导出两个模型:color2sketch.pb, sketch2color.pb
用新的图片做了一些测试,效果如下: