How can I load a number of images?

Hi. i’m a novice in pytorch.

I really want to train cat&dog images with CNN

But it isn’t do well…

I think, my image loading mothod is not good.

def imlist(fpath):
    flist = os.listdir(fpath)
    return flist

def traindata(impath,flist):
    train = []
    length = len(flist)
    for i in range(length):
        path = impath + flist[i]
        im = pilimg.open(path)
        im = im.resize((32,32))
        im = np.array(im)
        im = np.reshape(im,(1,3,32,32))
        im = torch.FloatTensor(im)
        if 'dog' in flist[i]:
            train.append((im,torch.LongTensor([1])))
        if 'cat' in flist[i]:
            train.append((im,torch.LongTensor([0])))
    return train

fpath is a folder path which has train images and function imlist return a list which has file name of train image.

  1. How can I load images???

  2. and How can I resize images to use cnn ??

  3. Does torch cnn use image format [batch size, channel size, img size, img size]?

help me ! .

Thank you.

@Hwanil

You can load images using the following code:

traindir = os.path.join(args.data, 'train')
valdir = os.path.join(args.data, 'val')
testdir = os.path.join(args.data, 'test')
normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
train_loader = data.DataLoader(
    datasets.ImageFolder(traindir,
                         transforms.Compose([
                             transforms.RandomSizedCrop(224),
                             transforms.RandomHorizontalFlip(),
                             transforms.ToTensor(),
                             normalize,
                         ])),
    batch_size=args.batch_size,
    shuffle=True,
    num_workers=args.workers,
    pin_memory=True)

val_loader = data.DataLoader(
    datasets.ImageFolder(valdir,
                         transforms.Compose([
                             transforms.Scale(256),
                             transforms.CenterCrop(224),
                             transforms.ToTensor(),
                             normalize,
                         ])),
    batch_size=args.batch_size,
    shuffle=True,
    num_workers=args.workers,
    pin_memory=True)

test_loader = data.DataLoader(
    TestImageFolder(testdir,
                    transforms.Compose([
                        transforms.Scale(256),
                        transforms.CenterCrop(224),
                        transforms.ToTensor(),
                        normalize,
                    ])),
    batch_size=1,
    shuffle=False,
    num_workers=1,

pin_memory=False)

1 Like

Thank you for your help :slight_smile:

I’ll try it.

I have a question .

normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
is This parameter(mean) always same value? or just do ?

This values are tested for ImageNet dataset which are RGB images. SO you can use this values.

1 Like

Thank you very much !

This is a very good example for starting. you can see this example.

1 Like

Oh, I’ll try it .

Thank you ~

Bit late, but here’s some code I just did for pytorch 4.1

def load_dataset():
    data_path = 'data/train/'
    train_dataset = torchvision.datasets.ImageFolder(
        root=data_path,
        transform=torchvision.transforms.ToTensor()
    )
    train_loader = torch.utils.data.DataLoader(
        train_dataset,
        batch_size=64,
        num_workers=0,
        shuffle=True
    )
    return train_loader

for batch_idx, (data, target) in enumerate(load_dataset()):
    #train network