albumentations
albumentations copied to clipboard
AugMix
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
DeepSource failed not in my changes... Probably it would be better to fix issues in separate PR.
Если я верно понимаю идею 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(), передавая параметры, которые однозначно определят изменение изображения.
Ты реализовал полезные функции shear() и autocontrast(). Было бы здорово паровозиком ещё и сделать отдельные аугментации Shear() и Autocontrast().
@MichaelMonashev Привет!
Я сделал такой дизайн, потому что кроме параметров аугментаций (angle, posterize_bits и пр) есть еще внутренняя рандомизация вроде весов для смешивания и последовательность аугментаций. К тому же не очень удобно оперировать функцией с 10+ параметрами. В целом я вдохновлялся тем как сделан ElasticTransform. Готов вернуть все назад, просто навряд ли данная функция будет использоваться как "отдельный кирпичик" а рандомизация внутри все равно останется.
По поводу Shear и Autocontrast отличная мысль! Сделал issues для этого: #611 #612
Еще я тут подумал, что наверно полезнее было сделать по типу 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
)
Но наверно второй вариант это уже оверкил...
Я как раз думал ровно о том же и вот. Вот мои мысли.
У 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 применять при слиянии...
@BloodAxe , @Dipet , @ternaus , @albu , @creafz , @ZFTurbo , @qubvel . Хорошо бы всё это обсудить и хорошенько продумать...
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?
P.S. deep source is still failing. Is it possible to run it on all codebase and fix all possible issues?
этот дипсорс каждый день добавляет новые бредовые проверки. Это их фича такая. Поэтому я его фиксил его прибабахи отдельным коммитом внутри пул-реквеста. Это конечно неправильно, но зато помогает пройти проверки.
Ты написал много полезного кода и было бы жалко его терять весь из-за того, что его часть не нравиться ревьерам.
ИМХО, написанному будет проще попасть в albumentations, хотя бы частично, если его побить на отдельные PR-ы. Отдельно Autocontrast, отдельно RandomShear, отдельно bbox_shift_scale_rotate(), отдельно AugMix().
+1 for this feature.
Hello, Are there any plans to merge this PR?