def data_process(self): normal = transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) if cfg.use_autoaugment: train_transform = transforms.Compose([ transforms.Resize(cfg.image_size), transforms.CenterCrop(cfg.crop_image_size), # transforms.RandomRotation(cfg.rotate_degree), auto_augment.AutoAugment(dataset=cfg.autoaugment_dataset), transforms.ToTensor(), transforms.RandomErasing(p=0.3, scale=(0.02, 0.1), ratio=(0.6, 1.2)), normal ]) else: train_transform = transforms.Compose([ transforms.Resize(cfg.image_size), transforms.CenterCrop(cfg.crop_image_size), transforms.RandomRotation(cfg.rotate_degree), transforms.ToTensor(), transforms.RandomErasing(p=0.3, scale=(0.02, 0.1), ratio=(0.6, 1.2)), normal ]) test_trainsform = transforms.Compose([ transforms.Resize(cfg.image_size), transforms.CenterCrop(cfg.crop_image_size), transforms.ToTensor(), normal ]) return train_transform, test_trainsform
def predict(self, image_path): ''' 模型预测返回结果 :param input: 评估传入样例 {"image_path":".\/data\/input\/BeijingGarbage\/image\/0.png"} :return: 模型预测成功之后返回给系统样例 {"label":"0"} ''' # print(image_path) img = Image.open(image_path).convert('RGB') test_trainsform = transforms.Compose([ transforms.Resize(cfg.image_size), transforms.CenterCrop(cfg.crop_image_size), auto_augment.AutoAugment(dataset=cfg.autoaugment_dataset), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) # output = 0 r1, r2, r3, r4, r5 = 0, 0, 0, 0, 0 for _ in range(cfg.tta_times): tensor = test_trainsform(img) tensor = torch.unsqueeze(tensor, dim=0).float() v1, v2, v3, v4, v5 = self.model1(tensor.to(device)) t1, t2, t3, t4, t5 = self.model2(tensor.to(device)) # v1, v2, v3, v4, v5 = self.model1(tensor.to(device)) r1 += v1 r2 += v2 r3 += v3 r4 += v4 r5 += v5 r1 += t1 r2 += t2 r3 += t3 r4 += t4 r5 += t5 val_pred1 = torch.max(r1, 1)[1] val_pred2 = torch.max(r2, 1)[1] val_pred3 = torch.max(r3, 1)[1] val_pred4 = torch.max(r4, 1)[1] val_pred5 = torch.max(r5, 1)[1] val_pred = torch.stack([val_pred1, val_pred2, val_pred3, val_pred4, val_pred5], 1).squeeze() pred = list(val_pred.cpu().numpy()) pred = [i for i in pred if i != 10] temp = '' for v in pred: temp += str(v) return int(temp)
def __init__(self, args, mode='train'): self.args = args root_dir = args.dataset batch_size = args.batch_size augment = args.augment img_size = args.img_size self.resize_size = (int(img_size / 0.875), int(img_size / 0.875)) self.crop_size = (img_size, img_size) self.root_dir = os.path.join(root_dir, mode) self.img_path_list = [] self.label_list = [] self.class_names = [] for class_index, class_name in enumerate(os.listdir(self.root_dir)): class_dir = os.path.join(self.root_dir, class_name) for img_name in os.listdir(class_dir): self.img_path_list.append(os.path.join(class_dir, img_name)) self.label_list.append(class_index) self.class_names.append(class_name) if mode == 'train': pad_len = len(self.img_path_list) % batch_size img_path_list_len = len(self.img_path_list) for _ in range(pad_len): rand_index = np.random.randint(0, img_path_list_len) self.img_path_list.append(self.img_path_list[rand_index]) self.label_list.append(self.label_list[rand_index]) self.data_index = np.arange(0, len(self.label_list)) np.random.shuffle(self.data_index) else: self.data_index = np.arange(0, len(self.label_list)) self.img_path_list = np.array(self.img_path_list) self.label_list = np.array(self.label_list) self.augment = augment self.mode = mode self.batch_size = batch_size self.eppch_index = 0 self.num_class = len(self.class_names) self.random_crop_transform = A.Compose([ A.RandomCrop(width=self.crop_size[0], height=self.crop_size[1]), ]) self.center_crop_transform = A.Compose([ A.CenterCrop(width=self.crop_size[0], height=self.crop_size[1]), ]) self.auto_augment = auto_augment.AutoAugment() self.rand_augment = rand_augment.RandAugment(magnitude=10.)
f"/content/tianchiorgame/df_WeatherClassify/output/{config.prefix}_train.csv", index=None) val_df.to_csv( f"/content/tianchiorgame/df_WeatherClassify/output/{config.prefix}_val.csv", index=None) print(f"train length: {len(train_df)}, val length: {len(val_df)}") writer = SummaryWriter(log_dir="output/run/", filename_suffix=config.prefix) # 数据加载 train_augmentation = transforms.Compose([ transforms.Resize(config.IMG_SIZE + 32), transforms.RandomResizedCrop(config.IMG_SIZE), transforms.RandomHorizontalFlip(), auto_augment.AutoAugment(), m_transform.RandomErasing(0.5, [0.02, 0.4], 0.3, 20), transforms.ToTensor(), transforms.Normalize(config.mean, config.std) ]) val_augmentation = transforms.Compose([ transforms.Resize(config.IMG_SIZE), transforms.CenterCrop(config.IMG_SIZE), transforms.ToTensor(), transforms.Normalize(config.mean, config.std) ]) train_dataset = m_dataloader.IMetDataset( train_df, os.path.join("/content/drive/My Drive/train"), n_classes=config.NUM_CLASSES, transforms=train_augmentation)
#训练中记录三个指标:验证集的最佳acc和对应的loss,验证集上的最低loss metrics = {'best_acc': 10, 'best_acc_loss': 100, 'best_loss': 100} train_transform = transforms.Compose([ transforms.Resize((size + 32, size + 32)), transforms.RandomChoice([ transforms.RandomCrop(size, padding=1, pad_if_needed=True, padding_mode='edge'), transforms.RandomResizedCrop(size, scale=(resize_scale, 1.0), ratio=(0.8, 1.2)) ]), transforms.RandomHorizontalFlip(), auto_augment.AutoAugment(dataset='CIFAR'), #auto_augment transforms.ToTensor(), transforms.RandomErasing(p=erasing_prob), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) val_transform = transforms.Compose([ transforms.Resize((size, size)), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) for fold_idx, (train_idx, val_idx) in enumerate( skf.split(train_df['filename'], train_df['label'])): print('*******************fold {0}*****************'.format(fold_idx)) train_data = train_df.iloc[train_idx] val_data = train_df.iloc[val_idx]