Запрети мне псевдолейблить – Telegram
Запрети мне псевдолейблить
2.76K subscribers
153 photos
3 files
147 links
Канал о пути к Kaggle competitions (теперь уже) GrandMaster и пиве, которым обливаешься в процессе

Последний авторский канал про мл, претендующий на искренность и позволяющий ставить клоунов
Download Telegram
Рубрика "изи контрибьюшн" продолжается.

В прошлый раз я добавил зависимости для torchscale, всего одну строчку и тем самым сделал мир немного лучше. В этот раз я решил пойти дальше и внес изменение всего в одном символе.
Вот вам микроистория: Я экспериментировал с CatBoost, пытаясь запустить его на GPU, и обнаружил, что в списке доступных лоссов для GPU отсутствует MAE, хотя есть Huber. Это показалось мне странным, ведь Huber фактически является IF между MAE и MSE. Такого быть не может, что Huber написали, а вот в MAE какая-то серьезная проблема. После теста на Kaggle оказалось, что все работает, даже на MultGPU сетапе. Значит, ошибка была в документации.
Исправил документацию, согласился на бесплатную работу на Яндексе (у них своя лицензия на контрибьюшны), и мой пулл-реквест уже в мастере.

Думаю изменение чуть важнее, чем кажется на первый взгляд. MAE - один из самых популярных лоссов, и CatBoost действительно оптимизирован для GPU, что делает его более удобным и быстрым в обучении. Он просто работает из коробки. Я столкнулся с этой странной проблемой с недоступностью MAE для GPU несколько раз в прошлом, просто не проверяя ее. Заходил, видел что недоступно и шел дальше, ковырять любимый LGBM. Ганс, мы что, фанаты майкрософт? А оказалось, дело было в документации.
Вообще у CatBoost много документации, но она не всегда точная, несмотря на мои дифирамбы этой библиотеке. Так что, если вдруг вы хотите внести свой вклад в историю (даже на 356 месте 355 уже мое), внимательно прочитайте несколько страниц документации и обращайте внимание на детали. Глаз за что-нибудь зацепится.

Маленькие контрибьюшны делают библиотеку на 0.1% лучше, но уже сейчас. А вот MR моего бывшего коллеги с FocalLoss лежал в ревью больше года.
👍2122🔥1
🤑🤑🤑

На выходных буду готовить вам серию постов по UBC, который закончился 3 января и в котором ничего не получилось нафармить. Но тем ценнее уроки из него
🔥292
#UBC

Разбираем на этой неделе Ovarian Cancer Subtype Classification and Outlier Detection
Даны 700 гб png-картинок медицинских изображений. Конкретно- срезы тканей человеческиэ яичников. Картинки двух типов: большие и очень большие.
Большие картинки- это 3kX3k, очень большие- от 20kX2k до 32kX32k.
Задача- мультиклассификация на 6 типов рака. Все картинки- это какой-то рак, но нужно понять, какой конкретно.

Картинки имеют некоторые особенности- например один и тот же образец тканей может быть нарезана на несколько слайсов и нам все их покажут. Пример прикладываю. Организаторы для нас заботливо рескейлнули данные для самых больших картинок, чтобы мы на пережимку не тратили драгоценныый компьют и не увеличивали карбоновый след. Их мы будем называть 'thumbnails'.
Так же картинки двух типов:
WSI и TMA.
WSI- это очень большие на черном фоне и именно на них может быть несколько срезов
TMA- это просто большие и они обычно на белом фоне.

Еще одна особенность: в тесте ~40% TMA и ~60%, а вот в трейне это ~5% к ~95%.
Как метрика качества- balanced accuracy.
Медицинская сорева, а вы думали будет просто?
👍932🔥1
Я безумно люблю самообразовываться по разным темам, это один из моих способов расширять кругозор. К тому же, у меня канал про модели.

Однажды подруга мне сказала, что ей не нравятся фотографии, которые ей снимают окружающие. Я подумал, что это вообще распостраненная проблема и наверное скилл снимать лучше среднего может мне пригодиться. Я пошел и прочитал книжку, которую до сих пор всем советую: Модель. Проблемы позирования. Надо бы кстати перечитать.
После прочтения перестаешь сомневаться, что с твоими фотками что-то не так и учишься делать неплохие снимки, а потом еще и отделять неприятие человеком своей внешности от качества съемки. Книга- фундаментальная база всех лайфхаков съемки от инстаграм-блогерш.

В рамках того же паттерна еще с 2020 года я был подписан на Start Career in DS, как хороший источник материалов вокруг дс и базы, которую могут спросить на собеседованиях/можно посоветовать чуть менее опытным коллегам или студентам. Канал- это скорее источник постоянного планомерного прикладного образования нарезанного мелкими кусочками. Как раз то, что нужно на старте. Качаться сюда -> Start Career in DS
🔥18🌭1
#UBC

10 место:
Пример хорошего не кагглерского решения. Примерно так же задачка бы и решалась в продакшне.

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

Предобработка тоже довольно стандартная:
Для того, чтобы увеличить схожесть WSI и TMA у последних белый фон заменили на черный.
Маски для WSI-трейна порезали на тайлы и подогнали к размерам thumbnails. Потом отсротировали тайлы по заполненности масок и взяли топ 16 для обучения.
Для TMA, которые в дефиците сделали чуть иначе: Resize -> случайный даунскейлинг и возвращение к изначальному размеру -> flip/rotation -> Channel shuffle/Gaussian Blur/Imagenet Normalization

Валидация:
Обычный StratKFold с 5 фолдами. Стратифицировали по TMA/WSI и целевому классу.

Модель:
Обучили MaxViT Tiny FPN (это такой efficientnet в мире VIT, где добавили больше Conv слоев, чтобы работало быстрее и скейлилось хорошо)
На бекбоне EfficientNetV2 конечно же.
Как оптимизатор AdamW, CosineScheduler и AMP стало быть, включаем FP16, чтобы 15 эпох проходили как можно быстрее.

Постобработка:
Для тест тайма использовали 3xTTA (Test time augmentation. Учим модель на аугментациях, а потом в тестайме одну картинку несколько раз прогоняем через модель с разными аугами и усредняем результаты).

И того 10 место и решение на 10% хуже по BalancedAccuracy, чем у top1.
🔥145👍53
#UBC

9 место
Тут авторы совем не использовали внешних данных, но использовали интересную схема тренировки.

Препроцессинг:
Для начала, решили сделать отдельный if для определния wsi/tma в рантайме и не сильно полагаться на авторскую разметку. Просто они не знали, что для ускорения можно использовать простой советский polars

Если классифицированнваякартинка WSI- уменьшаем ее в 3 раза. Нарезаем на тайлы.

Во время тренировки фильтруем тайлы:
Используем все тайлы, если отношение фона/изображения больше 0.5
Если 0.65, то первые 50 тайлов.
Если 0.75, то первые 20 тайлов

Тренировка:
Далее идут три этапа тренировки:
Этап 1: Обычная тренировка, учим классы из трейна через BCE, верим в лучшее.
Этап 2: С помощью модельки с первого этапа генерируем что? Псевдолейблы!. Если такой лейбл выше 0.3, то округляем до единицы, иначе до нуля. И нашу сетку с первого этапа тренируем с нуля с лоссом: BCE(labels) + 0.3 * BCE(🤍️)
Этап 3: Берем веса с этапа 2 и используем 🤍️ для тренировки с уменьшеным lr. Теперь учимся на BCE(labels) + 0.15 * BCE(🤍️)

Для меня выглядит как костыльный вариант LabelSmoothing/OnlineLabelSmoothing, но ведь работает же.

Модель: Работали с бекбонами efficientnetb4 и efficientnet_v2s для maxvit_tiny.
Про отпимизатор не пишут

В комменты призываются все эксперты в современном компьютерном зрении, которые смогу объяснить, насколько распостранены такие нелобовые методы тренировки
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥733👍2🌭2
#UBC

Восьмое место: История как мощный китайский почти мастер нафармил последнюю медальку на грандмастера
TMA и WSI процессим совсем раздельно.

Начнем с TMA:
0. Берем внешний датасет TMA. В нем своя разметка на живые/мертвые патчи. Трейн соревы используем для валидации.
1. Для TMA в датасете соревы есть маски, так что гоняем только на патчах, которые затронули маску.
2. Тренируем аркфейс на патчах с мертвыми и здоровыми клетками из внешнего датасета, чтобы уметь выбрасывать возможные аутлаеры.
3. Тренируем в лоб на фичах экстрактора 'тяжелый' ансамбль для классификации на основе EffNet и ConvNext.

Во время инференса:
1. Ищем аркфейсом ближайший семпл из своего внешнего трейна и проставляем тот же класс.
2. Если близкий по косайну семпл не нашелся или предсказался мертвым- предсказываем 'тяжелым стаком' из EffNet в разршении 1280 и ConvNext в 1024.

Таким образом аркфейс покрывал 60% TMA в тесте и оставшиеся 40% уже прогонялись через тяжелые модельки. Учитывая размер данных- мощная экономия времени и как следствие возможность применять стак из 4 моделей для TMA.

Для WSI:
1. Берем фичэкстрактор arcface из части с TMA и извлекаем им фичи
2. Предсказываем класс 'другое' и если класс имеет большую вероятность- выносим его в отдельный список.
3. С помощью DFTD-MIL сгенерируем из нашей кучи 'других' WSI еще немного синтетических WSI.
4. На всем этом объеме учим DFTD-MIL.

Во время инференса:
1. Даунскейлим WSI до разрешения в 768
2. Извлекаем фичи фичэкстрактором для TMA из WSI-картинки
3. К фичам применяем DFTD-MIL и извлекаем фичи ансамблем EffNet и ConvNext
4. Предсказываем по ним DFTD-MIL головой

Про оптимизатор/валидацию новоиспеченный грандмастер не пишет, потому что с получения статуса такие вещи становятся очевидны.
👍11🔥32
Автор прошлого решения, Forcewithme уже попадал пару раз в мои разборы, но тут он добрался до грандмастера. У него довольно личная история:
Он три года подряд плотно решал каггл и мечтал о заветной золотой плашке. Шутка ли: 5 золотых, 13 серебряных и 4 бронзы. И вот остался его последни семестр, работа уже найдена, есть куча медалей, но сологолда нет. Уже пора семью заводить, работать работу и ездить на Volkswagen Golf, время прошло и он не успел. Но попытка за попыткой соло взять золото не удавалось:
Соло бронза в GoDaddy
Соло бронза в знаменитом по одному киприоту PetFinder
Соло серебро в ImageMatching с шейкдауном на 46 место с 20
Соло серебро Google Contrails
И вот наконец это соло золото!
🏆20👍11
Что вообще за MIL?
Это такой сетап задачи, когда у вас объект такой большой, что с ним неудобно работать. Можно конечно зарескейлить, но раки они бывают такие маленькие, что без лупы не разглядишь. Поэтому WSI картинки такие огромные. Мы ее режем на патчи и может так оказаться, что только на одном патче у нас рак, а все остальные здоровые. А лейбл у нас выдан конечно на всю картинку.
Для таких штук обычно извлекают сначала признаки каким-то одним экстрактором, а потом уже для этих фичей применяют аггрегацию.
Например можно просто взять MaxPooling и результат пихать в МЛП-классификатор. А можно пойти хитрее и применять attantion например. Вот в DFTD-MIL развивают этот подход и придумывают свой способ считать умную аггрегацию по картинкам.

Это не канал с обзорами статей, честно честно!
12🔥2👍1😁1
#UBC

Шестое место: мы просто победили
Сначала не хотел брать этих ребят в разбор, но потом подумал, что стоит показывать не только Wunderwaffe.
Парни вспомнили хорошую статью по классификации снимков. Парни ее применили. Парни получили 3 место на паблике и 6 на прайвете.

1. Нарезаем картинки на патчи. Берем из них 1000 патчей. Если патчей не хватает- дублируем случайные до тех пор, пока не наберется тысяча.
2. Используем веса модели из статьи в разрешении 1000x768
3. Для MIL используем модельку из другой статьи. Запомните этот Chowder, мы о нем еще вспомним в грядущем посте. Если посмотреть картинки в статье, там даже на наши данные все похоже!
4. Ансамблим 7 разных обобщающих моделей из прошлого этапа и детектируем 'other' по средней энтропии (-sum(p*log(p))
5. Подбираем для other порог отсечения

Что могло бы улучшить, но как-то было лень заводить:
Можно было патчи выбирать не случайно, а с помощью небольшого (всего 5 млн параметров) трансформера

Картинка не является высказыванием, просто я искал 'Simple solution' и кекнул с результата
👍11😁4
#UBC 🚀

Место 5 🥳
Пайплайн этой модели оптимизирован для быстрой обработки крупных изображений. И совсем без MIL фреймворка. Пайплайн из двух больших кусков:
Глобальная сегментационная модель для предвыбора тайлов в WSI
1. Модель классификации тайлов (только для трейна) 🎨
2. Модель сегментации тайлов (только для трейна) 🖌️
3. Модель сегментации тайлов (для инференса) 🧩

Модель первая - это классификационная модель тайла с глобальным лейблом всей картинки. Основана на ConvNeXt. Обучена на порезанных на кусочки изображениях размером 1536x1536. Претренирована на внешних датасетах с лейблом 'other' для типов рака, которых нет в сореве.

Модель вторая - сегментирует раковые образования по маскам соревнования. Бекбон SEResNeXt и тренируется на данных соревнования.

Модель третья - более сложная. Генерирует лейблы следующим образом:
1. Первой моделью генерируем метки для всего тайла.
2. Прогоняет все изображения через вторую модель, сохраняя сгенерированные маски.
3. Блендит результаты двух моделей попиксельно для каждого тайла попиксельно: 0.5 * model1 + 0.5 * model2. Для классификации используется вероятность, вытянутая обратно в размерность маски для тайла. Пример такой маски на картинке
Для тренировки используется SEResNeXt101, обученный на сегментацию как UNet. Эта модель выбирает тайлы для классификации.

Глобальная классификационная модель для тайлов:
1. Берется случайный кроп 1536x1536.
2. Тренируется модель на глобальном таргете по всей картинке. Используется как базовая модель. Если уверенность ниже 0.3, тайл помечается как 'other', если выше 0.6 - используется предсказанный лейбл.
3. Тренируется модель уже на этих псевдолейблах, используя ConvNext.

Теперь обе глобальные модели используются для инференса:
0. Предсказывается хитмап сегментационной моделью для WSI. Выбираются топ-5 тайлов по уверенности.
1. Предсказываются эти 5 тайлов (или один ресайз TMA картинки) глобальной моделью классификации с TTA с помощью StainNorm для глобальной нормализации.
И вот вы уже на 5 месте! Поздравляем! 🎉

Что можно себе забрать:
1. Используйте StainNorm для работы со снимками с профессионального оборудования
2. Псевдолейблинг как способ сделат дешевый псевдоэттеншн для около-MIL задач.
7👍4
#UBC

3 место: Немецкий Любитель Хайка

Игры с данными:
Интересно подошел к разметке внешних датасетов: когда лейблы в датасетах не метчились идеально на лейблы соревнования (например в одном из внешних источниокв данных таргеты HGSC и LGSC были объеденены в один класс), он доразмечал данные своим претрейном. Мол моделька тренированная на другом датасете говорит, что больше на HGSC похоже, значит такую метку и поставим.
Сегментационные маски тоже использовал для создания псевдоTMA. Если на тайле нет маски, то просто помечал ей класс как Other.

Пайплайн:
Автор вложил значительные усилия в отладку пайплайна обработки полных изображений, нарезку и филтр пустых тайлов. В итоге выбрал pyvips как библиотеку для работы и ошибся. Мы с Сережей тоже много времени убили на то, чтобы заставить модели работать на полных картинках при учете ресурсов Kaggle на инференс. Это настолько было душно, что Сережа родил бенчмарк для загрузки png картинок и работы с ними и начал тестить на скорость разные либы для аугментации. К сожалению мы как-то не подумали, что можно ГУГЛИТЬ и не нашли Chowder и вообще MIL подходы. Может сидели бы сейчас довольные на охоте. На охоте крепкое. Но посты почитайте, там прям хорошее честное и главное актуальное сравнение.

Модель:
Вдохновленный статьей, фокусирующейся не столько на SOTA в данной области, сколько на сравнении методов. Автор выбрал Lunit-DINO претрейн в качестве базовых весов. Удивительно, что веса были специально обучены на медицинских снимках. Он использует FP16 для ускоренного извлечения признаков. Вместо подхода MIL, предпочел CLAM. Кстати очень забавная статья: ее писали арабы из Mahmood Lab, так что все картинки и схемы справа налево 🕌. Основное отличие- для аггрегации признаков извлеченных из картинок используем модельку на основе эттеншна, а не GRU.

P.s.
Редкое явление, но автор дает обзор своего сетапа: домашний компьютер с GTX 4090. 6 часов на извлечение фичей из всех изображений и еще час на тренировку.
Еще дает глубокие размышления о переобучении модели и вывод, что сходство данных одного пациента приводит к ограниченной генерализации. Модель, кажется, более склонна к выучиванию конкретных срезов и снимков, вместо того чтобы обобщать глобальные закономерности. Критериям решения о оверфите, к сожалению, не делится.
👍8🔥32
Кагл теперь будет вознаграждать за лучшие райтапы.

Смотрите на тренд:
1. Сначала стали давать мерч за топ-50 лучших описаний. Прописали нужные параграфы для каждого райтапа и основные вехи, но это повлияло скорее на количество, чем качество райтапов. Обычно описаний было меньше 50, так что шанс залутать майку был 100%. К сожалению это создало неприятную ситуацию, когда райтапы сделаны для того, чтобы получить фиксированный мерч и особой ценности не несут.

2. Затем сами организаторы стали давать дополнительные призы за writeup. Это уже увеличило качество описаний и их объем. Но качество райтапа все же корелированно с местом на ЛБ, так что получаем из 20-30 топовых мест примерно пятидесятипроцентную конверсию в хорошие описания. Кстати, денег нам в итоге дали именно по этой программе

3. Теперь еще и Kaggle стал выдавать грант на год за лучшие описания.

Выглядит так, будто Alphabet наконец понял, зачем они купили Kaggle себе и толкают его в комьюнити-образовательную платформу. К этому еще и все более плотная интеграция колаба и каггла подталкивает. За 8 лет с момента покупки очень многое изменилось.
🔥122👍1😍1
#UBC

Первое место, дело престижа (часть первая)

Занял
его стартап, который делают авторы уже несколько раз упомянутого Chowder. Собственно цель стартапа- анализ WSI снимков.
Кстати, Чаудер- это такой суп густой. Сегодня обязательно приготовлю в честь этих ребят

Хайлайты:
1. Своя foundation model для клеточных снимков- Phikon. (Статья). Берем ее на заметку, чтобы решать WSI-соревы, которых в последнее время стало много. Это такой VIT-transformer, который уже видел огромную кучу снимков.
2. Chowder- как MIL пайплайн. Вышел в 2020 году, все еще не хуже более свежих DTFD-MIL и TransMIL. Еще и ансемблируется сам с собой хорошо.
3. Вложились в быстродействие. Сережа написал хороший пост с разбором того, как именно: там и Ray, и кастомные тулы на С и даже немного классического CV. Подписывайтесь на его канал уже.
Меня очень вдохновляет история с кастомной тулой на C. В какой-то момент я даже сел похожую писать конечно на Rust, но стало лениво загружать в датасеты компилятор и сорсы и ставить его в энве без интернета.

Данные:
Не использовали внешние данные. А оно и не надо, потому что они хостят модель для снимков, которая уже была достаточно претренирована на WSI снимках.
Все большие картинки обрезали по thumbnails: выделяли трешхолдом яркости не пустые регионы и уже по координатам вычисляли, какой патч надо вырезать с полной картинки для модели.
Затем для TMA делали ресайз, чтобы размер клеток соответствовал размеру WSI. Во время анализа выяснили, что 38 WSI были неправильно предобработаны и их ресайз не соответствует ресайзу прочих. На прикрепленной картинке например видно, что размер красных кровяных телец на них другой, нежели в большинстве снимков. Это было довольно важно, потому что эти сломаные картинки почти все относились к одному классу и тем самым вносили шум в модель.
👍9🔥32
#UBC

Первое место, дело престижа (часть вторая)

Модели:
Для демонстрации превосходства своего пайплайна на Chwoder + Phikon (их balanced acc 0.66 против второго места с 0.61), совершенно пижонски не тюнили гиперпараметры, а подобрали их на глаз.
Оптимизатор AdamW (классика для трансформеров в больших задачах), lr=10-e4, weight_decay=10-e3 b тренировка на CE. Никаких вам focal loss.

50 Chowder-моделей в каждом из 5 фолдов с разными инициаллизациями и усреднение. Мало того, они еще и каждый вес трижды рестартили. В итоге получилось 5 x 50 x 3 моделей. Все из них откалбировали на внутренней валидации. Немного помог отбор 65 лучших по внутренней валидации моделей.
Для того, чтобы фильтровать выбросы, которые были в тесте, но которых не было в трейне использовали трешхолд по энтропии H = -sum(p*log(p)), который подобрали по лб

Трюки для инференса:
Натренировали маленький resnet18 определять, является ли картинка TMA или WSI, чтобы в рантайме определять, в какую ветку пайплайна ее отпускать.
Т.к. использовали довольно маленькие патчи (224p), их получалось 10к+ для каждой WSI картинки. Решили семплировать из всех 200 патчей и работать на них. Для TMA проблемы семплирования не было- из-за нормализации размера там и 50 патчей не набиралось.

И классические выводы:
1. Если вы вдруг делаете технологический стартап- заглядывайте на каггл. Вдруг захостят задачу под вас и вы бесплатно заявите о себе
2. Читать статьи по научным задачам- довольно полезно. В этом соревновании в топ-10 есть минимум 3 команды, которые просто нагуглили Chowder, завели его и попробовали.
3. Для будущих соревнований по снимкам попробуйте Phikon, а если там еще и что-то похожее на MIL, то конечно Chowder. Парни не зря стараются, они для нас делают
4. Анализируйте даже картиночные данные. Вот тут кластеризация помогла найти ошибку предобработки организаторов и дала немножко скора
7🔥3
Пока собираюсь с силами, чтобы разобрать Enefit пошерю вам красивое
5
Forwarded from 🗞 Виз Ньюз (Nikita Rokotyan)
This media is not supported in your browser
VIEW IN TELEGRAM
📖 Коллекция иллюстраций об устройстве нейросетей начиная аж с 1943 года. Есть на что посмотреть.

Картинки: https://philippschmitt.com/blueprints-for-intelligence/

Эссе: https://philippschmitt.com/blueprints-for-intelligence/introduction
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17
Вас остановила полиция репостов за неуказание источника. С вас штраф: поцелуйчик. Впредь будьте аккуратнее
6💋5