写在前面
项目需要,研究了一下Pix2PixHD的运行方法,这里对一些个人感觉难以理解的代码进行讲解,如果有写的不对的地方欢迎指正~
数据格式
这里以citycapes数据集为例,参考了这篇博客
语义图像:每个类别一种标签颜色,例如图片中的所有车的像素值都是26。citycapes的语义图像大小为[2048, 1024, 1]。
注意Pix2PixHD并没有直接使用这幅语义图像,而是使用的上面那副。
实例图像:同一类别的不同实例个体用的标签颜色也不一样,例如下面四辆车,用肉眼看是一个颜色,但是用opencv工具显示出来发现像素值还是有差别的,四辆车的像素值分别为26010、26005、26008、26003。这里之所以像素值大小为26010应该是用的16位存的,而不是0~255那种8位来存。
citycapes的实例图像大小为[2048, 1024, 1]。
注意需通过cv2.imread(path, cv2.IMREAD_UNCHANGED)才能无损的读取到实例的uint图像数据。
数据处理
one-hot编码:citycapes一共有35类(34个类别+1个不晓得是什么的类别),作者将语义图片NCHW[1, 1, 2048, 1024]编码成one-hot格式[1, 35, 2048 ,1024],其中每一个通道代表一个类别,这里我们取出第26个通道[1, 1, 2048 ,1024]出来,发现这一个通道全是车子。
边缘映射:作者将实例图像[1, 1, 2048 ,1024]转换为边缘图像[[1, 1, 2048 ,1024]],如何转换的论文里面有。
生成器输入:将one-hot编码[1, 35, 2048 ,1024]与边缘映射[1, 1, 2048 ,1024按通道维度拼接变为[1, 36, 2048 ,1024]送入生成器进行训练。
如何运行
如果你只有语义图像
python train.py --name 训练名字 --no_instance --label_nc 0 --resize_or_crop none --dataroot 数据集名字
如果你有语义图像+实例图片
python train.py --name 训练名字 --label_nc 类别数 --resize_or_crop none --dataroot 数据集名字
如果你想联合训练(先训练全局生成器再训练局部增强器)
首先执行:
python train.py --name 训练名字 --label_nc 类别数 --netG global --resize_or_crop none --dataroot 数据集名字
训练完后再执行:
python train.py --name 训练名字 --label_nc 类别数 --netG local --resize_or_crop none --dataroot 数据集名字 --load_pretrain 训练全局生成器网络保存路径
加入编码器的实力特征
训练:
python train.py --name 训练名字 --label_nc 类别数 --resize_or_crop none --dataroot 数据集名字 --instance_feat
推理:
先执行(遇到的报错网上搜索得到,大概就是data[0]改为item()以及np.load加上allow_pickle=True)
python encode_features.py --name 训练名字 --label_nc 类别数 --resize_or_crop none --dataroot 数据集名字
再执行
python test.py --name 训练名字 --label_nc 类别数 --resize_or_crop none --dataroot 数据集名字 -instance_feat
可视化代码
代码我放在这里
下面对各个文件简单介绍一下
get_edges.py:边缘映射,将实例图变为边缘图。
get_onehot.py:one-hot编码,把语义图进行one-hot编码,每一通道是一个类别,一个35个类别,所以有35个通道。
get_imgvalue.py:鼠标指在哪里现实哪里的像素值,把鼠标移到车子上可以看到车子的像素值大小为26000多。
写在后面
这是我总结的GAN相关论文的解析。希望本文对大家学习Pix2PixHD有所帮助。