BirdCLEF+ 2025 — очередная часть ежегодного соревнования от Cornell Lab of Ornithology по распознаванию звуков дикой природы. В этом году участникам предстало предсказывать целевое животное на коротких фрагментах записи, балансируя между качеством моделей и жёсткими ограничениями железа.


Описание соревнования

Вот тут полный пост с описанием

Данные
Объём: 12 ГБ аудиозаписей птиц, насекомых, амфибий и рептилий.
Источники: xeno-canto.org, iNaturalist, Colombian Sound Archive (CSA), причём первые два — чистый краудсорс, разметка «грязная»:

у части семплов встречаются продолжительные комментарии колумбийского натуралиста на испанском;
муха залетает в микрофон и гудит 40 секунд из 50-секундной записи птицы;
запись птицы обрывается громким «бултых», а дальше полная тишина на 90 сек.

Разметка

  1. Основной лейбл — целевая живность.

  2. Вторичный лейбл — другие слышимые виды.

  3. Координаты, автор записи и источник.

  4. Оценка качества (только для 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):

    1. Только основные данные и основной таргет.

    2. псевдолейблы и двухэтапная самодистилляция.

    3. Все данные: в батче 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).

  • Приёмы:

    1. Семплировали случайные отрезки вместо честной нарезки по 5 сек.

    2. Добавляли человеческий голос для аугментации.

    3. FocalLoss и Model Soup (усреднение весов чекпоинтов для стабильности без тяжёлых ансамблей).

    4. 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)

  • Ключевые бусты:

    1. Предтренинг на всём Xeno Archive (0.84 → 0.87).

    2. Псевдолейблинг в два раунда (0.87 → 0.91).

    3. TTA со сдвигами влево/вправо на 2.5 сек (0.91 → 0.922).

Победитель: Никита Бабич

Никита всё соревнование доминировал — ни разу не видел его ниже второго места.

  • Данные:
    – +5 489 записей птиц из Xeno Archive;
    – +17 197 записей насекомых и амфибий для прокачки моделей на «других» классах.

  • SED-модели (Sound Event Detection): точная рамка начала и конца событий, мост от per-sample к per-frame разметке.

  • Валидация: «Нормальной валидации не нашлось, поэтому Никита валидировался по ЛБ.»

  • Многоэтапное обучение:

    1. Бейзлайн (Cross-Entropy, AdamW, Cosine, EfficientNet-0 + RegNetY-8) — 0.872.

    2. Псевдолейблинг I + MixUp + StochasticDepth — 0.872 → 0.898.

    3. Power Scaling + псевдолейблинг II (4 раунда) — 0.898 → 0.930.

    4. Отдельный пайплайн для насекомых и амфибий — 0.930 → 0.933.

  • Финальный ансамбль: EfficientNet-l0, B4, B3; RegNetY-016; RegNetY-008; EfficientNet-B0 для амфибий/насекомых.

Ключевые идеи для себя

  1. PowerTransform для псевдолейблов, чтобы идти в несколько раундов.

  2. SED как способ уточнить разметку на псевдолейблах.


Благодарю за внимание!

Если хотите первыми узнавать о новых разборах соревнований и инсайтах из мира машинного обучения на Kaggle, как вы уже догадались — приглашаю в мой Telegram-канал: t.me/pseudolabeling

Комментарии (0)