-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
AugMix #607
AugMix #607
Conversation
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:
Либо более радикально, добавить композиции WeightedSum, Mix, Repeat:
Но наверно второй вариант это уже оверкил... |
Я как раз думал ровно о том же и вот. Вот мои мысли. У Добавить аналог Для Bbox-ов, кстати, можно non maximum suppression применять при слиянии... |
I've added Autocontrast and RandomShear transforms and made AugMix to accept list of transforms. 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. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
My biggest issues I have so far with the implementation is:
-
If there are
additional_targets
specified, yourAugMix
will lead to equal ops for each image, but each op will be parametrized differently across targets.
Suggestion here: Sample the ops as well as their params inget_params
, and provide both toaugment_and_mix
function -
You perform explicit ImageNet normalization, but people may want to normalize differently/not normalize at all. Also, if images have already been normalized, they will be normalized yet again by your implementation.
Suggestion: Divert from the official reference implementation and leave normalization etc. to the user
) | ||
|
||
def get_params(self): | ||
return {"depth": random.randint(self.depth[0], self.depth[1]), "random_state": random.randint(0, 10000)} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Assigning a single int
to depth
here makes all augmentations of width
have the same depth
(this is in divergence to the reference implementation
|
||
if self.transforms is None: | ||
self.transforms = [ | ||
Autocontrast(), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
All transforms need to have p=1
, such that they are always executed when selected by Augmix
.
Maybe add a comment and change default values ?
Hello, |
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