Я хотел бы поговорить об Albumentations, библиотеке с открытым исходным кодом для дополнений изображений. Объяснение того, как он родился и развивался с течением времени. Основная цель текста — изобразить свое творение, так как я хотел бы иметь историю, которой можно наслаждаться через 20 лет.

В основном я буду говорить о происхождении библиотеки и расскажу о процессе итеративных улучшений с меньшим количеством деталей. Текст мог бы быть более кратким, но я предпочитаю оставить ненужную информацию для исторических целей.

Albumentations — еще одна библиотека Python для увеличения изображений. Он широко используется в задачах глубокого обучения, особенно с PyTorch.

В. Что такое увеличение изображения?
О: Увеличение изображения — это способ создания нового изображения на основе уже имеющегося. Как правило, это что-то простое, например, вращение или отражение, но оно может быть и более сложным, например, добавление дождя или применение переноса стиля.

В. Зачем нам это нужно?
О. Нейронные сети, обученные на больших наборах данных, обобщают лучше.

Один из способов увеличить размер набора данных — собрать и пометить более релевантные данные. Это работает хорошо, но дорого и может занять некоторое время.

Другой способ — применить аугментации. Они не так ценны, как добавление новых данных, но вы получаете их бесплатно.

Два метода не исключают друг друга, и на практике вы их комбинируете.

С дополнениями вы расширяете конвейер:

Чтение изображения с диска => передача в нейросеть.

с дополнительным шагом:

читать изображение с диска => произвольно увеличивать его => передавать в нейронную сеть

В большинстве конвейеров компьютерного зрения первые два шага выполняются на ЦП, а последний — на ГП.

Июнь 2017 г. Kaggle организовал конкурс по машинному обучению Планета: понимание Амазонки из космоса. Участникам нужно было создать модель, присваивающую изображениям теги: лес, река, дорога и т. д.

Задача была довольно унылая, очень похожая на классификацию MNIST. Обсуждая это на ODS.AI, я и несколько опытных участников Kaggle решили присоединиться к челленджу.

Задача не была интересной, но и не требовала большого труда. Конвейер End2end можно реализовать за один вечер. После этого нужно было экспериментировать с гиперпараметрами и аугментациями, что можно было делать пассивно.

Аугментация — отличная регуляризация. Чем больше аугментаций я добавил — тем лучше ведут себя мои сети.

Мы заняли 7 место из 936 команд. Денег мы не получили, но титулы Kaggle Grandmasters стали ближе :)

Что касается увеличения изображения, важны три вещи:

  • Распространенным мнением было то, что узким местом в обучении был GPU. Чем мощнее у вас GPU — тем быстрее обучение сети.
  • В DSTL Satellite Imagery Feature Detection Challenge на Kaggle моя команда заняла 2 место, и я купил домашний компьютер с четырьмя мощными графическими процессорами (на 2017 год).
  • Для аугментации мы использовали библиотеку с открытым исходным кодом ImgAug. В нем много мощных преобразований, но он не оптимизирован для быстрого выполнения.

Узким местом в Amazon Challenge был процессор, а загрузка графического процессора была далека от 100%.

Все члены команды, включая Александра Буслаева, начали создавать собственные конвейеры аугментации, стараясь сделать их гибкими, но быстрыми.

Четыре месяца спустя, осенью 2017 года, я уволился с работы в TrueAccord, принял предложение от Lyft (запись в блоге о том, как я искал работу) и взял перерыв.

В это же время на Kaggle проходил Carvana Image Masking Challenge. Задача заключалась в бинарной сегментации. Я использовал пайплайн из предыдущего соревнования и попал в топ-10 общедоступной таблицы лидеров. Еще одна команда из топ-10: Александр Буслаев и Артем Санакоев предложили объединить усилия. Мы объединились и финишировали первыми, по счастливой случайности опередив легендарного анонимного Bestfitting на 0,000001. (В лог пост с решением)

Во время челленджа мы поделились кодом. Я проверил конвейер аугментации Александра. Это было элегантно и быстро, и мне это нравилось.

У меня был свой собственный, и я использовал его, чтобы победить в нескольких соревнованиях по машинному обучению, но я устал его расширять и отлаживать.

Я скопипастил его аугментации, и следующие полгода мы улучшали их самостоятельно. Зимой 2018 я выиграл еще одно испытание и получил звание гроссмейстера Kaggle, а Александр выиграл SpaceNet и Urban 3d на Topcoder. На призовые деньги он купил квартиру :)

Апрель 2018Команда ods.ai: Александр Буслаев, Селим Сефербеков и Виктор Дурнов выиграли Data Science Bowl 2018, заняв 1 из 3634 команд и отдыхали после этот изнурительный марафон.

После получения звания Kaggle Grandmaster меня перестали интересовать соревнования по машинному обучению.

Но возникла проблема, которую я хотел решить. У меня не было документов о Deep Learning во время поиска работы, что усложняло мне жизнь.

Я хотел заполнить свою Академию Google множеством публикаций по глубокому обучению и больше не беспокоиться об этом.

Я обнаружил, что на CVPR 2018 был семинар Deepglobe, в котором была соревновательная дорожка с тремя задачами. Для каждой задачи участники должны были представить прогноз по набору тестов и краткий документ с описанием решения для каждой задачи для всех трех.

И я нашел его за десять дней до крайнего срока. Десять дней для соревнований по ML — это слишком мало, а у нас их было не один, а целых три. Нас это не испугало. Академические соревнования по машинному обучению редко привлекают сильных конкурентов, поскольку академические круги сосредоточены на новизне, а не на точности. Почти каждое победившее решение в соревнованиях по машинному обучению представляет собой комбинацию хороших существующих идей. Публикация статей и победа в конкурсах — два разных вида спорта.

Уговорил Александра Буслаева, Селима Сефербекова и Алексея Швеца попробовать. За десять дней мы обучили трех моделей, подготовили три заявки и написали три статьи. Наше положение: (2-й, 2-й, 3-й) (Бумага 1, Бумага 2, Бумага 3)

В аспирантуре я был разочарован тем, что код Quantum Monte Carlo, который использовали наша и другие исследовательские группы, распространялся между учеными в архивах по электронной почте. Каждый ученый самостоятельно вносил улучшения и исправлял ошибки, и все 100500 версий жили своей жизнью.

Ситуация с аугментациями стала выглядеть похожей. Я попросил Александра публично опубликовать свой пайплайн на GitHub, чтобы избежать этого. Более того — я хотел выпустить код до CVPR. Я предположил, что это может привлечь к просмотру кода больше людей, а не только людей — специалистов по компьютерному зрению, поскольку CVPR — топовая мировая конференция в этой области. Я предложил добавить ссылку на GitHub ко всем трем постерам, которые нам нужно было представить.

Я хотел опубликовать код и внести улучшения позже, а Александр хотел сначала переписать код и довести его до производственного качества перед публикацией. Казалось, что это займет у нас еще пару лет.

В этот момент к инициативе присоединился Алекс Паринов. Он понимал важность инфраструктуры для эффективного решения проблем в машинном обучении. Он активно участвовал в соревнованиях Kaggle и внес свой вклад в открытый исходный код. Он сказал, что поможет улучшить качество кода. И это было последнее, что нам нужно, чтобы сделать код общедоступным.

Название для библиотеки было выбрано таким образом: Александр упомянул библиотеку на работе, а его коллега предложил название Альбументайтоны, представляющее собой смесь Альбу, прозвища ALэксандера БУslaev, и слово «аугментации». Я не помню точных деталей, но могло случиться так, что мы выбрали это имя как временное, но нет ничего более постоянного, чем временное, и мы даже не думали его менять.

Июнь 2018 г., за несколько дней до CVPR 2018, Александр опубликовал первый коммит.

На CVPR 2018 мы выбрали лучший вид спорта для постеров — возле бесплатного кофе, но это мало помогло. Не так уж много людей обратили внимание на наши плакаты или нашу библиотеку. Но мы хотя бы попытались :)

17 июня 2018 г. Алекс добавил тесты.

21 июня 2018 г. Алекс добавил автоматически сгенерированную документацию с помощью Sphinx.

1 июля 2019 г. Алекс добавил тест, который сравнивал Альбументации с аналогичными библиотеками. Это позволяло нам быть уверенными, что мы быстрее, и с этого момента, если мы видели, что другая библиотека делает более быстрое преобразование, мы смотрели в их код, изучали их приемы и впитывали их в свой код.

На этом этапе мы добавили все аугментации, которые смогли найти. Мы сделали это, потому что могли и потому что это было весело — никаких совещаний, планов или написания технических заданий. Мы двигались быстро, и это придало нам драйва. Было приятно видеть прогресс. С другой стороны, некоторые решения, которые мы принимали, например, имена трансформаций или их параметры по умолчанию, далеки от оптимальных, но когда мы это поняли, менять было уже поздно.

1 июля. Первый запрос на включение от человека, который не был в основной команде.

Август 2018: к команде присоединился Евгений Хведченя. К тому времени он уже активно участвовал в соревнованиях Kaggle, и было видно, что для выхода в топ нужно иметь хорошие аугментации. Во время кубка Data Science 2018 он перешел из Keras в Pytorch и разработал свои конвейеры аугментации.

Он перешел в Albumentations после первого релиза. Библиотека выглядела очень похожей на код победившего решения Data Science Bowl 2018, и она ему понравилась. К августу он решил добавить в библиотеку поддержку ограничивающих прямоугольников, что было ценно. В то время у нас были изображения и маски сегментации. Его глубокое понимание кода и качественные пулл-реквесты впечатляли, и поэтому он стал членом основной команды.

летом 2018 г. мы:

  • Рефакторинг кода
  • Улучшенное тестовое покрытие
  • Добавлены линтеры, форматтеры, улучшенные строки документации и Readme.

Мы добавили несколько блокнотов Jupyter с примерами по использованию библиотеки. Мы также добавили пример перехода от Torchvision к Albumentations в несколько строк кода.

28 ноября 2018 г. Александр добавил "многоцелевой" функционал. Это позволяло применять одно и то же преобразование к набору изображений, масок и ограничивающих рамок. Мы добавили блокнот jupyter, и позже, в 2020 году, я написал отдельный пост в блоге на эту тему.

3 января 2019 г.Евгений добавил ключевые точки. Никому из нас они не были нужны, но был запрос от пользователей, и Евгений обратился по нему.

7 апреля 2019 г.Евгений добавил Лямбда-преобразование. Это позволило безболезненно добавлять пользовательские преобразования.

18 мая 2019 г.Алекс добавил сериализацию. Выбор дополнений является гиперпараметром и должен быть определен в файлах конфигурации. Сериализация позволяла сохранять/загружать в/из словари YAML, JSON и python.

В августе 2019 года Михаил Дружинин начал участвовать в альбомах.

Он хотел присоединиться к проекту с открытым исходным кодом, но все проекты, которые его интересовали, были слишком сложными, или он не мог понять, как внести весомый вклад.

Для одного из своих проектов ему понадобилась сложная аугментация изображения. Он нашел ImgAug, наткнулся на проблемы и создал запрос на включение. Он сказал, что это было довольно болезненно. После этого он хотел создать собственные преобразования, но ограничения архитектуры ImgAug затрудняли добавление. Поэтому он написал свой конвейер дополнений.

В конце июля 2019 года он присоединился к Северсталь: Обнаружение дефектов стали в Kaggle и понял, что многие люди в Кернелсе используют альбументации. Он посмотрел код библиотеки, и ему понравилась элегантность и простота интерфейса. Примерно в то же время я пытался привлечь людей из сообщества ODS.AI к библиотеке. Я обещал, что мы приветствуем всех и не нужно стесняться.

Михаил имел опыт оптимизации кода под слабое железо и моментально нашел несколько мест, где альбументации можно сделать быстрее. Он сделал набор качественных пулл-реквестов с новыми преобразованиями, исправлениями ошибок и улучшениями.

12 сентября 2019 г. Михаил присоединился к основной команде.

27 сентября 2019 г. Александр добавил режим Повтор. Конвейер расширения состоит из набора преобразований с разной вероятностью. Применяя его дважды к одному и тому же изображению, вы получите разные результаты, что очень усложнит отладку. Replay/Compose обеспечивает полную воспроизводимость при необходимости.

Февраль 2020Алекс обновил документацию и создал сайт для проекта — albumentations.ai. Сайт выглядел настолько хорошо, что автор Insightface адаптировал шаблон для своего сайта insightface.ai :)

Июль 2020, Михаил с помощью Алекса создал Albumentations-experimental, куда добавлены экспериментальные трансформации.

Сентябрь 2020 Алексей создал АвтоАльбумент — инструмент, позволяющий автоматически выбирать аугментации для задачи. К тому времени я не участвовал в проектах ML и, к сожалению, не имел возможности его использовать.

После этого ничего принципиального мы не делали.

По большей части:

  • Улучшена документация
  • Добавлены новые, зачастую экзотические трансформации
  • Улучшено качество кода

Апрель 2021, я лично встретился с Алексом и Михаилом. К моему удивлению, застенчивый Михаил огромный, двухметровый мужчина, намного выше меня :)

Как получить мотивацию тратить свободное время на опенсорс?

В начале было просто весело. Вы видите, как развивается ваш проект, и вносите нужные изменения.

После этого мы получили всплеск дофамина, когда увидели, как выросло усыновление. Некоторые люди даже благодарили нас. Делать добрые дела приятно, и это было отличной мотивацией.

Когда библиотека стала еще популярнее, все изменилось. С одной стороны, мы реализовали почти все, что нужно, сами. С другой стороны, мы начали получать отчеты об ошибках, но не об ошибках, а потому, что пользователи не понимали документацию или не читали ее.

Развитие свободного духа стало напоминать корпоративную поддержку. К такому состоянию мы пришли к весне 2020 года и решили расслабиться и работать над библиотекой только тогда, когда это весело.

Этот подход имеет ограничения. Мы просматриваем пулреквесты не так часто, как могли бы, и отчеты об ошибках могут оставаться открытыми неделями. Это жизнь. Если вы хотите, чтобы процесс шел быстрее — смело делайте форк кода. Лицензия это разрешает.

Как мы продвигали библиотеку?

Существует множество библиотек для увеличения изображений (пост в блоге с обзором). Мы создали еще один. Как сделать его популярным?

Мы хотели:

  1. Библиотека должна быть быстрой. По крайней мере так же быстро, как конкуренты.
  2. Основная команда должна найти его простым в использовании и расширении.
  3. Другие должны найти его простым в использовании и расширении.
  4. Люди, не входящие в основную команду, должны знать, что библиотека существует.
  5. Пользователи должны рекомендовать библиотеку друг другу, не спрашивая нас об этом.

Мы обращались к первым трем пунктам. Но что с двумя последними?

Мы не знали и просто экспериментировали.

Академия

В августе 2018, через два месяца после первого релиза, я попросил Александра Калинина написать препринт для arXiv о библиотеке. Основная цель состояла в том, чтобы облегчить цитирование нас научными кругами. Конечно, мы могли бы добавить BibTex в Readme, но цитирование репозиториев GitHub пока не принято, и многие люди отказываются это делать.

Вначале это были самоцитирования. В 2018–2020 годах я активно публиковал статьи и всегда цитировал препринты. Но довольно быстро, неизвестные нам, исследователи начали упоминать о нашем препринте.

Летом 2019 Александр Калинин читал лекции в летней школе в Польше. Еще одним лектором был Себастьян Рашка. Себастьян упомянул, что он редактор специального выпуска MDPI, и спросил, есть ли у нас что-нибудь важное. Александр показал пр-принт, он понравился Себастьяну, и он предложил ему написать полномасштабную публикацию.

Мы (в основном Александр Калинин) написали бумагу, и сейчас это самая цитируемая статья того спецвыпуска.

Что еще мы можем здесь сделать?

  • Люди в академических кругах вводят новые аугментации, и часто кто-то добавляет их к альбументациям. Мы должны писать авторам, благодарить их за работу и упоминать, что их преобразование является частью библиотеки.

Соревнования по машинному обучению

Мы работали над библиотекой, соревнуясь в различных челленджах на Kaggle и других платформах. Когда мы закончили в топе и опубликовали решения, мы упомянули библиотеку и то, как мы ее использовали.

В основном, как и в других индустриях, в продвижении помогали рекомендации инфлюенсеров, но в нашем случае этими инфлюенсерами были мы.

Нам нужно было упростить использование альбументаций в ядрах Kaggle, и в апреле 2019 библиотека была добавлена ​​в Kaggle Docker.

Если другие победители использовали Альбументации в решении, но не упомянули об этом, я пинговал их и просил добавить это в описание решения.

Но, честно говоря, мне не нужно было делать это так часто. Люди знали, что мы работаем над библиотекой, они понимали, что когда они упоминают об этом — это способ сказать: «Спасибо за вашу работу», и они это сделали.

Мы создали страницу в документации со списком соревнований, где команды-победители использовали альбументации + описание решения-победителя. К сожалению, страница устарела. Я твердо уверен, что Albumentations используется почти во всех решениях-победителях в задачах Computer Vision, но мы не хотим анализировать сайты конкурентов вручную.

Мне нравится эта история. Осенью 2019 года я помог организовать конкурс Lyft: 3D-обнаружение объектов для автономных транспортных средств, организованный совместно с NeurIPS 2019. В конце конференции состоялся ужин для всех организаторов соревнований.

Рядом со мной сидел мужчина. Я хотел похвастаться и упомянуть, что я гроссмейстер Kaggle. Он даже не понял, что я хвастаюсь. Обычно только люди из сообщества Kaggle видят ценность в этом названии. Позже в разговоре он упомянул, что самым глубоким выводом из этого испытания было то, что все лучшие команды использовали альбументации. Его компания не стала ждать до конца, переобучила своих моделей и получила значительное улучшение. Когда он узнал, что я из основной команды Альбументаций, то обрадовался и предложил сфотографироваться со мной :)

Промышленность

Привлекая к компьютерному зрению людей из разных компаний, у меня сложилось впечатление, что Альбументации используются повсеместно, в том числе и во всех FAANG.

Но непонятно, как сделать эту информацию общедоступной на сайте.

Когда я работал в Lyft, я использовал альбументации в нескольких процессах обучения. Я спросил менеджера, могу ли я добавить логотип Lyft в Readme, и получил положительный ответ. Попросил людей из других компаний, и добавилось больше логотипов.

В общем вопрос открытый. Я не знаю, как масштабировать это.

Открытый источник

Я вижу 5700 репозиториев и 144 пакета с альбументациями в качестве зависимости.

В этом случае было понятно, что делать. Мне нужно было взять популярный репозиторий с пайплайном обучения компьютерному зрению и переписать аугментационную часть с помощью альбументаций. Повторяйте много раз.

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

Что мы можем сделать лучше?

  • Мы можем найти вопросы об увеличении изображений в Stack Overflow и ответить на них с помощью кода, используя Альбументации.

Другие эксперименты

Альбументации были не единственным занятием, где я пытался научиться заниматься маркетингом. В 2017–2019 годах я выступал в подкастах, конференциях, митапах, и мне не разрешали рассказывать о своих проектах в Lyft. Поэтому я говорил об альбументациях.

Я живу в США и продвигал библиотеку на английском языке.

Остальная часть команды живет в Восточной Европе и продвигает библиотеку на русском языке.

В октябре 2019 г. библиотека стала частью Экосистемы PyTorch. Добраться туда было несложно, но нам показалось, что это очень круто. Есть даже конференция об Экосистеме PyTorch. Мы могли бы там участвовать и продвигать библиотеку, но мы всегда были заняты, и этого не произошло.

В феврале 2020 года мы попали в Начальную программу NVIDIA. Мы не планировали туда попасть. Кто-то рассказал нам об этом варианте, мы подали заявку и получили одобрение. Мы получили кредиты AWS на сумму 100 000 долларов на год и с гордостью добавили на веб-сайт Участник начальной программы NVIDIA. :)

Еще одна маленькая деталь. Если вы посмотрите, откуда люди приходят в репозиторий, вы увидите link.zhihu.com и link.csdn.net в топ-10 ресурсов для технарей в Китае.

Я попросил студента, говорящего по-китайски, перевести мой пост в блоге о многоцелевом доступе и опубликовать его на соответствующих платформах в Китае. Идея была такая — я уже написал текст, подготовил картинки. Китай огромен. Посмотрим, как это получится.

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

В каждом выпуске Библиотеки мы публиковали сообщения:

  • Твиттер
  • LinkedIn
  • Реддит

Не все, но большинство объявлений распространяются хорошо. У меня 6к подписчиков в Твиттере; Александр Калинин имеет 4k. Это помогло.

Продукт успешен, когда люди, не связанные с ним, пишут о нем сообщения в блогах. Если мы используем эту метрику, Альбументации имеют успех, поскольку люди регулярно создают сообщения в блогах, в которых упоминаются Альбументации.

Мой фаворит — one Ильи Ларченко. Он использовал Streamlit для создания веб-приложения, позволяющего выбирать аугментации и их параметры для конкретной задачи.

Что я буду делать по-другому, если сделаю это снова?

Трудно сказать. Сейчас я пытаюсь научиться создавать стартап. Следовательно, если я работаю над открытым исходным кодом, у него должен быть способ монетизации — что-то вроде модели с открытым ядром, где у вас есть бесплатные функции для разработчиков и платные функции для предприятия.

Могу ли я конвертировать альбументации в Open-core? Скорее всего, но я не могу понять, как именно. Может быть, кто-то, кто читает этот пост, может написать мне и дать подсказку?

Что такое рентабельность инвестиций? Стоит ли тратить время на альбументации?

Трудно сказать, но я бы сказал — скорее всего. Это было очень весело. Каждый раз, когда кто-то говорил нам: «Спасибо» или просто упоминал о библиотеке, мы получали выброс дофамина.

В качестве бонуса я улучшил свои навыки программирования, и строка: «Соавтор альбументаций» может иметь некоторую ценность.

Я использую множество проектов с открытым исходным кодом, но я не знаю имен людей, которые их разрабатывают и поддерживают. То же самое. Большинство людей, которые используют Альбументации, не знают, кто является основной командой.

Но было исключение :)

Этим летом я был в Киеве. Однажды ночью мы с одной женщиной, Data Scientist, вышли прогуляться по ночному городу. Она использовала альбументации на работе и знала, что я был одним из основных разработчиков. Может случиться так, что она бы не вышла со мной, если бы не библиотека :)

Что насчет метрик?

Заключение

В заключение я хотел бы поблагодарить основную команду и всех участников. Открытый исходный код — странный зверь. Чтобы подружиться, нужно много времени :)

Если вы дойдете до этой части, я хотел бы попросить об одолжении:

  • Если вы пользуетесь библиотекой на работе, не могли бы вы попросить вашего менеджера добавить логотип компании на наш сайт? Если да — вам просто нужно перейти по этой ссылке и заполнить форму.
  • Если вы используете альбументации в своих научных проектах, было бы здорово процитировать нашу статью.
  • Запросы на вытягивание приветствуются, если вы нашли ошибку или у вас есть идеи по улучшению библиотеки.
  • Ну и конечно — если вы не поставили звезду репозиторию, пора это сделать :)

P.S. Русская версия текста.