Beispiel #1
0
def main():
    # Define network
    net = Net()
    print(net)

    data_transform = transforms.Compose(
        [Rescale(250), Normalize(), RandomCrop(224)])

    train_dataset = FacialKeypointsDataset(
        csv_file='data/training_frames_keypoints.csv',
        root_dir='data/training/',
        transform=data_transform)

    # iterate through the transformed dataset and print some stats about the first few samples
    for i in range(4):
        sample = train_dataset[i]
        print(i, sample['image'].size, sample['keypoints'].size)

    train_loader = DataLoader(train_dataset,
                              batch_size=10,
                              shuffle=True,
                              num_workers=4)

    test_dataset = FacialKeypointsDataset(
        csv_file='data/test_frames_keypoints.csv',
        root_dir='data/test/',
        transform=data_transform)

    test_loader = DataLoader(test_dataset,
                             batch_size=1,
                             shuffle=True,
                             num_workers=4)

    test_images, test_outputs, gt_pts = net_sample_output(net, test_loader)

    # print out the dimensions of the data to see if they make sense
    print(test_images.data.size())
    print(test_outputs.data.size())
    print(gt_pts.size())

    # call it
    visualize_output(test_images, test_outputs, gt_pts, 1)

    criterion = nn.MSELoss()
    optimizer = optim.Adam(net.parameters(),
                           lr=0.001,
                           betas=(0.9, 0.999),
                           eps=1e-8)

    n_epochs = 2

    train_net(net, criterion, optimizer, train_loader, n_epochs)

    # get a sample of test data again
    test_images, test_outputs, gt_pts = net_sample_output(net, test_loader)

    print(test_images.data.size())
    print(test_outputs.data.size())
    print(gt_pts.size())

    model_dir = 'saved_models/'
    model_name = 'keypoints_model_1.pt'

    # after training, save your model parameters in the dir 'saved_models'
    torch.save(net.state_dict(), model_dir + model_name)

    weights1 = net.conv1.weight.data

    w = weights1.numpy()

    filter_index = 0

    print(w[filter_index][0])
    print(w[filter_index][0].shape)

    # display the filter weights
    plt.imshow(w[filter_index][0], cmap='gray')
Beispiel #2
0
from torchvision import transforms, utils
from torch.utils.data import Dataset, DataLoader
from models import Net
import torch.nn.functional as F
import torch.nn as nn
import torch
import torchsnooper
import matplotlib.pyplot as plt
import numpy as np

device = torch.device('cuda')
net = Net()

data_transform = transforms.Compose(
    [Rescale(256),
     RandomCrop(224),
     Normalize(),
     ToTensor()]
)

train_dataset = FacialKeypointsDataset(
    "./data/training_frames_keypoints.csv",
    "./data/training",
    data_transform
)

test_dataset = FacialKeypointsDataset(
    "./data/test_frames_keypoints.csv",
    "./data/test",
    data_transform
)
Beispiel #3
0
            running_loss += loss.item()
            if batch_i % 10 == 9:  # print every 10 batches
                print('Epoch: {}, Batch: {}, Avg. Loss: {}'.format(
                    epoch + 1, batch_i + 1, running_loss / 10))
                running_loss = 0.0

    print('Finished Training')


if __name__ == "__main__":

    net = Net()
    # print(net)

    data_transform = transforms.Compose(
        [Rescale(225), RandomCrop(224),
         Normalize(), ToTensor()])

    # create the transformed dataset
    transformed_dataset = FacialKeypointsDataset(
        csv_file='data/training_frames_keypoints.csv',
        root_dir='data/training/',
        transform=data_transform)

    print('Number of images: ', len(transformed_dataset))

    # iterate through the transformed dataset and print some stats about the first few samples
    for i in range(4):
        sample = transformed_dataset[i]
        print(i, sample['image'].size(), sample['keypoints'].size())
# In[24]:

from torch.utils.data import Dataset, DataLoader
from torchvision import transforms, utils

# the dataset we created in Notebook 1 is copied in the helper file `data_load.py`
from data_load import FacialKeypointsDataset
# the transforms we defined in Notebook 1 are ien the helper file `data_load.py`
from data_load import Rescale, RandomCrop, Normalize, ToTensor

## define the data_transform using transforms.Compose([all tx's, . , .])
# order matters! i.e. rescaling should come before a smaller crop
data_transform = None
rescale = Rescale(100)
crop = RandomCrop(50)
data_transform = transforms.Compose(
    [Rescale(250), RandomCrop(224),
     Normalize(), ToTensor()])
# testing that you've defined a transform
assert (data_transform is not None), 'Define a data_transform'

# In[25]:

# create the transformed dataset
transformed_dataset = FacialKeypointsDataset(
    csv_file='/data/training_frames_keypoints.csv',
    root_dir='/data/training/',
    transform=data_transform)

print('Number of images: ', len(transformed_dataset))
Beispiel #5
0
def run_epochs(config, checkpoint_path):
    print("CUDA is available: {}".format(torch.cuda.is_available()))

    # Define data loader: data preprocessing and augmentation
    # I use same procedures for all models that consumes imagenet-2012 dataset for simplicity
    imagenet_train_transform = transforms.Compose([
        Rescale(256),
        RandomHorizontalFlip(0.5),
        RandomCrop(224),
        ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0),
        ToTensor(),
        # https://github.com/pytorch/examples/blob/master/imagenet/main.py#L195
        # this is pre-calculated mean and std of imagenet dataset
        Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
    ])

    imagenet_val_transform = transforms.Compose([
        Rescale(256),
        CenterCrop(224),
        ToTensor(),
        Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
    ])

    train_loader = initialize_train_loader(imagenet_train_transform, config)
    val_loader = initialize_val_loader(imagenet_val_transform, config)

    # Define the neural network.
    Model = config.get('model')
    model_params = config.get('model_params')
    if model_params is not None:
        net = Model(**model_params)
    else:
        net = Model()

    # transfer variables to GPU if present
    net.to(device=device)

    # Print the network structure given 3x32x32 input
    # need to put this before DataParallel to avoid "Expected more than 1 value per channel when training" error
    # https://github.com/pytorch/pytorch/issues/4534
    summary(net, (3, 224, 224))

    # Wrap it with DataParallel to train with multiple GPUs
    if torch.cuda.device_count() > 1:
        print("Using", torch.cuda.device_count(), "GPUs!")
        net = nn.DataParallel(net)

    # Define the loss function. CrossEntrophyLoss is the most common one for classification task.
    criterion = nn.CrossEntropyLoss()

    # Define the optimizer
    Optim = config.get('optimizer')
    optimizer = Optim(
        net.parameters(),
        **config.get('optimizer_params'),
    )

    # Define the scheduler
    Sched = config.get('scheduler')
    scheduler = Sched(
        optimizer,
        **config.get('scheduler_params'),
    )

    loggers = initialize_loggers()

    model_id = time.strftime("%Y-%m-%dT%H:%M:%S", time.localtime())
    model_name = config.get('name')

    start_epoch = 1

    if checkpoint_path is not None:
        net, optimizer, scheduler, loggers, start_epoch = load_checkpoint(
            checkpoint_path,
            net,
            optimizer,
            scheduler,
            loggers,
        )

    validate(val_loader, net, criterion, 0, loggers)

    for epoch in range(start_epoch, config.get('total_epochs') + 1):

        train(
            train_loader,
            net,
            criterion,
            optimizer,
            epoch,
            loggers,
        )

        val_loss, top1_acc, top5_acc = validate(
            val_loader,
            net,
            criterion,
            epoch,
            loggers,
        )

        # for ReduceLROnPlateau scheduler, we need to use top1_acc as metric
        if isinstance(scheduler, optim.lr_scheduler.ReduceLROnPlateau):
            scheduler.step(top1_acc)
        else:
            scheduler.step()

        checkpoint_file = '{}-{}-epoch-{}.pt'.format(
            model_name,
            model_id,
            epoch,
        )
        torch.save(
            {
                'epoch': epoch,
                'model': net.state_dict(),
                'optimizer': optimizer.state_dict(),
                'scheduler': scheduler.state_dict(),
                'loggers': loggers,
            }, model_dir + checkpoint_file)
Beispiel #6
0
# As a note, should you want to perform data augmentation (which is optional in this project), and randomly rotate or shift these images, a square image size will be useful; rotating a 224x224 image by 90 degrees will result in the same shape of output.

# In[4]:

from torch.utils.data import Dataset, DataLoader
from torchvision import transforms, utils

# the dataset we created in Notebook 1 is copied in the helper file `data_load.py`
from data_load import FacialKeypointsDataset
# the transforms we defined in Notebook 1 are in the helper file `data_load.py`
from data_load import Rescale, RandomCrop, Normalize, ToTensor

## TODO: define the data_transform using transforms.Compose([all tx's, . , .])
# order matters! i.e. rescaling should come before a smaller crop
data_transform = transforms.Compose(
    [Rescale(250), RandomCrop(224),
     Normalize(), ToTensor()])

# testing that you've defined a transform
assert (data_transform is not None), 'Define a data_transform'

# In[5]:

# create the transformed dataset
transformed_dataset = FacialKeypointsDataset(
    csv_file='/data/training_frames_keypoints.csv',
    root_dir='/data/training/',
    transform=data_transform)

print('Number of images: ', len(transformed_dataset))
net = Net().to(device)
print(net)

from torch.utils.data import Dataset, DataLoader
from torchvision import transforms, utils

# the dataset we created in Notebook 1 is copied in the helper file `data_load.py`
#from data_load import FacialKeypointsDataset
# the transforms we defined in Notebook 1 are in the helper file `data_load.py`
from data_load import Rescale, RandomCrop, Normalize, ToTensor

## TODO: define the data_transform using transforms.Compose([all tx's, . , .])
# order matters! i.e. rescaling should come before a smaller crop
data_transform = transforms.Compose(
    [Rescale(250), RandomCrop(200),
     Normalize(), ToTensor()])

# testing that you've defined a transform
assert (data_transform is not None), 'Define a data_transform'

# create the transformed dataset
transformed_dataset = FacialKeypointsDataset(
    csv_file='./data/training_frames_keypoints.csv',
    root_dir='./data/training/',
    transform=data_transform)

print('Number of images: ', len(transformed_dataset))

# iterate through the transformed dataset and print some stats about the first few samples
for i in range(4):
# In[133]:


from torch.utils.data import Dataset, DataLoader
from torchvision import transforms, utils

# the dataset we created in Notebook 1 is copied in the helper file `data_load.py`
from data_load import FacialKeypointsDataset
# the transforms we defined in Notebook 1 are in the helper file `data_load.py`
from data_load import Rescale, RandomCrop, Normalize, ToTensor

crop = 224

data_transform = transforms.Compose([Rescale(250),
                                    RandomCrop(crop),
                                    Normalize(crop),
                                    ToTensor()])

# testing that you've defined a transform
assert(data_transform is not None), 'Define a data_transform'


# In[134]:


# create the transformed dataset
transformed_dataset = FacialKeypointsDataset(csv_file='training_frames_keypoints.csv',
                                             root_dir='/home/tianbai/P1_Facial_Keypoints/data/training/',
                                             transform=data_transform)