BirdCLEF+ 2025 — очередная часть ежегодного соревнования от Cornell Lab of Ornithology по распознаванию звуков дикой природы. В этом году участникам предстало предсказывать целевое животное на коротких фрагментах записи, балансируя между качеством моделей и жёсткими ограничениями железа.
Описание соревнования
Вот тут полный пост с описанием
Данные
– Объём: 12 ГБ аудиозаписей птиц, насекомых, амфибий и рептилий.
– Источники: xeno-canto.org, iNaturalist, Colombian Sound Archive (CSA), причём первые два — чистый краудсорс, разметка «грязная»:
у части семплов встречаются продолжительные комментарии колумбийского натуралиста на испанском;
муха залетает в микрофон и гудит 40 секунд из 50-секундной записи птицы;
запись птицы обрывается громким «бултых», а дальше полная тишина на 90 сек.
Разметка
Основной лейбл — целевая живность.
Вторичный лейбл — другие слышимые виды.
Координаты, автор записи и источник.
Оценка качества (только для xeno-canto).
Трейн/тест сплит
– Train: полные аудиофайлы.
– Test: нарезки по 5 сек.
Например, из записей 30 сек и 20 сек получится 10 тест-семплов: первые 6 с лейблом первой записи, остальные 4 — второй.
Метрика
Macro-ROC-AUC: сортировка вероятностей внутри каждого класса и усреднение без учёта частоты.
Ограничения по железу
90 минут CPU-only.
Тренд: в 2022 и 2021 — по 9 часов CPU/GPU, в 2023–2024 — 120 мин CPU, а в 2025 — уже 90 мин.
5-е место: «секретная техника» ручной обработки
Построен на ручной предобработке

Это вообще та самая «секретная техника», которую все ленятся делать. Данные полезно ковырять/слушать смотреть руками.
Silero для поиска фрагментов с человеческим голосом: затем вручную вырезали все «человеческие» участки.
Для классов с низкой частотностью (< 30 семплов) прослушали все записи и вычистили «тишину» и шум.
В трейне брали первые 30 сек записи (для редких классов — 60 сек), а там, где семплов было меньше 20, апсемплили, чтобы «разудеть» трейнинг.
Модели: стэк из EfficientNet’ов (4 × v2_s, 3 × v2_b3, 4 × b3_ns, 2 × b0_ns).
-
Тренинг в три стейджа (FocalLoss, Adam, Cosine Annealing + warmup):
Только основные данные и основной таргет.
псевдолейблы и двухэтапная самодистилляция.
Все данные: в батче 50 % размеченных (основные лейблы + псевдолейблы), 50 % — неразмеченных (только псевдолейблы), плюс две итерации самодистилляции.
4-е место: когда простота выигрывает
Иногда простота выигрывает. Поскольку на BirdCLEF нас оценивают именно по AUC, логично оптимизировать его напрямую.
SoftAUCLoss — реализован класс SoftAUCLoss(nn.Module), считающий pairwise-разности и log-loss, устойчивый к переобучению, но поддерживающий soft-labels.
Semi-supervised learning: сначала 10 моделей обучили на размеченной части, сгенерировали псевдолейблы для неразмеченных, затем обучили новый раунд на объединённом наборе.
Отказались от самодистилляции и сложных схем — «не заводилось».
3-е место: спектрограмма, Model Soup и аугментации
Данные: дополнили 2025 год 80 % данных 2023 и добавили 112 новых классов (20 % оставили на валидацию). Псевдолейблили неразмеченную часть.
Модели: «зоопарк» на двух видах спектрограмм (tf_efficientnet_b0_ns, v2_b3, v2_s.in21k, mnasnet_100, spnasnet_100).
-
Приёмы:
Семплировали случайные отрезки вместо честной нарезки по 5 сек.
Добавляли человеческий голос для аугментации.
FocalLoss и Model Soup (усреднение весов чекпоинтов для стабильности без тяжёлых ансамблей).
Post-processing with power adjustment: усиливали n самых уверенных предсказаний, занижая остальные.
2-е место: баг Xeno и проверенные рецепты
Опыт прошлых соревнований довольно сильно решает, особенно если помнишь интересные баги.
Данные: предыдущие соревнования + баг Xeno Archive (максимум 500 семплов на вид).
Предобработка: первые 7 сек файла, из которых рандомно вырезали 5 сек.
Архитектуры: tf_efficientnetv2_s + RAdam, eca_nfnet_l0 + AdamW, 50 эпох, Focal+BCE, Cosine LR.
-
Sample_weights для компенсации дисбаланса:
pythonCopyEditsample_weights = ( all_primary_labels.value_counts() / all_primary_labels.value_counts().sum() ) ** (-0.5)
CopyEdit
sample_weights = ( all_primary_labels.value_counts() / all_primary_labels.value_counts().sum() ) ** (-0.5)
-
Ключевые бусты:
Предтренинг на всём Xeno Archive (0.84 → 0.87).
Псевдолейблинг в два раунда (0.87 → 0.91).
TTA со сдвигами влево/вправо на 2.5 сек (0.91 → 0.922).
Победитель: Никита Бабич

Никита всё соревнование доминировал — ни разу не видел его ниже второго места.
Данные:
– +5 489 записей птиц из Xeno Archive;
– +17 197 записей насекомых и амфибий для прокачки моделей на «других» классах.SED-модели (Sound Event Detection): точная рамка начала и конца событий, мост от per-sample к per-frame разметке.
Валидация: «Нормальной валидации не нашлось, поэтому Никита валидировался по ЛБ.»
-
Многоэтапное обучение:
Бейзлайн (Cross-Entropy, AdamW, Cosine, EfficientNet-0 + RegNetY-8) — 0.872.
Псевдолейблинг I + MixUp + StochasticDepth — 0.872 → 0.898.
Power Scaling + псевдолейблинг II (4 раунда) — 0.898 → 0.930.
Отдельный пайплайн для насекомых и амфибий — 0.930 → 0.933.
Финальный ансамбль: EfficientNet-l0, B4, B3; RegNetY-016; RegNetY-008; EfficientNet-B0 для амфибий/насекомых.
Ключевые идеи для себя
PowerTransform для псевдолейблов, чтобы идти в несколько раундов.
SED как способ уточнить разметку на псевдолейблах.
Благодарю за внимание!
Если хотите первыми узнавать о новых разборах соревнований и инсайтах из мира машинного обучения на Kaggle, как вы уже догадались — приглашаю в мой Telegram-канал: t.me/pseudolabeling