Применение преобразований к fastai v2 vision

#fast-ai

#быстрый ии

Вопрос:

В fastai v2 я пытаюсь добавить дополнения к изображению

Итак

 tfms = aug_transforms(do_flip = True,
                                 flip_vert=True, 
                                 max_lighting=0.1, 
                                 )
data = ImageDataLoaders.from_df(df,bs=5,item_tfms=tfms,folder=path_to_data)
 

это дает результат

Could not do one pass in your dataloader, there is something wrong in it

И когда я делаю

 data.show_batch()
 

это дает

 RuntimeError: "check_uniform_bounds" not implemented for 'Byte'
 

Как решить

Комментарии:

1. Вы когда-нибудь это понимали? Я столкнулся с той же проблемой. Кажется, я могу выполнять отступы и обрезку, но что-то более экзотическое вызывает ту же ошибку.

2. LOL нет. Возможно, путем голосования мы сможем дать ответ на этот вопрос

Ответ №1:

Я не пробовал преобразование do_flip, но для меня сработало то, что я применил их не как item_tfms, а как batch_tfms:

 item_tfms = [ Resize((200, 150), method='squish')]
 
batch_tfms = [Brightness(max_lighting = 0.3, p = 0.4),
    Contrast(max_lighting = 0.6, p = 0.4),
    Saturation(max_lighting = 0.75, p = 0.4)]
 
db = DataBlock(blocks = (ImageBlock, CategoryBlock),
                  get_items = get_image_files,
                  splitter = RandomSplitter(valid_pct=0.2, seed=42),
                  item_tfms=item_tfms,
                  batch_tfms=batch_tfms,
                  get_y = parent_label)
 

Затем вы можете загрузить блок данных в программу загрузки данных, как в учебном пособии по fastbook

Комментарии:

1. Постараюсь вас проинформировать. Спасибо Вам за rply

2. Поражает воображение . Иногда это самые простые вещи.

3. @JudoWill и orozco получили ответ, который может помочь нам это проверить

Ответ №2:

Я получил это из документов fastai. Добавление материалов, связанных с вопросом, вы можете проверить здесь все, что связано с augs

 class AlbumentationsTransform(RandTransform):
    "A transform handler for multiple `Albumentation` transforms"
    split_idx,order=None,2
    def __init__(self, train_aug, valid_aug): store_attr()
    
    def before_call(self, b, split_idx):
        self.idx = split_idx
    
    def encodes(self, img: PILImage):
        if self.idx == 0:
            aug_img = self.train_aug(image=np.array(img))['image']
        else:
            aug_img = self.valid_aug(image=np.array(img))['image']
        return PILImage.create(aug_img)
 

В принципе, это все, что вам нужно

Для настройки расширений различий используйте

 def get_train_aug(): return albumentations.Compose([
            albumentations.RandomResizedCrop(224,224),
            albumentations.Transpose(p=0.5),
])

def get_valid_aug(): return albumentations.Compose([
    albumentations.CenterCrop(224,224, p=1.),
    albumentations.Resize(224,224)
], p=1.)
 

И затем

 item_tfms = [Resize(256), AlbumentationsTransform(get_train_aug(), get_valid_aug())]

dls = ImageDataLoaders.from_name_func(
    path, get_image_files(path), valid_pct=0.2, seed=42,
    label_func=is_cat, item_tfms=item_tfms)
dls.train.show_batch(max_n=4)
 

Наслаждайтесь