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
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)
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)
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)
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)
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)
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