:D

kaggle 鳥コンペ2 振り返り

はじめましての方ははじめまして. 普段,sqrt4kaidoという名前でkaggle等のコンペに参戦しています.

先日まで,BirdCLEF 2021 - Birdcall Identificationというコンペ(以降,省略のため鳥コンペ2と呼びます)に参加していました. 本記事では,鳥コンペ2における概要,解法の傾向,自分の結果を簡単に振り返りたいと思います.

鳥コンペ2 概要

本コンペは,昨年開催されたCornell Birdcall Identificationというコンペの続きにあたるようなコンペで, タスク設定もよく似ていました.(区別のために,こちらを鳥コンペ1と呼びます.)

具体的には,

  • 学習: 各音データにおいてどの種類の鳥が鳴いているかを学習
  • テスト: 長い音データの5秒ごとに,どの種類の鳥が鳴いているのか,はたまた鳴いていないのかを予測

というタスク設定でした.

f:id:sqrt4kaido:20210605023719p:plain

詳しい鳥コンペ1の概要,ポイントなどはこちらのブログに詳しく書いてあります.

鳥コンペ2では,鳥コンペ1と比べて以下のような違いが有り,
これらの情報をどう活かすのかも1つの注目ポイントでした.

  • サイト(録音場所)に関する情報の追加
  • 音データ整頓(サンプリングレートが統一されていた)
  • testデータと同じ形式(長い音データと,5秒ごとの正解ラベル)のvalidationデータの提供

解法の傾向

解法について,鳥コンペ1からどのような変化が見られたか,私の見解を説明します.

以上のような拡張と,鳥コンペ1と似たタスクというのもあって,解法も鳥コンペ1より多様性が多いように感じました. というのも,鳥コンペ1では,公開ノートブックSEDモデル(Sound Event Detection)が多くのコンペ参加者に影響を及ぼし, 大方の解法が,このモデルをどう精度良くするか,どう活かすか工夫したものでした.

一方で,鳥コンペ2では,鳥コンペ1では取り組めなかったようなところにフォーカスしているチームが多かったように思います. 個人的には,閾値決定1の後処理にそれを大きく感じました.

例えば,1位のチームは,閾値の決定にTernary searchというアルゴリズムを用いたようです.これに関しては現時点で全然理解できていないため,勉強します…

また,2位のチームは,閾値を,予測確率のパーセンタイルから決定していました.こうすることで常に同じ量のレコードを予測しているので,予測の質が向上すれば,スコアも向上するとのことです.

他にも,分布関数をフィッティングさせて各鳥における閾値を算出していたチームも有りました. 参照

自分の結果と解法

結果は,shake downして72位でした.銀以上を狙っていたので,悔しい. f:id:sqrt4kaido:20210604030833p:plain

供養の意味も込めて,自分の解法も簡単に載せておきます.

学習

モデルはSEDを用いました.音データはランダムに10秒切り出し,melspectrogramに変換しています.
モデルの特徴量抽出には,efficientnet-v2(b0)を用いました.

Data Augmentation

Data Augmentationは以下を用いました.

  1. gause noise
  2. background noise
  3. time stretch
  4. gain
  5. pitch shift

Secondary label

各音データにおいては,主ラベルの他に,Secondary labelも0~複数個ついていたので,これを使いました.
具体的には,以下の2パターンを用いました.

  1. label smoothing

Secondary labelは,Primaly labelより信用度が低いと思ったので,labelを0.9にしました.

  1. mask loss

これは鳥コンペ1におけるアイデアからですが,Secondary labelの種に関してはmaskをかけ,lossを計算しないようにしました.

後処理

音データのある区間で鳥が見つかった場合,他の区間でその鳥が見つかる確率を0.2程上げました.

まとめ

簡単には,以下の二点が足りていなかったと感じています(もっとたくさん足りない部分は有りますが).

  • 鳥コンペ1で効かなかった方法の深堀り(call/nocallの二値分類モデルとか)
  • 後処理に関するEDA

しかし,個人的に音データに関するコンペにはとてもやりがいを感じるので,これからもチャレンジしていきたいです.

ではでは.


  1. テストデータにおいて,何も鳴いていない際は「nocall」を出力する必要があったため,予測確率においてその閾値を決定する必要が有りました.