Top

CIFAR10 이미지 덤프

CIFAR는 인기 있는 3채널 컬러 이미지로 $32 \times 32$ 크기에 10개의 클래스를 제공 합니다. 모델이 이미지를 제대로 생성하나 확인을 위해 덤프하였습니다.

1. planes

2. cars

3. birds

4. kitties

5. Deers

6. Puppies

7. Frogs

8. Horses

9. Ships

10. Trucks

Pytroch

CIFAR10 이미지를 덤프하는 Pytorch 소스코드는 다음과 같습니다.

import os
import numpy as np
import math

import torch

from torchvision import datasets
from torch.utils.data import DataLoader
from torchvision.utils import save_image


__all__ = ['saveimages']


def savefile(label, data, shape, number, out_dir, n_row=30):
    save = np.array([], np.float)
    save = np.reshape(save, (0, shape[0], shape[1], shape[2]))
    save = np.insert(save, 0, data, 0)
    print("save label ", label, save.shape)
    save = torch.from_numpy(save)
    fname = '%s/%d_%d.png' % (out_dir, label, number)
    save_image(save, fname, nrow=n_row, normalize=True)


def saveimages(dataloaders, n_classes, out_dir, file_qty, n_row=30):

    os.makedirs(out_dir, exist_ok=True)

    datas = [[] for _ in range(n_classes)]

    number = 0
    for dataloader in dataloaders:
        for image, label in dataloader:
            image = image.numpy()
            image = np.reshape(image, (image.shape[1], image.shape[2], image.shape[3]))
            data = datas[label]
            data.append(image)
            if file_qty <= len(data):
                savefile(label, data, image.shape, number, out_dir, n_row)
                number += 1
                data.clear()

    for label, data in enumerate(datas):
        if 1 <= len(data):
            savefile(label, data, image.shape, number, out_dir, n_row)
            number += 1
            data.clear()

import argparse
import datetime as dt
import os
import numpy as np
import math

import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.autograd import Variable

import torchvision.transforms as transforms
from torchvision import datasets
from torch.utils.data import DataLoader

from deepmodel.commonpy import filename as cmfn
from deepmodel.commonpy import imageio as imio
import deepmodel.torchmodel as tmodel


def parseargs(datetime):
    parser = argparse.ArgumentParser()
    parser.add_argument('--image_size', type=int, default=32, help='Size of each image dimension')
    parser.add_argument('--channels', type=int, default=3, help='Number of image channels')
    parser.add_argument('--n_classes', type=int, default=10, help='Number of classes for dataset')
    parser.add_argument('--image-quantity', type=int, default=10, help='Number of image per file')
    parser.add_argument('--data-dir', type=str, default=cmfn.datadir(__file__), help='Data cache directory')
    parser.add_argument('--out-dir', type=str, default=cmfn.outputdir(__file__, datetime), help='Out directory for image samples')
    parser.add_argument('--n_row', type=int, default=50, help='Number of rows of a image')
    parser.add_argument('--file_qty', type=int, default=1000, help='Number of images per a file')
    return parser.parse_args()


def main():
    now = dt.datetime.now()
    opt = parseargs(now)
    devtype = tmodel.DeviceType('cpu')

    trainloader = tmodel.cifar10_train_loader(devtype, opt.data_dir, opt.image_size, 1, (0.5, 0.5, 0.5), (0.5, 0.5, 0.5), shuffle=False)
    testloader = tmodel.cifar10_test_loader(devtype, opt.data_dir, opt.image_size, 1, (0.5, 0.5, 0.5), (0.5, 0.5, 0.5), shuffle=False)

    imio.saveimages([trainloader, testloader], opt.n_classes, opt.out_dir, opt.file_qty, n_row=opt.n_row)


if __name__ == "__main__":
    main()