Ejemplo n.º 1
0
def compare():
    date_time_now = str(datetime.datetime.now()).replace(" ", "_").replace(
        ":", "_")
    compare_path = f"../5Compare/individual_train/{date_time_now}/"
    if not os.path.exists(compare_path):
        os.makedirs(compare_path)
    config_name = "exp_config.p"
    conf_list = np.arange(start=0.1, stop=0.95, step=0.025)
    seed_range = range(420, 425)
    classes = load_classes('../4Others/color_ball.names')
    cfg_path = "../4Others/color_ball.cfg"
    blocks = parse_cfg(cfg_path)
    model = yolo_v3(blocks)
    model.load_weights("../4Weights/yolov3.weights", cust_train_zero=True)
    with open(compare_path + config_name, "wb") as fp:
        pickle.dump(model.net, fp, protocol=pickle.HIGHEST_PROTOCOL)
    time_taken_df = pd.DataFrame(columns=list(seed_range))
    for cls_index, cls in enumerate(classes):
        to_path = f"../{cls}/"
        for index, seed in enumerate(seed_range):
            model.load_weights("../4Weights/yolov3.weights",
                               cust_train_zero=True)
            x_start = time.time()
            random.seed(seed)
            if not os.path.exists(to_path):
                os.makedirs(to_path)
            sub_name = f"{cls}_seed_{seed}_"
            name_list = ["img_name", "c", "gx", "gy", "gw", "gh"]
            # Original label names
            label_csv_mame = '../color_balls/label.csv'
            img_txt_path = "../color_balls/*.txt"
            prep_labels(img_txt_path, name_list, label_csv_mame)
            # sub sampled label names
            sub_sample_csv_name = to_path + "label.csv"
            sub_sample_txt_path = to_path + "*.txt"
            prep_labels(sub_sample_txt_path, name_list, sub_sample_csv_name)
            # label_csv_mame = '../1TestData/label.csv'
            # img_txt_path = "../1TestData/*.txt"
            move_images(label_name=label_csv_mame,
                        to_path=to_path,
                        action_fn=action_fn,
                        cat_nums=[cls_index])
            best_map, best_ap, best_conf, specific_conf_map, specific_conf_ap,\
                map_frame = main(model,
                                 classes, conf_list,
                                 sub_sample_csv_name,
                                 sub_sample_txt_path,
                                 to_path,
                                 cuda=True,
                                 specific_conf=0.5,
                                 sub_name=sub_name,
                                 selected_cls=[str(x) for x in [cls_index]])

            map_frame.to_csv(f"{compare_path+sub_name}.csv", index=True)
            shutil.rmtree(to_path)
            time_taken_df.loc[cls, seed] = time.time() - x_start
            # if you change the csv_name, pls change accordingly in the
            # visualization part
            time_taken_df.to_csv(compare_path + 'time_taken.csv', index=True)
Ejemplo n.º 2
0
def test_loaders():
    label_csv_mame = '../1TestData/label.csv'
    name_list = ["img_name", "c", "gx", "gy", "gw", "gh"]
    test_img_txt_path = "../1TestData/*.txt"
    prep_labels(test_img_txt_path, name_list, label_csv_mame)
    logging.basicConfig(level=logging.DEBUG,
                        format="[%(asctime)s %(filename)s] %(message)s")

    # training transformation
    pre_trans = RandomCrop(jitter=0.25,
                           inp_dim=480)
    train_transform = transforms.Compose(
            [transforms.ColorJitter(
                                    brightness=0.25,
                                    saturation=0.25
                                    ),
             transforms.ToTensor()
             ])
    test_pre_trans = OfssetLabels(resize=True, input_dim=480)
    test_transform = transforms.Compose(
               [ImgToTensorCv()])
    train_data = CustData('../1TrainData/label.csv',
                          pre_trans=pre_trans,
                          transform=train_transform)
#    test_data = CustData(test_label_csv_mame,
#                         transform=test_transform)
    test_data = CustDataCV('../1TestData/label.csv',
                           pre_trans=test_pre_trans,
                           transform=test_transform)
    train_loader = DataLoader(train_data, shuffle=False,
                              batch_size=2,
                              collate_fn=my_collate,
                              num_workers=0,
                              worker_init_fn=worker_init_fn)
    test_loader = DataLoader(test_data, shuffle=False,
                             batch_size=4,
                             collate_fn=my_collate,
                             num_workers=0,
                             worker_init_fn=worker_init_fn)

#    print("running train loader")
#    for step, samples in enumerate(train_loader):
#        if step < 200:
#            images, labels = samples["image"], samples["label"]
#            for img, label in zip(images, labels):
#                img = img.permute(1, 2, 0).contiguous().numpy()
#                draw_boxes(img, label)
#        else:
#            break

    print("running test loader")
    for step, samples in enumerate(test_loader):
        if step < 2:
            images, labels = samples["image"], samples["label"]
            for img, label in zip(images, labels):
                img = img.permute(1, 2, 0).contiguous().numpy()
                draw_boxes(img, label)
        else:
            break
Ejemplo n.º 3
0
def cross_validation():
    config = {'label_csv_mame': '../2CvTrain/label.csv',
              'test_label_csv_mame': '../1TestData/label.csv',
              'test_img_txt_path': "../1TestData/*.txt",
              'valid_label_csv_mame': '../2CvValid/label.csv',
              'valid_img_txt_path': "../2CvValid/*.txt",
              # label csv column names
              'name_list': ["img_name", "c", "gx", "gy", "gw", "gh"],
              'cfg_path': "../4Others/yolo.cfg",
              'params_dir': '../4Others/params.txt'}
    # entire trainin label
    prep_label_config = {'label_csv_mame': '../1TrainData/label.csv',
                         'img_txt_path': "../1TrainData/*.txt",
                         'name_list': config['name_list']}
    # cv train label
    cv_train_label_config = {'label_csv_mame': config['label_csv_mame'],
                             'img_txt_path': "../2CvTrain/*.txt",
                             'name_list': config['name_list']}

    torch.backends.cudnn.enabled = False
    torch.backends.cudnn.benchmark = False
    # you can specify any tuning hyper-parammeters here , but do not use
    # np.arrange() as it will result an error for json.dumps()
    tune_params = {'seed': list(range(1, 5)),
                   'batch_size': list(range(2, 7, 2)),
                   'height': [416, 448]
                   }
    index, values = zip(*tune_params.items())
    experiments_params = [dict(zip(index, v)) for v in it.product(*values)]

    # prepare label for the entire training set
    prep_labels(**prep_label_config)
    cv_results_list = []
    for experiment_params in experiments_params:
        cv_split_config = {'n_splits': 5,
                           'cv': True,
                           'train_size': 0.7,
                           'name_list': config['name_list'],
                           'random_state': experiment_params['seed'],
                           'train_cv_path': "../2CvTrain/",
                           'valid_cv_path': "../2CvValid/",
                           'label_name': prep_label_config['label_csv_mame']}

        for _ in split_train(**cv_split_config):
            prep_labels(**cv_train_label_config)
            params = prep_params(config['params_dir'],
                                 cv_train_label_config['label_csv_mame'],
                                 experiment_params)
            best_map, best_ap, best_conf, specific_conf_map, specific_conf_ap,\
                map_frame = run_training(params=params, **config)
            cv_results_list.append(params)
            shutil.rmtree(cv_split_config['train_cv_path'])
            shutil.rmtree(cv_split_config['valid_cv_path'])
            cv_results_df = pd.DataFrame(cv_results_list)
            cv_results_df.to_csv(f"{params['working_dir']}cv_results.csv")
Ejemplo n.º 4
0
def main(weight_path):
    # change cuda to True if you wish to use gpu
    det = "../2ProcessedData/"
    cfg_path = "../4Others/yolo.cfg"
    label_csv_mame = '../1TestData/label.csv'
    name_list = ["img_name", "c", "gx", "gy", "gw", "gh"]
    test_img_txt_path = "../1TestData/*.txt"
    prep_labels(test_img_txt_path, name_list, label_csv_mame)
    params = prep_params(weight_path, label_csv_mame)
    detection(cfg_path, det, label_csv_mame, params)
    df = get_single_img_map(cfg_path, det, label_csv_mame, params)
    return df
Ejemplo n.º 5
0
        'label_csv_mame': config['label_csv_mame'],
        'img_txt_path': "../1TrainData/*.txt",
        'name_list': config['name_list']
    }

    #    torch.backends.cudnn.enabled = False
    #    torch.backends.cudnn.benchmark = False
    # you can specify any tuning hyper-parammeters here , but do not use
    # np.arrange() as it will result an error for json.dumps()
    tune_params = {
        'seed': list(range(1, 3)),
        'height': [448, 480],
        "decay": [0.0005, 0.001],
        "steps": [6, 10],
        "optimizer": ['sgd', 'adam'],
        "epochs": [40, 80]
    }
    index, values = zip(*tune_params.items())
    experiments_params = [dict(zip(index, v)) for v in it.product(*values)]

    # prepare training lables
    prep_labels(**prep_label_config)
    for experiment_params in experiments_params:
        params = prep_params(config['params_dir'], config['label_csv_mame'],
                             experiment_params)
        try:
            best_map, best_ap, best_conf, specific_conf_map, specific_conf_ap,\
                map_frame = run_training(params=params, **config)
        except:
            continue
Ejemplo n.º 6
0
def compare():
    date_time_now = str(datetime.datetime.now()).replace(" ", "_").replace(
        ":", "_")
    compare_path = f"../5Compare/epoch_experiment/{date_time_now}/"
    if not os.path.exists(compare_path):
        os.makedirs(compare_path)
    config_name = "exp_config.p"
    conf_list = np.arange(start=0.2, stop=0.95, step=0.025)
    seed_range = range(420, 425)
    to_path_list = {
        "../250_to_300_imgs/": 1.05 / 7,
        "../400_to_450_imgs/": 1 / 4,
        "../550_to_600_imgs/": 3 / 7,
        "../700_to_750_imgs/": 4.7 / 7
    }
    epochs_list = [25, 30, 35, 40]
    classes = load_classes('../4Others/color_ball.names')
    cfg_path = "../4Others/color_ball.cfg"
    blocks = parse_cfg(cfg_path)
    model = yolo_v3(blocks)
    model.load_weights("../4Weights/yolov3.weights", cust_train_zero=True)
    model.net['epochs_list'] = epochs_list
    model.net['img_sampling_info'] = to_path_list
    with open(compare_path + config_name, "wb") as fp:
        pickle.dump(model.net, fp, protocol=pickle.HIGHEST_PROTOCOL)
    for to_path, train_size in to_path_list.items():
        time_taken_df = pd.DataFrame(columns=list(epochs_list))
        file_name = to_path.strip(".").strip("/")
        for index, seed in enumerate(seed_range):
            x_start = time.time()
            random.seed(seed)
            if not os.path.exists(to_path):
                os.makedirs(to_path)

            name_list = ["img_name", "c", "gx", "gy", "gw", "gh"]
            # Original label names
            label_csv_mame = '../color_balls/label.csv'
            img_txt_path = "../color_balls/*.txt"
            prep_labels(img_txt_path, name_list, label_csv_mame)
            # sub sampled label names
            sub_sample_csv_name = to_path + "label.csv"
            sub_sample_txt_path = to_path + "*.txt"
            # label_csv_mame = '../1TestData/label.csv'
            # img_txt_path = "../1TestData/*.txt"
            move_images(label_name=label_csv_mame,
                        to_path=to_path,
                        action_fn=split_train,
                        train_size=train_size,
                        random_state=seed)
            for epoch in epochs_list:
                model.load_weights("../4Weights/yolov3.weights",
                                   cust_train_zero=True)
                model.net['epochs'] = epoch
                sub_name = f"{file_name}_seed_{seed}_epoch_{epoch}_"
                best_map, best_ap, best_conf, specific_conf_map,\
                    specific_conf_ap, map_frame = main(model,
                                                       classes, conf_list,
                                                       sub_sample_csv_name,
                                                       sub_sample_txt_path,
                                                       to_path,
                                                       cuda=True,
                                                       specific_conf=0.5,
                                                       sub_name=sub_name)

                map_frame.to_csv(f"{compare_path+sub_name}.csv", index=True)
                time_taken_df.loc[file_name, epoch] = time.time() - x_start
                # if you change the csv_name, pls change accordingly in the
                # visualization part
                time_taken_df.to_csv(compare_path + f"time_taken_{seed}.csv",
                                     index=True)
            shutil.rmtree(to_path)
Ejemplo n.º 7
0
def run_training(params,
                 label_csv_mame,
                 name_list,
                 test_label_csv_mame,
                 test_img_txt_path,
                 cfg_path,
                 params_dir,
                 valid_label_csv_mame=False,
                 valid_img_txt_path=False):
    random.seed(params['seed'])
    np.random.seed(params['seed'])
    torch.manual_seed(params['seed'])
    torch.cuda.manual_seed(params['seed'])
    logging.basicConfig(level=logging.DEBUG,
                        format="[%(asctime)s %(filename)s] %(message)s")

    # prepare test lables
    prep_labels(test_img_txt_path, name_list, test_label_csv_mame)

    # parse model architect from architect config file
    blocks = parse_cfg(cfg_path)

    # training transformation
    pre_trans = RandomCrop(jitter=params['rand_crop'],
                           inp_dim=params["height"])
    train_transform = transforms.Compose([
        transforms.ColorJitter(brightness=params["exposure"],
                               saturation=params["saturation"]),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ])
    test_pre_trans = OfssetLabels(resize=True, input_dim=params['height'])

    test_transform = transforms.Compose([
        ImgToTensorCv(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ])
    train_data = CustData(label_csv_mame,
                          pre_trans=pre_trans,
                          transform=train_transform)
    test_data = CustDataCV(test_label_csv_mame,
                           pre_trans=test_pre_trans,
                           transform=test_transform)
    train_loader = DataLoader(train_data,
                              shuffle=True,
                              batch_size=params["batch_size"],
                              collate_fn=my_collate,
                              num_workers=params['num_workers'],
                              worker_init_fn=worker_init_fn)
    test_loader = DataLoader(test_data,
                             shuffle=False,
                             batch_size=params["batch_size"],
                             collate_fn=my_collate,
                             num_workers=params['num_workers'],
                             worker_init_fn=worker_init_fn)

    # initiate model
    model = yolo_v3(params, blocks)

    # Initiate validation data loader if there is any
    if valid_label_csv_mame:
        valid_data = CustDataCV(valid_label_csv_mame, transform=test_transform)
        valid_loader = DataLoader(valid_data,
                                  shuffle=False,
                                  batch_size=params["batch_size"],
                                  collate_fn=my_collate,
                                  num_workers=params['num_workers'],
                                  worker_init_fn=worker_init_fn)

        # Start training
        best_map, best_ap, best_conf, specific_conf_map, specific_conf_ap,\
            map_frame = model.fit(train_loader, valid_loader, test_loader)
    else:

        # Start training
        best_map, best_ap, best_conf, specific_conf_map, specific_conf_ap, \
            map_frame = model.fit(train_loader, test_loader)

    return best_map, best_ap, best_conf, specific_conf_map, specific_conf_ap, \
        map_frame