File size: 3,749 Bytes
01d44a2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import pandas as pd
import numpy as np
from torchvision import datasets
import pathlib
import splitfolders
from torchvision.transforms import transforms
import torchvision
import matplotlib.pyplot as plt
import torch
from torch.utils.data import DataLoader
from torch.utils import data
import copy

def load_data(dataset_directory):
    dataset_directory = pathlib.Path(dataset_directory)
    splitfolders.ratio(dataset_directory, output = 'brain', seed = 20,ratio = (0.9,0.05,0.05))

def make_transformations(dataset_directory):
    dataset_directory = pathlib.Path(dataset_directory)
    
    train_formations = transforms.Compose(
        [
         transforms.Resize((256,256)),
         transforms.RandomVerticalFlip(p = 0.5),
         transforms.RandomHorizontalFlip(p = 0.5),
         transforms.RandomRotation(30),
         transforms.ToTensor(),
         
        ]
    )
    
    train_set = torchvision.datasets.ImageFolder(dataset_directory.joinpath('train'), transform=train_formations)
    train_set.transform
    
    test_set = torchvision.datasets.ImageFolder(dataset_directory.joinpath('val'),transform=train_formations)
    test_set.transform
    datasets = [train_set,test_set]
    return train_set, test_set

def luismi_transformations(dataset_directory):
    dataset_directory = pathlib.Path(dataset_directory)
    
    train_formations_final = transforms.Compose(
        [
         transforms.Resize((256,256)),
         transforms.RandomVerticalFlip(p = 0.5),
         transforms.RandomHorizontalFlip(p = 0.5),
         transforms.RandomRotation(30),
         transforms.ToTensor(),
         transforms.Normalize(mean = [0.2451,0.2453, 0.2454], std =[0.2259,0.2259,0.2260])
        ]
    )
    train_set = torchvision.datasets.ImageFolder(dataset_directory.joinpath('train'), transform=train_formations_final)


    test_transformations = transforms.Compose([
        transforms.Resize((256,256)),
        transforms.ToTensor(),
        transforms.Normalize(mean = [0.2451,0.2453, 0.2454], std =[0.2259,0.2259,0.2260])
    ])

    test_set = torchvision.datasets.ImageFolder(dataset_directory.joinpath('test'),transform=test_transformations)

    dev_set = torchvision.datasets.ImageFolder(dataset_directory.joinpath('val'), transform=test_transformations)
    
    return train_set, test_set, dev_set

def compute_mean_std(train_set):
    loader = DataLoader(train_set, batch_size=64, shuffle=False)
    mean = 0
    std = 0
    total_images = 0
    
    for images,_ in loader:
        images = images.view(images.size(0), images.size(1), -1)
        mean += images.mean(2).sum(0)
        std += images.std(2).sum(0)
        total_images += images.size(0)
    mean /= total_images
    std /= total_images
    return mean,std

def data_visualization(train_set, test_set, cols,rows):
    
    labels_dict = {
        0: 'Brain Tumor',
        1: 'Healthy'
    }
    fig = plt.figure(figsize=(12,8))
    for i in range(1,cols*rows + 1):
        data_index = torch.randint(0, len(train_set), size=(1,)).item()
        img,label = train_set[data_index]
        fig.add_subplot(rows,cols, i)
        plt.title(labels_dict[label])
        img_np = img.numpy().transpose(1,2,0)
        img_valid_range = np.clip(img_np,0,1)
        plt.imshow(img_valid_range)
        plt.suptitle('Brain images' , y = 0.95)
    plt.show()


def data_loaders(train_set,test_set,dev_set):
    train_load = DataLoader(train_set, batch_size=64, shuffle=True)
    test_load = DataLoader(test_set, batch_size=64, shuffle=True)
    dev_load = DataLoader(dev_set, batch_size=64, shuffle=True)
    return train_load, test_load, dev_load