以下内容为本人亲测使用过程,完成了橘子到苹果的AI转化效果,先上效果:
目录
1、下载数据集
2、下载代码
3、程序运行
(1)数据集
(2)运行visdom
(3)本地执行train.py文件
(4)ECS服务端运行train.py
(5)测试模型效果
4、自己的数据集进行训练
Index of /cyclegan/datasets
本次做的是苹果和橘子相互转化的实验,所以下载apple2orange.zip数据集
github地址为:
https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix
将数据集apple2orange放到代码的datasets目录下
这个是facebook开发的类似tensorboard的可视化工具
执行命令:python -m visdom.server
在pycharm中的”Run”-> “Edit Configurations”下配置执行参数
--dataroot ./datasets/apple2orange --name apple2orange_cyclegan --model cycle_gan
执行后报错如下:“AttributeError: module 'torchvision.transforms' has no attribute 'InterpolationMode'”
解决方案:参考https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix/issues/1450文档,data/base_dataset.py文件中将transforms.InterpolationMode.BICUBIC全部修改为Image.BICBIC。
报错信息:OSError: [WinError 1455] 页面文件太小,无法完成操作。 Error loading "D:\programs\python37\lib\site-packages\torch\lib\caffe2_detectron_ops_gpu.dll" or one of its dependencies.
本人2G的GPU跑不起来,需要改小模型、改少数据加载量、以及CPU运行,如果服务器显存够大则不需要下面的步骤。
修改方法为:
在models/networks.py文件中增加如下信息:
然后修改python运行配置,添加:
--netG
resnet_1blocks
--print_freq
1
--display_freq
2
--gpu_ids
-1
在options/base_options.py中修改--num_threads为1
再次运行成功,pycharm显示如下:
Visdom显示如下:
本人在本机(2G显存)上进行代码调试,在服务器(16G显存)上进行训练。
代码在Docker(0a381dad2084)的位置为:/root/program/pytorch-CycleGAN-and-pix2pix
首先,data/base_dataset.py文件中将transforms.InterpolationMode.BICUBIC全部修改为Image.BICBIC
然后,执行命令:python -m visdom.server -p 8097,先下载一些脚本文件
接着,执行命令:python train.py --dataroot ./datasets/apple2orange --name apple2orange_cyclegan --model cycle_gan --display_id 0 --num_threads 1
后台运行方式为:nohup python -u train.py --dataroot ./datasets/apple2orange --name apple2orange_cyclegan --model cycle_gan --display_id 0 --num_threads 1 > train.log 2>&1 &
注意:一定要指定—display_id 0,否则会报错:Setting up a new session...,然后一直卡在那里。
下载测试的预料如下,放置两个目录testA和testB,分别放一张苹果和橘子的图片。
执行测试命令:python test.py --dataroot datasets/ping2ju --name apple2orange_cyclegan --model cycle_gan --no_dropout
最后会生成images文件,如下图所示:
最后效果如下:
本次试验是将“虚假的车牌”变成“真实的车牌”。
A是虚假的车牌,B是真实的车牌。
首先根据B生成虚假的车牌A,然后训练A->B的神经网络,最后希望能把任意的A图生成B图。
构造数据集如下:共4个目录,分别为trainA、trainB、testA、testB。XXB为真实的车牌;XXA为代码生成的比较假的车牌,如下图所示:
(1)将所有车牌(清晰+不清晰)图片用于cycleGAN训练,迭代了10轮之后模型测试的效果如下:
可以看到得到的B图非常不清楚。
(2)仅将清晰的车牌用于cycleGAN训练,迭代了100轮之后模型测试的效果如下:
可以看到车牌样式与实际非常相符,但是车牌号码完全不对。
原因:cycleGAN并不是一对一的进行训练,而是域和域之间的训练,数字被作为域图片样式的一部分,所以使用cycleGAN生成指定字符的“真实车牌”有点困难。
将原始的车牌号码换成较真实一点的如下:
140轮迭代之后变成:
效果仍然欠佳!