# from bbox_loss import MultiboxLoss
from PIL import Image, ImageDraw
# import torchvision.transforms as transforms
import os
import matplotlib.pyplot as plt
import matplotlib.patches as patches

use_gpu = True
img_dir = '../cityscapes_samples/'
label_dir = '../cityscapes_samples_labels/'
learning_rate = 0.001
max_epochs = 20

test_list = get_list(img_dir, label_dir)
# test_list = test_list[0:-20]
test_dataset = csd.CityScapeDataset(test_list, train=False, show=False)
test_data_loader = torch.utils.data.DataLoader(test_dataset,
                                               batch_size=16,
                                               shuffle=False,
                                               num_workers=0)
print('test items:', len(test_dataset))

file_name = 'SSD'
test_net_state = torch.load(os.path.join('.', file_name + '.pth'))

net = SSD(3)
if use_gpu:
    net = net.cuda()
net.load_state_dict(test_net_state)
itr = 0
Example #2
0
import numpy as np
import matplotlib.patches as patches
from matplotlib import pyplot as plt
import torch.nn

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

test_model = torch.load('trained_model/ssd_net_1017.pth')
test_model.to('cuda:0')
test_model.eval()

test_img_dir_list = pd.read_csv('train_img_dir_list.csv').iloc[:, 1].tolist()
test_json_dir_list = pd.read_csv('train_json_dir_list.csv').iloc[:, 1].tolist()

test_dataset = cityscape_dataset.CityScapeDataset(test_img_dir_list,
                                                  test_json_dir_list,
                                                  mode='eval',
                                                  transform=None)

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

for batch_idx, (img, bbox, label, priors) in enumerate(test_loader):
    # print(batch_idx)
    inputs = img.float().to(device)
    pred_conf, pred_locs = test_model.forward(inputs)
    # print(pred_conf)
    # softmax = torch.nn.LogSoftmax(dim = 2)
    # pred_conf = softmax(pred_conf)
    for i in range(pred_locs.shape[0]):
from ssd_net import SSD
from bbox_loss import MultiboxLoss
import torch.optim as optim
import torch
import pandas as pd
import os
import copy

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
train_img_dir_list = pd.read_csv('train_img_dir_list.csv').iloc[:, 1].tolist()
train_json_dir_list = pd.read_csv('train_json_dir_list.csv').iloc[:,
                                                                  1].tolist()
val_img_dir_list = pd.read_csv('val_img_dir_list.csv').iloc[:, 1].tolist()
val_json_dir_list = pd.read_csv('val_json_dir_list.csv').iloc[:, 1].tolist()
train_dataset = cityscape_dataset.CityScapeDataset(train_img_dir_list,
                                                   train_json_dir_list,
                                                   transform=None,
                                                   mode="train")
val_dataset = cityscape_dataset.CityScapeDataset(val_img_dir_list,
                                                 val_json_dir_list,
                                                 transform=None,
                                                 mode="eval")
train_loader = DataLoader(train_dataset,
                          batch_size=128,
                          shuffle=True,
                          num_workers=4)
val_loader = DataLoader(val_dataset,
                        batch_size=128,
                        shuffle=True,
                        num_workers=4)

Example #4
0
from bbox_loss import MultiboxLoss
from PIL import Image, ImageDraw
import torchvision.transforms as transforms
import os

use_gpu = True
img_dir = '../cityscapes_samples/'
label_dir = '../cityscapes_samples_labels/'
learning_rate = 0.001
max_epochs = 200

train_list = get_list(img_dir, label_dir)
# print('list',train_list)
# valid_list = train_list[-20: ]
# train_list = train_list[0:-20]
train_dataset = csd.CityScapeDataset(train_list, train=True, show=False)
train_data_loader = torch.utils.data.DataLoader(train_dataset,
                                                batch_size=32,
                                                shuffle=True,
                                                num_workers=0)
# print('train items:', len(train_dataset))

idx, (bbox, label, img) = next(enumerate(train_data_loader))

# valid_dataset = csd.CityScapeDataset(train_list, False, False)
# valid_data_loader = torch.utils.data.DataLoader(valid_dataset,
#                                                 batch_size=4,
#                                                 shuffle=False,
#                                                  num_workers=0)
# print('validation items:', len(valid_dataset))
Example #5
0
class Training():
    # Set default tenosr type, 'torch.cuda.FloatTensor' is the GPU based FloatTensor
    torch.set_default_tensor_type('torch.cuda.FloatTensor')

    current_directory = os.getcwd()  # current working directory
    training_ratio = 0.8

    if __name__ == '__main__':
        poly_init_fol_name = "cityscapes_samples_labels"
        init_img_path = "cityscapes_samples"

        compl_poly_path = os.path.join(current_directory, poly_init_fol_name,
                                       "*", "*_polygons.json")

        polygon_folder = glob(compl_poly_path)

        polygon_folder = np.array(polygon_folder)

        img_label_list = []

        for file in polygon_folder:
            with open(file, "r") as f:
                frame_info = json.load(f)
                obj_length = len(frame_info['objects'])
                file_path = file
                image_name = file_path.split("/")[-1][:-23]
                for i in range(obj_length):
                    label = frame_info['objects'][i]['label']
                    if label == "ego vehicle":
                        break
                    polygon = np.array(frame_info['objects'][i]['polygon'],
                                       dtype=np.float32)
                    left_top = np.min(polygon, axis=0)
                    right_bottom = np.max(polygon, axis=0)
                    concat = np.concatenate((left_top, right_bottom))
                    img_label_list.append({
                        'image_name': image_name,
                        'file_path': file_path,
                        'label': label,
                        'bbox': concat
                    })

        label_length = len(img_label_list)

        # get images list

        img_path = os.path.join(init_img_path, "*", "*")

        images = glob(img_path)

        images = np.array(images)

        train_datalist = []
        for i in range(0, len(images)):
            img_folder = images[i].split('/')[-2]
            img_name = images[i].split('/')[-1]
            img_class = img_name[:-16]
            image_path = os.path.join(init_img_path, img_folder, img_name)
            #print(image_path)
            bound_boxes = []
            labels = []
            for i in range(label_length):
                if img_label_list[i]["image_name"] == img_class:
                    bbox = img_label_list[i]['bbox']
                    bound_boxes.append(bbox)
                    if img_label_list[i]['label'] in ('car', 'cargroup'):
                        label = 1
                    elif img_label_list[i]['label'] in ('person',
                                                        'persongroup'):
                        label = 2
                    elif img_label_list[i]['label'] == 'traffic sign':
                        label = 3
                    else:
                        label = 0
                    labels.append(label)
            train_datalist.append({
                'image_path': image_path.rstrip(),
                'labels': labels,
                'bound_boxes': bound_boxes
            })

        random.shuffle(train_datalist)
        #print(train_datalist)
        n_train_sets = 0.8 * len(train_datalist)

        train_sets = train_datalist[:int(n_train_sets)]

        im = np.array(Image.open(train_sets[1]['image_path']), dtype=np.uint8)

        # Create figure and axes
        fig, ax = plt.subplots(1)

        # Display the image
        ax.imshow(im)

        # Create a Rectangle patch
        for i in range(0, len(train_sets[1]['labels'])):
            if train_sets[1]['labels'][i] != 0:
                rect = patches.Rectangle((train_sets[1]['bound_boxes'][i][0],
                                          train_sets[1]['bound_boxes'][i][1]),
                                         train_sets[1]['bound_boxes'][i][2],
                                         train_sets[1]['bound_boxes'][i][3],
                                         linewidth=1,
                                         edgecolor='r',
                                         facecolor='none')

        # Add the patch to the Axes
        ax.add_patch(rect)

        plt.show()

        train_dataset = cityscape_dataset.CityScapeDataset(train_sets)
        train_data_loader: object = torch.utils.data.DataLoader(train_dataset,
                                                                batch_size=20,
                                                                shuffle=True,
                                                                num_workers=0)
        print('Total training items', len(train_dataset),
              ', Total training mini-batches in one epoch:',
              len(train_data_loader))

        n_valid_sets = 0.2 * len(train_datalist)
        valid_sets = train_datalist[int(n_train_sets):int(n_train_sets +
                                                          n_valid_sets)]

        valid_set = cityscape_dataset.CityScapeDataset(valid_sets)
        valid_data_loader = torch.utils.data.DataLoader(valid_set,
                                                        batch_size=20,
                                                        shuffle=True,
                                                        num_workers=0)
        print('Total validation set:', len(valid_set),
              ', Total training mini-batches in one epoch:',
              len(valid_data_loader))

        ssd = ssd_net.SSD().cuda()
        #print(ssd)

        criterion = bbox_loss.MultiboxLoss((0.1, 0.2))

        optimizer = torch.optim.Adam(ssd.classifier.parameters(), lr=0.01)

        train_losses = []

        max_epochs = 1
        itr = 0
        #print(train_data_loader)
        for epoch_idx in range(0, max_epochs):
            for img_tensor, train_input, train_label in train_data_loader:

                itr += 1

                # Set the network works in GPU
                device = torch.device(
                    "cuda:0" if torch.cuda.is_available() else "cpu")
                ssd = ssd.to(device)
                # print(device)
                for img, features, targets in train_data_loader:
                    features = features.to(device)
                    targets = targets.to(device)

                # switch to train model
                ssd.train()

                # zero the parameter gradients
                optimizer.zero_grad()

                # Forward

                train_input = Variable(img_tensor.cuda(
                ))  # use Variable(*) to allow gradient flow
                #print(train_input.dim())
                confidence, train_out = ssd.forward(
                    train_input)  # forward once
                #print(train_out)
                # compute loss
                train_label = Variable(train_label.cuda().float())
                loss = criterion.forward(confidence, train_out, train_label,
                                         train_input)

                # do the backward and compute gradients
                loss.backward()
                #
                # update the parameters with SGD
                optimizer.step()

                train_losses.append((itr, loss.item()))

                if itr % 200 == 0:
                    print('Epoch: %d Itr: %d Loss: %f' %
                          (epoch_idx, itr, loss.item()))

        train_losses = np.asarray(train_losses)