制作自己的适用于pix2pix的数据集(win)

文章目录

  • 前言
  • 一、问题
  • 一、数据的尺寸要求和缩放方式
  • 二、从原图提取边缘的过程
  • 三、图片的合并
  • 四、命名的规范
  • 总结


前言


一、问题

根据我们对作者给出的数据集的样式,我们产生了四个问题。
第一个问题是,当我们的每一张图的大小不一时,如何调整图像的大小。
第二个问题是,当我们拥有一种类型的图像,我们如何将一种类型的图像转换为另一种类型的图像。举例来说,我拥有了鞋子的图像时,我如何为他们提取边缘。
第三个问题是,当我们的图像分为A和B两组时,两者的名称如何对应起来。
第四个问题是,当我们的图像分为A和B两组时,如何将两者拼接。
下面这一篇文章使我们发现,我们的第三个和第四个问题原作者已经为我们考虑好了。
利用pix2pix网络训练自己的有较高分辨率的数据集

一、数据的尺寸要求和缩放方式

我们来试一试
网上下载了Stanford cars数据集之后,我们挑几张进一个文件夹,然后测试

# 提取目录下所有图片,更改尺寸后保存到另一目录
from PIL import Image
import os.path
import glob

# 设置图片路径,该路径下包含了14张jpg格式的照片,名字依次为0.jpg, 1.jpg, 2.jpg,...,14.jpg
data_dir = "C:\\Users\\用户名\\Documents\\GitHub\\pytorch-CycleGAN-and-pix2pix\\datasets\\cars\\cars_Mine"
out_dir = 'C:\\Users\\用户名\\Documents\\GitHub\\pytorch-CycleGAN-and-pix2pix\\datasets\\cars\\cars_resize'
img_path = os.path.join(data_dir)
# 使用os.listdir(path)函数,返回path路径下所有文件的名字,以及文件夹的名字,
# 例如,执行下行代码后,img_list是一个list,值为['0.jpg','9.jpg'],注意这个顺序并没有按照从小到大的顺序排列'''
img_list=os.listdir(img_path)
ind=0
width=256
height=256
for jpg_file in img_list:
    img = Image.open(os.path.join(img_path, jpg_file))
    try:
        new_img = img.resize((width, height), Image.BILINEAR)
        new_img.save(os.path.join(out_dir, os.path.basename(jpg_file)))
    except Exception as e:
        print(e)

将这段代码存到resize_pic.py中,然后运行

cd C:\Users\用户名\Documents\GitHub\pytorch-CycleGAN-and-pix2pix\datasets
python resize_pic.py

这时,你会得到一批具有同样大小的图片。

二、从原图提取边缘的过程

因为博主习惯用matlab,所以这里用matlab做图像边缘的提取。你们也可以自行搜索别的代码。
基于matlab的边缘提取方法的比较
根据这个文章和我们的实验所得结果,我们先选择canny算法提取边缘。
当然你也可以选择使用作者提供的方法,HED算法。
作者说:
We provide python and Matlab scripts to extract coarse edges from photos. Run scripts/edges/batch_hed.py to compute HED edges. Run scripts/edges/PostprocessHED.m to simplify edges with additional post-processing steps. Check the code documentation for more details.

三、图片的合并

在dataset里有两个python文件:make_dataset_aligned.py和combine_A_and_B.py。我们来观察make_dataset_aligned.py代码的结构
制作自己的适用于pix2pix的数据集(win)_第1张图片

再观察combine_A_and_B.py代码的结构
作者提供了一个python脚本,以成对图像{A,B}的形式生成pix2pix训练数据,其中A和B是同一基础场景的两个不同描述。例如,这些可能是成对的{label map,photo}或{bw image,color image}。然后,我们可以学习将A转换为B或将B转换为A:

创建文件夹/path/to/data,内包含两个子文件夹A和B。A和B应该每个人都有自己的子文件夹train,val,test等。在/path/to/data/A/train中放入A风格的图像。在/path/to/data/B/train中放入对应的B风格的图像。对另外几个文件夹重复相同的操作(val,test等)。

成对的{A,B}中的对应图像必须具有相同的大小并具有相同的文件名,例如,/path/to/data/A/train/1.jpg被认为与相对应/path/to/data/B/train/1.jpg。

以这种方式格式化数据后,调用:

python datasets/combine_A_and_B.py --fold_A C:/Users/67327/Documents/GitHub/pytorch-CycleGAN-and-pix2pix/datasets/cars_AB/A --fold_B C:/Users/67327/Documents/GitHub/pytorch-CycleGAN-and-pix2pix/datasets/cars_AB/B --fold_AB C:/Users/67327/Documents/GitHub/pytorch-CycleGAN-and-pix2pix/datasets/cars_AB

这会将每对图像(A,B)组合到一个图像文件中,准备进行训练。

报错

RuntimeError:
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.
    is not going to be frozen to produce an executable.''')
RuntimeError:
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.

查找原github项目的issue区的问题#203,发现这是一个win下的问题,只要把主要函数包到if name == ‘main’:中就行。
再次运行,问题解决。

四、命名的规范

进行了上面的步骤我们会发现,自己下载的数据集可能混入了一些不合适的图片。比如,我的Stanford cars数据集中,本来大部分图片都是彩色的,却混入了几张黑白的图片。包括训练集里的01085.jpg02176.jpg03048.jpg03439.jpg03469.jpg03539.jpg04577.jpg04848.jpg05177.jpg05502.jpg05713.jpg06947.jpg07383.jpg07693.jpg07774.jpg08137.jpg08144.jpg。和测试集里的00034.jpg00545.jpg00726.jpg01569.jpg01917.jpg02408.jpg03216.jpg03246.jpg04006.jpg04209.jpg04288.jpg04316.jpg04858.jpg05635.jpg06912.jpg07043.jpg。这些图片就只好把他们删除了。但是删除就会产生一个问题,就是我的图片序号不连续了。那怎么办呢。只能是删除了之后,再把图片们重新编号,然后再对应着重新产生一遍边缘图,这样A图和B图的名称也会自动对齐,这是比较暴力也不用脑子的想法。(其实run的时间也在接受范围内)修改方式如下。

改为顺序数字当然,也可以不改名字,不会影响训练。但是如果之后别人要用你的数据集的话,可能会引起困惑就是了。

总结

这一章我们制作了属于自己的训练集。然后运行

python -m visdom.server

python train.py --dataroot ./datasets/cars_AB --name edges2shoes --model pix2pix --direction AtoB --gpu_ids -1 --continue_train --epoch 90 --epoch_count 91

就可以开始训练了

python test.py --dataroot ./datasets/cars_AB --direction AtoB --model pix2pix --name edges2shoes --gpu_ids -1

这样子测试

你可能感兴趣的:(人工智能,python,深度学习,windows,10)