albumentations icon indicating copy to clipboard operation
albumentations copied to clipboard

AugMix

Open akarsakov opened this issue 5 years ago • 12 comments

Refer to #488

Ported AugMix augmentation from: https://arxiv.org/abs/1912.02781

I've reproduced experiment on cifar-10 from article and result is really close to presented numbers. Here is notebook with my experiment: https://colab.research.google.com/drive/1i2d9Ca7SVDuKp28E5GUhHNnutRoHh8hq

akarsakov avatar Apr 29 '20 19:04 akarsakov

DeepSource failed not in my changes... Probably it would be better to fix issues in separate PR.

akarsakov avatar Apr 29 '20 20:04 akarsakov

Если я верно понимаю идею albumentations, то ту есть удобное разделение на функции и трансформации.

Функции меняют изображение по ФИКСИРОВАННЫМ параметрам, которые им передают при вызове. Все функции находятся в https://github.com/albumentations-team/albumentations/blob/master/albumentations/augmentations/functional.py.

Трансформации сначала генерят СЛУЧАЙНЫЕ параметры в тех пределах, которые получили при вызове, а потом вызывают с этими параметрами функции из functional.py. Трансформации находятся в https://github.com/albumentations-team/albumentations/blob/master/albumentations/augmentations/transforms.py .

Такое разделение позволяет использовать использовать полезные функции независимо от трансформаций.

Поэтому содержимое aug_mix() нужно разделить на две части: на функцию и трансформацию. Всё, что генерит случайные параметры перенести в класс AugMix() и из него уже вызывать aug_mix(), передавая параметры, которые однозначно определят изменение изображения.

MichaelMonashev avatar May 01 '20 08:05 MichaelMonashev

Ты реализовал полезные функции shear() и autocontrast(). Было бы здорово паровозиком ещё и сделать отдельные аугментации Shear() и Autocontrast().

MichaelMonashev avatar May 01 '20 08:05 MichaelMonashev

@MichaelMonashev Привет!

Я сделал такой дизайн, потому что кроме параметров аугментаций (angle, posterize_bits и пр) есть еще внутренняя рандомизация вроде весов для смешивания и последовательность аугментаций. К тому же не очень удобно оперировать функцией с 10+ параметрами. В целом я вдохновлялся тем как сделан ElasticTransform. Готов вернуть все назад, просто навряд ли данная функция будет использоваться как "отдельный кирпичик" а рандомизация внутри все равно останется.

По поводу Shear и Autocontrast отличная мысль! Сделал issues для этого: #611 #612

akarsakov avatar May 01 '20 10:05 akarsakov

Еще я тут подумал, что наверно полезнее было сделать по типу Compose:

A.AugMix(
        [
            A.Autocontrast(),
            A.Equalize(mode='pil'),
            ...
        ],
        alpha=1,
        width=3,
        depth=3,
        mean=(..),
        std=(..)
    )

Либо более радикально, добавить композиции WeightedSum, Mix, Repeat:

    A.WeightedSum([
        A.Compose([
            A.Mix([
                A.Repeat([
                        A.OneOf([
                            A.Autocontrast(),
                            A.Equalize(),
                        ]),
                    ], num_repeats=(1, 3)),
                    A.Normalize(always_apply=True)
                    ], weights='dirichlet', alpha=1, width=3),
                A.Normalize(always_apply=True)
            ]),
            A.NoOp()
        ],
        mode='beta', 
        alpha=1
    )

Но наверно второй вариант это уже оверкил...

akarsakov avatar May 01 '20 12:05 akarsakov

Я как раз думал ровно о том же и вот. Вот мои мысли.

У Compose() надо добавить параметр shufle=False|True . По дефолту shufle=False. Если он shufle=True, то все трансформации перемешиваются в случайном порядке. (Это видимо аналог твоего Mix()-а ).

Добавить аналог Compose(): Blend(n=(3,4)) (варианты названий Map, MapReduce, Mix, SplitJoin). Ещё вариант: вместо функции добавить параметр n у Compose(). Оно дублирует вход на n потоков, выполняет для каждого трансформации, а потом объединяет со случайными весами всё в одно изображение. Единственное, что мне тут не нравится: в одном месте делается 2 функции: дублирование на несколько потоков и обратное их слияние.

Для Bbox-ов, кстати, можно non maximum suppression применять при слиянии...

MichaelMonashev avatar May 01 '20 15:05 MichaelMonashev

@BloodAxe , @Dipet , @ternaus , @albu , @creafz , @ZFTurbo , @qubvel . Хорошо бы всё это обсудить и хорошенько продумать...

MichaelMonashev avatar May 01 '20 15:05 MichaelMonashev

I've added Autocontrast and RandomShear transforms and made AugMix to accept list of transforms. I didn't introduce new composition transforms in order not to overcomplicate the implementation for now.

P.S. deep source is still failing. Is it possible to run it on all codebase and fix all possible issues?

akarsakov avatar May 06 '20 21:05 akarsakov

P.S. deep source is still failing. Is it possible to run it on all codebase and fix all possible issues?

этот дипсорс каждый день добавляет новые бредовые проверки. Это их фича такая. Поэтому я его фиксил его прибабахи отдельным коммитом внутри пул-реквеста. Это конечно неправильно, но зато помогает пройти проверки.

MichaelMonashev avatar May 07 '20 06:05 MichaelMonashev

Ты написал много полезного кода и было бы жалко его терять весь из-за того, что его часть не нравиться ревьерам.

ИМХО, написанному будет проще попасть в albumentations, хотя бы частично, если его побить на отдельные PR-ы. Отдельно Autocontrast, отдельно RandomShear, отдельно bbox_shift_scale_rotate(), отдельно AugMix().

MichaelMonashev avatar May 07 '20 09:05 MichaelMonashev

+1 for this feature.

minhlong94 avatar Oct 05 '21 01:10 minhlong94

Hello, Are there any plans to merge this PR?

thiagoribeirodamotta avatar Jun 26 '23 13:06 thiagoribeirodamotta