Example #1
0
def valid_dataloader(
    train_meta_data,
    input_size=128,
    batch_size=64,
    num_workers=4,
    label_matrix=None,
    transforms_i=None,
):

    image_dir = os.path.join(DATASET_PATH, 'train', 'train_data', 'images')
    train_label_path = os.path.join(DATASET_PATH, 'train', 'train_label')
    train_meta_path = os.path.join(DATASET_PATH, 'train', 'train_data',
                                   'train_with_valid_tags.csv')

    if transforms_i is None:
        transforms_i = transforms.Compose([
            transforms.Resize((input_size, input_size)),
            transforms.RandomHorizontalFlip(),
            transforms.RandomRotation(20),
            transforms.ToTensor(),
            transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),
        ])

    # transforms - batch normalization add
    dataloader = DataLoader(AIRushDataset(image_dir,
                                          train_meta_data,
                                          label_path=train_label_path,
                                          transform=transforms_i,
                                          label_matrix=label_matrix),
                            batch_size=batch_size,
                            shuffle=True,
                            num_workers=num_workers,
                            pin_memory=True)
    return dataloader
Example #2
0
 def infer(test_image_data_path, test_meta_data_path):
     # DONOTCHANGE This Line
     test_meta_data = pd.read_csv(test_meta_data_path, delimiter=',', header=0)
     
     input_size=128 # you can change this according to your model.
     batch_size=200 # you can change this. But when you use 'nsml submit --test' for test infer, there are only 200 number of data.
     device = 0
     
     dataloader = DataLoader(
                     AIRushDataset(test_image_data_path, test_meta_data, label_path=None,
                                   transform=transforms.Compose([transforms.Resize((input_size, input_size)), transforms.ToTensor()])),
                     batch_size=batch_size,
                     shuffle=False,
                     num_workers=0,
                     pin_memory=True)
     
     model_nsml.to(device)
     model_nsml.eval()
     predict_list = []
     with torch.no_grad(): # No need for torch.backward() - no gradient calculation
         for batch_idx, image in enumerate(dataloader):
             image = image.to(device)
             output = model_nsml(image).double()
             
             output_prob = F.softmax(output, dim=1)
             predict = np.argmax(to_np(output_prob), axis=1)
             predict_list.append(predict)
             
     predict_vector = np.concatenate(predict_list, axis=0)
     return predict_vector # this return type should be a numpy array which has shape of (138343, 1)
Example #3
0
    def infer(test_image_data_path, test_meta_data_path):
        # DONOTCHANGE This Line
        test_meta_data = pd.read_csv(test_meta_data_path,
                                     delimiter=',',
                                     header=0)

        input_size = 224  # you can change this according to your model.
        batch_size = _BATCH_SIZE // 4  # you can change this. But when you use 'nsml submit --test' for test infer, there are only 200 number of data.
        # test time gpu memory error, so i reduce batch size when test time
        device = 0

        dataloader = DataLoader(
            AIRushDataset(
                test_image_data_path,
                test_meta_data,
                label=None,
                transform=transforms.Compose([
                    ObjROI(),
                    transforms.Resize((input_size, input_size)),
                    transforms.ToTensor()
                    #,transforms.Normalize(mean=mean_v, std=std_v)
                ])),
            batch_size=batch_size,
            shuffle=False,
            num_workers=0,
            pin_memory=True)

        model_nsml.to(device)
        model_nsml.eval()
        predict_list = []
        for batch_idx, image in enumerate(dataloader):
            image = image.to(device)
            image_lr = image.flip(3)  #batch, ch, h, w

            output_org = model_nsml(image).double()
            output_lr = model_nsml(image_lr).double()
            output = output_org + output_lr

            output_prob = F.softmax(output, dim=1)
            predict = np.argmax(to_np(output_prob), axis=1)

            predict_list.append(predict)

        predict_vector = np.concatenate(predict_list, axis=0)
        return predict_vector  # this return type should be a numpy array which has shape of (138343, 1)
Example #4
0
    def infer(test_image_data_path, test_meta_data_path):
        # DONOTCHANGE This Line
        test_meta_data = pd.read_csv(test_meta_data_path, delimiter=',', header=0)
        
        input_size=224 # you can change this according to your model.
        batch_size=200 # you can change this. But when you use 'nsml submit --test' for test infer, there are only 200 number of data.
        device = 0
        
        we = 0.25
        ensemble = [['team_62/airush1/320', '02'],['team_62/airush1/320','12'],['team_62/airush1/320','22'],['team_62/airush1/320','32']]
        #ensemble = [['team_62/airush1/415', '03'],['team_62/airush1/415','13'],['team_62/airush1/415','23'],['team_62/airush1/415','33']]
        predict_list = []
        for i in range(4):

            dataloader = DataLoader(
                            AIRushDataset(test_image_data_path, test_meta_data, label_path=None,
                                        transform=transforms.Compose([transforms.Resize((input_size, input_size)), transforms.RandomRotation(20),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])),
                            batch_size=batch_size,
                            shuffle=False,
                            num_workers=4,
                            pin_memory=True)

            # Let's do ensemble!!!
            nsml.load(checkpoint=str(ensemble[i][1]),session=str(ensemble[i][0]))
            
       
            # model load
            model_nsml.to(device)
            model_nsml.eval()
            predict_output_list = [] 
            with torch.no_grad():
                for batch_idx, image in enumerate(dataloader):
                    image = image.to(device)
                    output = model_nsml(image).double()
                    output_prob = to_np(F.softmax(output, dim=1))
                    predict_output_list.append(output_prob * we)
            predict_output_list = np.concatenate(predict_output_list,axis=0)
            predict_list.append(predict_output_list)
           
       

        predict_vector = np.argmax(np.sum(predict_list,axis=0), axis=1)
       
        return predict_vector # this return type should be a numpy array which has shape of (138343)
    def infer(test_image_data_path, test_meta_data_path):
        # DONOTCHANGE This Line
        test_meta_data = pd.read_csv(test_meta_data_path,
                                     delimiter=',',
                                     header=0)

        batch_size = infer_batch_size  # you can change this. But when you use 'nsml submit --test' for test infer, there are only 200 number of data.
        device = 0

        dataloader = DataLoader(AIRushDataset(
            test_image_data_path,
            test_meta_data,
            label_path=None,
            transform=transforms.Compose(infer_transform_list)),
                                batch_size=batch_size,
                                shuffle=False,
                                num_workers=0,
                                pin_memory=True)

        model_nsml.to(device)
        model_nsml.eval()
        predict_list = []
        for batch_idx, image in enumerate(dataloader):
            image = image.to(device)
            output = model_nsml(image).double()

            output_prob = output
            if args.loss_type == "cross_entropy":
                output_prob = F.softmax(output, dim=1)
            elif args.loss_type == "bce":
                output_prob = torch.sigmoid(output)

            predict = np.argmax(to_np(output_prob), axis=1)
            predict_list.append(predict)

        predict_vector = np.concatenate(predict_list, axis=0)
        return predict_vector  # this return type should be a numpy array which has shape of (138343)
Example #6
0
    def infer(test_image_data_path, test_meta_data_path):
        # DONOTCHANGE This Line
        test_meta_data = pd.read_csv(test_meta_data_path,
                                     delimiter=',',
                                     header=0)

        device = 0

        models = args.models.split(",")
        model_weights = [float(w) for w in args.model_weights.split(",")]
        nsml_sessionss = args.nsml_sessionss.split(",")
        nsml_checkpoints = args.nsml_checkpoints.split(",")
        loss_types = args.loss_types.split(",")

        transform_random_crop = args.transform_random_crop.split(",")
        transform_random_sized_crop = args.transform_random_sized_crop.split(
            ",")
        transform_norm = args.transform_norm.split(",")
        infer_transform_center_crop = args.infer_transform_center_crop.split(
            ",")

        total_output_probs = None
        for i, model_name in enumerate(models):
            batch_size = batch_size_map[model_name] // 2

            infer_transform_list = []

            if infer_transform_center_crop[i] == "True":
                infer_transform_list.append(transforms.Resize((248, 248)))
                infer_transform_list.append(
                    transforms.CenterCrop((args.input_size, args.input_size)))
                infer_transform_list.append(transforms.ToTensor())
                if transform_norm[i] == "True":
                    infer_transform_list.append(
                        transforms.Normalize(
                            [0.44097832, 0.44847423, 0.42528335],
                            [0.25748107, 0.26744914, 0.30532702]))
            else:
                if transform_random_crop[i] == "True":
                    infer_transform_list.append(transforms.Resize((256, 256)))
                    infer_transform_list.append(
                        transforms.CenterCrop(
                            (args.input_size, args.input_size)))
                elif transform_random_sized_crop[i] == "True":
                    infer_transform_list.append(transforms.Resize((256, 256)))
                    infer_transform_list.append(
                        transforms.CenterCrop(
                            (args.input_size, args.input_size)))
                else:
                    infer_transform_list.append(
                        transforms.Resize((args.input_size, args.input_size)))
                infer_transform_list.append(transforms.ToTensor())
                if transform_norm[i] == "True":
                    infer_transform_list.append(
                        transforms.Normalize(
                            [0.44097832, 0.44847423, 0.42528335],
                            [0.25748107, 0.26744914, 0.30532702]))

            print("transform", infer_transform_list)

            dataloader = DataLoader(
                AIRushDataset(
                    test_image_data_path,
                    test_meta_data,
                    label_path=None,
                    transform=transforms.Compose(infer_transform_list)
                ),  #[transforms.Resize((args.input_size, args.input_size)), transforms.ToTensor()])),
                batch_size=batch_size,
                shuffle=False,
                num_workers=0,
                pin_memory=True)

            if model_name == "Resnet18":
                model = Resnet18(args.output_size)
            elif model_name == "Resnet152":
                model = Resnet152(args.output_size)
            elif model_name == "baseline":
                model = Baseline(args.hidden_size, args.output_size)
            elif model_name.split("-")[0] == "efficientnet":
                model = EfficientNet.from_pretrained(args.model,
                                                     args.output_size)
            else:
                raise Exception("model type is invalid : " + args.model)

            model.to(device)

            def load_fn(dir_name):
                save_state_path = os.path.join(dir_name, 'state_dict.pkl')
                state = torch.load(save_state_path)
                model.load_state_dict(state['model'])
                print("model loaded", dir_name)

            model.eval()

            nsml.load(checkpoint=nsml_checkpoints[i],
                      load_fn=load_fn,
                      session="team_13/airush1/" + nsml_sessionss[i])

            output_probs = None
            for batch_idx, image in enumerate(dataloader):
                image = image.to(device)
                output = model(image).double()

                if loss_types[i] == "cross_entropy":
                    output_prob = F.softmax(output, dim=1)
                else:
                    output_prob = torch.sigmoid(output)

                if output_probs is None:
                    output_probs = to_np(output_prob)
                else:
                    output_probs = np.concatenate(
                        [output_probs, to_np(output_prob)], axis=0)
            if total_output_probs is None:
                total_output_probs = output_probs * model_weights[i]
            else:
                total_output_probs += (output_probs * model_weights[i])

        predict = np.argmax(total_output_probs, axis=1)

        return predict  # this return type should be a numpy array which has shape of (138343)
Example #7
0
    def infer(test_image_data_path, test_meta_data_path):
        # DONOTCHANGE This Line
        test_meta_data = pd.read_csv(test_meta_data_path,
                                     delimiter=',',
                                     header=0)
        # dropout ratio
        ensemble0 = [['team_62/airush1/320', '02'],
                     ['team_62/airush1/320', '12'],
                     ['team_62/airush1/320', '22'],
                     ['team_62/airush1/98', '4']]  # effi
        ensemble1 = [['team_62/airush1/415', '03'],
                     ['team_62/airush1/415', '13'],
                     ['team_62/airush1/415', '23'],
                     ['team_62/airush1/415', '33']]  # effi
        ensemble2 = [['team_62/airush1/678', '02'],
                     ['team_62/airush1/678', '12'],
                     ['team_62/airush1/185',
                      '17']]  #[['team_62/airush1/185','17']] # resnet50
        ensemble3 = [['team_62/airush1/683', '02'],
                     ['team_62/airush1/683',
                      '12']]  # oct ['team_62/airush1/409','18']
        #ensemble4 = [['team_62/airush1/605','8']]  # SKNet # transforms 에서 normalize 반드시 뺄 것
        input_size = 224  # you can change this according to your model.
        batch_size = 512  # you can change this. But when you use 'nsml submit --test' for test infer, there are only 200 number of data.
        device = 0

        w0 = 0.125
        w2 = 0.166
        w3 = 0.25

        predict_list = []
        for i in range(4):  # ensemble 개수
            #print('i th inference')

            dataloader = DataLoader(AIRushDataset(
                test_image_data_path,
                test_meta_data,
                label_path=None,
                transform=transforms.Compose([
                    transforms.Resize((input_size, input_size)),
                    transforms.RandomRotation(20),
                    transforms.ToTensor(),
                    transforms.Normalize([0.485, 0.456, 0.406],
                                         [0.229, 0.224, 0.225])
                ])),
                                    batch_size=batch_size,
                                    shuffle=False,
                                    num_workers=4,
                                    pin_memory=True)
            # 9:10 결과보고 뺄지 말지 결정
            # Let's do ensemble!!!
            if (i == 0):
                # 'efficientNet_b0 : ensemble 4 - fold'
                for j in range(4):
                    model_name = 'efficientnet-b0'
                    model = EfficientNet.from_name(model_name)
                    bind_model(model)
                    nsml.load(checkpoint=str(ensemble0[j][1]),
                              session=str(ensemble0[j][0]))
                    model.to(device)
                    model.eval()
                    predict_output_list = []
                    with torch.no_grad():
                        for batch_idx, image in enumerate(dataloader):
                            image = image.to(device)
                            output = model(image).double()
                            output_prob = to_np(F.softmax(output, dim=1))
                            predict_output_list.append(output_prob * w0)
                    predict_output_list = np.concatenate(predict_output_list,
                                                         axis=0)
                    predict_list.append(predict_output_list)
            elif (i == 1):
                # resnet50
                for j in range(3):

                    model = resnext50(
                        num_classes=args.output_size)  # 모델에 맞게 수정
                    bind_model(model)
                    nsml.load(checkpoint=str(ensemble2[j][1]),
                              session=str(ensemble2[j][0]))  # 모델에 맞게 수정
                    model.to(device)
                    model.eval()
                    predict_output_list = []
                    with torch.no_grad():
                        for batch_idx, image in enumerate(dataloader):
                            image = image.to(device)
                            output = model(image).double()
                            output_prob = to_np(F.softmax(output, dim=1))
                            #print(output_prob)
                            predict_output_list.append(output_prob * w2)
                    predict_output_list = np.concatenate(predict_output_list,
                                                         axis=0)
                    predict_list.append(predict_output_list)
                    #print('resnet model')
            elif (i == 2):
                # resnet50
                for j in range(2):
                    model = OctResNet(
                        Bottleneck, [3, 4, 6, 3],
                        num_classes=args.output_size)  # 모델에 맞게 수정
                    bind_model(model)
                    nsml.load(checkpoint=str(ensemble3[j][1]),
                              session=str(ensemble3[j][0]))  # 모델에 맞게 수정
                    model.to(device)
                    model.eval()
                    predict_output_list = []
                    with torch.no_grad():
                        for batch_idx, image in enumerate(dataloader):
                            image = image.to(device)
                            output = model(image).double()
                            output_prob = to_np(F.softmax(output, dim=1))
                            #print(output_prob)
                            predict_output_list.append(output_prob * w3)  # 수정
                    predict_output_list = np.concatenate(predict_output_list,
                                                         axis=0)
                    predict_list.append(predict_output_list)
                    #print('resnet model')

            # ensemble 추가

            # 마지막 SENet 추가

        predict_vector = np.argmax(np.sum(predict_list, axis=0), axis=1)

        return predict_vector  # this return type should be a numpy array which has shape of (138343)
Example #8
0
    def infer(test_image_data_path, test_meta_data_path):
        print('ensemble dekitennzyane?')
        # DONOTCHANGE This Line
        test_meta_data = pd.read_csv(test_meta_data_path,
                                     delimiter=',',
                                     header=0)

        input_size = 128  # you can change this according to your model.
        input_size_resnet = 224
        input_size_inception = 299
        # you can change this. But when you use 'nsml submit --test' for test
        # infer, there are only 200 number of data.
        batch_size = 62
        device = 0

        # ここのローディングもいくつかバリエーション持たせてtransformの変換でうまいことできるかも
        dataloader_resnet = DataLoader(AIRushDataset(
            test_image_data_path,
            test_meta_data,
            label_path=None,
            transform=transforms.Compose([
                transforms.Resize((input_size_resnet, input_size_resnet)),
                transforms.ToTensor(),
                transforms.Normalize(mean=[0.485, 0.456, 0.406],
                                     std=[0.229, 0.224, 0.225])
            ])),
                                       batch_size=batch_size,
                                       shuffle=False,
                                       num_workers=0,
                                       pin_memory=True)

        dataloader_inception = DataLoader(AIRushDataset(
            test_image_data_path,
            test_meta_data,
            label_path=None,
            transform=transforms.Compose([
                transforms.Resize(
                    (input_size_inception, input_size_inception)),
                transforms.ToTensor(),
                transforms.Normalize(mean=[0.485, 0.456, 0.406],
                                     std=[0.229, 0.224, 0.225])
            ])),
                                          batch_size=batch_size,
                                          shuffle=False,
                                          num_workers=0,
                                          pin_memory=True)

        dataloader_resnet_crop = DataLoader(AIRushDataset(
            test_image_data_path,
            test_meta_data,
            label_path=None,
            transform=transforms.Compose([
                transforms.Resize(
                    (input_size_resnet + 20, input_size_resnet + 20)),
                transforms.RandomCrop(input_size_resnet),
                transforms.ToTensor(),
                transforms.Normalize(mean=[0.485, 0.456, 0.406],
                                     std=[0.229, 0.224, 0.225])
            ])),
                                            batch_size=batch_size,
                                            shuffle=False,
                                            num_workers=0,
                                            pin_memory=True)

        for __modelnum__ in range(MODELNUM):
            model_list[__modelnum__].to(device)
            model_list[__modelnum__].eval()

        predict_list = []
        for batch_idx, (image_resnet, image_inception,
                        image_resnet_crop) in enumerate(
                            zip(dataloader_resnet, dataloader_inception,
                                dataloader_resnet_crop)):
            image_resnet = image_resnet.to(device)
            image_inception = image_inception.to(device)
            image_resnet_crop = image_resnet_crop.to(device)

            output0 = to_np(model_list[0](image_resnet).double())  # VGG

            output1 = to_np(model_list[1](image_inception).squeeze(-1).squeeze(
                -1).double())  # Inception

            output2 = to_np(model_list[2](image_resnet).double())  # Resnet

            output3 = to_np(
                model_list[3](image_resnet_crop).double())  # Resnet

            print(output0.shape)
            print(output1.shape)
            print(output2.shape)
            print(output3.shape)

            print(np.sum(output0, axis=1))
            print(np.sum(output1, axis=1))
            print(np.sum(output2, axis=1))
            print(np.sum(output3, axis=1))

            output0_sum = np.abs(np.sum(output0, axis=1))
            output1_sum = np.abs(np.sum(output1, axis=1))
            output2_sum = np.abs(np.sum(output2, axis=1))
            output3_sum = np.abs(np.sum(output3, axis=1))

            print(output0_sum.shape)
            print(output1_sum.shape)
            print(output2_sum.shape)
            print(output3_sum.shape)

            output0 /= output0_sum[:, np.newaxis]
            output1 /= output1_sum[:, np.newaxis]
            output2 /= output2_sum[:, np.newaxis]
            output3 /= output3_sum[:, np.newaxis]

            print(np.sum(output0[0, :]))
            print(np.sum(output1[0, :]))
            print(np.sum(output2[0, :]))
            print(np.sum(output3[0, :]))

            output2 *= 0.666  #出力が負なので、低い方が重みついてる

            output = output0 + output1 + output2 + output3

            predict = np.argmax(output, axis=1)

            predict_list.append(predict)

        predict_vector = np.concatenate(predict_list, axis=0)
        # this return type should be a numpy array which has shape of (138343)
        return predict_vector