Warning: Текст сухой, так как написан больше для публичного логирования и интересен скорее тем, кто библиотеку уже использует.
Я являюсь одним из разработчиков open source библиотеки Albumentations.
Библиотека предназначена для аугментации изображений, и обычно применяется в задачах компьютерного зрения.
Для тренировки нейронных сетей требуется много размеченных данных. И тут есть два варианта:
собрать да разметить. Дорого, долго, но гарантированно улучшить качество модели.
вариант для бедных - аугментации. Какая от них ценность заранее не известно, зато бесплатно и уже сейчас.
На практике комбинируют оба подхода.
Над библиотекой мы работаем уже 4 года. В том году я написал развернутый текст на Хабре про то, как библиотека родилась и развивалась. [ Рождение Albumentations ]
На текущий момент мы имеем:
Победители всех или почти всех соревнований по компьютерному зрению на Kaggle используют библиотеку.
Статья про библиотеку имеет более 700 цитирований в научной литературе.
Как видно по карте библиотекой пользуются по всему миру, и больше всего пользователей (по убыванию): США, Южная Корея, Индия, Китай, Япония, Россия.
Есть разные причины почему библиотека взлетела. Это и функционал, и грамотное продвижение, но в первую очередь скорость.
В идеале надо, чтобы скорость тренировки упиралась в GPU, как следствие требуется чтобы CPU не был блокером. А он им моментально становится если аугментационный pipeline медленный.
Развитие проекта шло как типичный Open Source. Core Team в разных странах. Когда кому-то что-то требовалось добавить - он добавляет, без планирования, sync’ов и OKR’ов.
Не прошло и пяти лет, я решил спросить как вообще библиотека используется и чего не хватает. Спросил на LinkedIn, на Twitter и в сообещстве ODS, как кто библиотеку использует на работе (то есть помогает зарабатывать деньги :) ). Ребята откликнулись - я позадовал вопросы.
Вот что получилось:
Q: В каких доменах используется библиотека?
Медицина (от распознавания родинок на коже, до диагностики рака)
Распознование документов
Спутниковые снимки
Автономные машины
Робототехника
Детекция дефектов на производстве
Распознование лиц и AntiSpoofing
Редактирование и улучшение фото
Мониторинг траффика
Beauty сфера
Retail
Тестрирование моделей перед деплоем на устойчивость к дрифту данных
Обработка видео со спортивных мероприятий
Мемогенерация.
То есть там где есть картинки или видео - там библиотека используется, что логично и приятно.
Q: Какие типы задач?
Classification
Detection
Segmentation
Action Recognition
Pose estimation
Super Resolution
Image inpainting
Изначально библиотека разрабатывалась под классификацию и сегментацию. Остальной функционал мы добавили позже и, видимо, не зря.
Q: Чего не хватает в библиотеке?
Примеры приобразование картинками в документацию.
Инструкции о том, как добавить новое преобразование. Сейчас все сводится к - найди похожее преобразование, адаптируй к своему случаю. Практически все с кем я общался делали кастомные преобразовани, то есть разобраться, в прнципе, можно. С другой стороны всем приходилось разбираться в кодовой базе вместо того, чтобы следовать несложному туториалу.
Работы на GPU. Для каких-то задач не хватает скорости Albumentations. Кто-то пробовал использовать DALI для задач классификации и возрадовался. Получается у DALI хорошо, но там наркоманский интерфейс + только задачи классификации. Есть Библитека Kornia, которая как раз аугментирует на GPU. Применяя ее к батчам получается хорошо, но если покартиночно, то получается не быстрее Albumentations.
Не хватает поддержки 1D и 3D. 3D - это может быть полноценное 3D как в задачах медицины, либо работа с видео. Уже есть какие-то решения на рынке, но по удобству использования и функционалу не дотягивают до Albumentations. Для 3D есть Monai и Volumentations от Романа Соловьева, но там есть куда стремиться. Еще есть мысль, что 3D более ресурсоемко и там точно надо лезть в GPU.
Экспорта аугментационного пайплайна на Pytorch, в другие языки программирования как C++ или другие платформы.
Q: Каких преобразований не хватает в библиотеке?
Добавление текста на лету - это может как на медицинских изображениях, а может быть кирилица, как в TextRecognitionGenerator.
CutAndPaste - это когда есть картинка объект’а и его надо поместить на разные фоновые картинки, но так, чтобы граница между объктом и фоном была замазана через Inpainting или Poisson Blending.
Аугментация пририсовать маску или очки на лицо. Тут, как я понимаю, заранее находятся facial keypoints и маска или очки на них натягиваются.
Больше преобразований с компрессией. Для задач где картинки в плохом качестве или со старых телефонов - а это большая часть существующих задач, хорошо заходят преобразований ImageCompression. Сейчас у нас есть поддержка Jpeg и WebP, был запрос на добавление heic и jpeg2000
Mosaic transform - это когда из несокльких картинок собирается одна. Используется в YOLO разных версий.
Аугментация только в выбранном регионе картинки:
В преобазованиях вида Pixel DropOut - не обнулять, а переводить выбранные области в Grayscale.
Аугментации только внутри bounding boxes.
Аугментации только там где ненулевая маска. Скажем, вам нужно, чтобы вас были каритнки где у людей куртки разного цвета ⇒ можно заранее отсегментировать куртки, а потом применять цветовые преобразования только в областям где маска не ноль.
Q: Какие примеры нестандартных преобразований хорошо заходят?
Там где не хватает людей с другим оттенком кожи - темнокожие, молодые или старые, добрасывает FDA.
В распознавании документов FDA, RandomSunFlare и RandomFog
Q: Как вообще выбираются аугментации?
Тут у всех по разному, не очень структурированно примерно так же, как всю дорогу делал я.
Подрезаются из соревнований с Kaggle.
Из предыдущих похожих задач. Часто есть стадартный набор преобразований вида: Heavy, Medium, Light, который кочует из задачи в задачу.
Так чтобы не портили исходное расределение. Условный HorizonalFlip на естественных картинках или D4 на спутниковых.
Для подбора преобразований и параметров кто-то использует тулзу на Heroku (Руки не доходили обнавить ее несколько лет, там нет многих новых преобразований.), а кто-то эксперементирует в Jupyter Notebook.
В целом, такое ощущение, что вопрос не раскрыт и тут, прям хочется чтобы появилась тулза, которая берет датасет, тип задачи и возвращает хороший аугментационный пайплайн.
Но есть проблемы:
Никто толком не знает как это делать. Да, есть популярное направление исследований AutoAugment, которое является подмножеством еще более популярного AutoML, но там все не очень хорошо.
Аугментации зависят не только от датасета и задачи, но и от модели. Чем тяжелее модель - тем более плотные преобразования к ней можно применять.
Аугментации докидывают к точности и обобщающей способности модели, причем чем меньше тренировочный датасет, тем больше добрасывают. Но сколько добросят и добросят ли вообще заранее неизвестно, что не добавляет людям пытаться инвестировать силы и время в разработку продукта на основе AutoAugment.
Подытоживая, есть куда работать и развивать. Тут и документация и новый функционал.
Так что если кому-то хочется поучаствовать в разработке Open Source - добро пожаловать. Море простых задач на которых можно попробовать что-то сделать в первый раз :)
Вообще хочется, чтобы кто-то работал над проектом full time, но для этого, видимо, надо будет настраивать систему пожертвований и кого-то нанимать. Пока не соображу как это все настроить, но такое ощущение, что при текущей популярности библиотеки это реально.
P.S. English version