鳥コンペ三部作についてざっくり振り返りたい

# はじめに
この記事は[Kaggle Advent Calendar](https://qiita.com/advent-calendar/2021/kaggle)12日目の記事です。
この記事では、去年から今年に渡って行われた3つの鳥の鳴き声をテーマにしたコンペについて参加者の視点から振り返ります。
かなりうろ覚えの記憶を遡りながら書いているので、時系列や事実と異なっている点がありましたらそっと優しく教えていただけるとありがたいです。🙇‍♂️

## 自己紹介
今年の夏に話題になった某映画のCGを作ったりしているCG映像制作会社でソフトウェアエンジニアをやっている新卒Kagglerです。
2019年ごろから本格的にKaggleに参加しており、鳥コンペ三部作目であるBirdCLEF 2021で金メダルを取得しCompetitions Masterになりました。
在学中はロボットビジョンの研究をしており、コンペにおいても画像ドメインのものに参加することが多いです。
業務ではCGなどのドメイン知識の勉強をしつつ、機械学習・深層学習の実用化に向けて研究開発を行っています。

## この記事で書くこと
* それぞれのコンペについての概要
  * 問題設定
  * データ
  * 評価指標
  * 期間
* コンペ期間中のトレンド
* コンペの大まかな解法
* ポエム

## この記事で書かないこと
* 解法の詳しい解説
  * ある程度リンクは振ってありますが詳しくは各チームの解法ページを参考にしてください


# 鳥コンペ三部作とは
2020年6月開始の「Cornell Birdcall Identification」、2020年11月開始の「Rainforest Connection Species Audio Detection」、2021年4月開始の「BirdCLEF 2021 - Birdcall Identification」をまとめて自分が（勝手に）そう呼んでいます。
それまでKaggleにおいて音声を扱ったコンペティションは少なく、年単位であるかないかくらいでした。そんな状況において立て続けに同じようなテーマのコンペが続いたことはとても印象的であり、参加者にとって音声データに対する多くの知見の蓄積があったと感じています。
これら3つのコンペに参加して得られた知見や、コンペ期間中のトレンドなど紹介していきます。

## [Cornell Birdcall Identification(通称：鳥コンペ1・🦜コンペ)](https://www.kaggle.com/c/birdsong-recognition/)  
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211495/ca3cfcd1-2293-293a-d2d2-58d27522132b.png)

## [コンペ概要](https://www.kaggle.com/c/birdsong-recognition/overview)   
このコンペでは、コーネル大学鳥類学センターの保全生物音響学センター（CCB）がホストをやっており、野外で収集された音声データの中から野鳥の鳴き声を高精度で検出することで、野鳥の生息地の変化をより正確に監視し自然保護に繋げたいというモチベーションがあります。 
音声データには対象となる鳥以外にも多くの生物・非生物が発するノイズが含まれています。
データを分析するためにはノイズに対処するためドメイン知識を持った専門家が人力で分析を行うことが多く、手間がかかる上に分析結果の質が良くないことが多いそうです。
そこで問題設定としては、音声データの中に含まれている鳥の鳴き声を検出し、どの種類が存在するか推定するというものになっています。
予測対象の鳥の種類は264種で1つの音声データに対して複数のラベルを付けることができるため、264クラスのマルチラベル問題として解釈する人が大多数でした。(鳥の鳴き声がないことを示す`nocall`を含めて推論しなければいけないのですが、扱いは人によって多少異なっていました) 

### [データについて](https://www.kaggle.com/c/birdsong-recognition/data)
学習に用いることができるデータは[xenocanto.org](https://xeno-canto.org/)にアップロードされているものの一部がKaggleから提供されています。(後に参加者によるクローリングにより全てのデータが使えるようになりました) 
音声データの他にxenocanto.orgから得られたメタデータも含まれています。
テストデータは北米の三地点(sites 1, 2, 3)で収集されたもので、それぞれ地点によって予測対象が異なります。
site 1, site 2で収集されたデータは5秒ごとに何の種類かのラベルがついていますが、site 3からのデータではファイル別にラベリングされています。
この地点が分かれているのはテストデータのみのため、テストデータでは`test.csv`の`site`行によって処理を変える必要があります。
また、このコンペはコード形式であると同時にテストデータがSubmit時にしか全て用いることができないようになっているため、初期に参加者を混乱に陥れました。

### [評価指標](https://www.kaggle.com/c/birdsong-recognition/overview/evaluation)  
評価にはrow-wise micro averaged F1 scoreというものが用いられました。
見慣れない評価指標ですが、sklearnの`f1_score`の引数である`average='samples'`を指定することで計算することができます。

### [期間](https://www.kaggle.com/c/birdsong-recognition/overview/timeline) 
2020年6月16日から2020年9月15日までの期間で開催されました。

### コンペ期間中のトレンド・参加者動向など 
コンペが始まってから数週間は上記の特殊な形式により誰もまともな結果の提出(sample submission以上のもの)が行えてないという状況が続きました。
しばらくして[araiさんの神notebook](https://www.kaggle.com/hidehisaarai1213/inference-pytorch-birdcall-resnet-baseline/)が公開され、これをもとに提出に漕ぎつけられる人が多かったように感じます。(筆者もその1人でした)
このnotebookでは学習済み重みを公開されていなかったため、スコアを再現するのに苦労したのを覚えています。(参加者の意欲を駆り立てる賢明な判断でした)
これを手がかりに、自分のモデルで提出できる人が増え、[CNN以外のモデル](https://www.kaggle.com/takamichitoda/birdcall-wavenet-very-very-small-baseline)や[ノイズの除去](https://www.kaggle.com/dhananjay3/background-removal-using-nussl)などを試みる参加者が増えてきました。

中盤に入ると[tawaraさんの謎に強いbaseline notebook](https://www.kaggle.com/ttahara/training-birdsong-baseline-resnest50-fast)が出現し、LBの水準がグンと引き上げられました。
当時はまだ[ResNeSt](https://arxiv.org/abs/2004.08955)が発表されてから日が経っておらず、実際にKaggleで効果を実証したのは初めての例だったと思います。(それ以前の事例があればすいません)
また、ラベルの多くを占める[`nocall`の扱い](https://www.kaggle.com/c/birdsong-recognition/discussion/176368)や[閾値など後処理](https://www.kaggle.com/c/birdsong-recognition/discussion/180028)の考察がDiscussionで話題になっていたように感じます。

中後半になるとLB1位を独走していたaraiさんの[SEDモデルを用いたnotebook](https://www.kaggle.com/hidehisaarai1213/introduction-to-sound-event-detection)が公開されます。SEDモデルはAttention mapを使うことでラベルとして明示的に与えられていない時間的位置を推論することができるというものです。
このnotebookが与えた衝撃は大きく、公開された解法での使用率を見るにこのコンペに与えた貢献は大きかったと感じます。このnotebookでも学習済みモデルが公開されておらず、学習に必要な要素が多少隠されていたためコンペ終了までこのスコアを超えられなかった参加者は多くいました。

### コンペの際立った解法　　 
上位陣の多くはaraiさんがnotebookで提案したSEDモデルをベースとした解法を組み上げていました。
理由としては、前述のようにtrainデータにはファイル別にしかラベルがついていないのに対して、testデータ(のsite1, site2)では5秒おきにラベルを推論しなければならず時間的位置を暗黙的に推論することができるSEDモデルはかなりタスクとの相性が良かったことが挙げられます。また、学習時に推論に必要な最小時間(5秒)を用いるのではなく、できるだけ長い時間の音声clipを用いて学習することがノイズ軽減に役に立ちました。コンペを解くために必要な基本的なアイディアは[araiさんの6th solution](https://www.kaggle.com/c/birdsong-recognition/discussion/183204)にまとまっているのでおすすめです。 

[単純なCNNモデルを用いて上位獲得したチーム](https://www.kaggle.com/c/birdsong-recognition/discussion/183199)もありましたが、学習済みモデルを用いた効率的なサンプリングなど、ノイズを削減するための手段が取られています。
また学習データについて、クローリングを用いて取得したデータを外部データとして使っているものや外部データから`nocall`だけのデータを作成し活用する解法も多く見られました。

余談ですが、筆者はかろうじて銀圏にぶら下がることができましたが、tawaraさんのbaselineから大きく変えることができず(SED modelも機能させられなかった)、site1, 2の閾値を触ってスコアを上げるセコい真似をしたりしていました。

## [Rainforest Connection Species Audio Detection(通称：熱帯雨林コンペ・🦜🐸コンペ)](https://www.kaggle.com/c/rfcx-species-audio-detection/)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211495/ba0a3f4a-f751-8915-7c91-ab975c029ca7.png)
#### [コンペ概要](https://www.kaggle.com/c/rfcx-species-audio-detection/overview)
モチベーションとしては、鳥コンペ1と同じですが、予測するべきラベルに鳥以外にカエルが含まれていたり、データがコンペ名の通り熱帯雨林で収集されたものを用いています。
問題設定としては、鳥コンペ1と同じくマルチラベル分類です。
鳥コンペ1と大きく異なる点として、このコンペではファイルごとの種を予測しないといけない点と、与えられているデータの中にTPラベルとFPラベル・周波数領域のアノテーションが含まれている点、コード提出形式ではなくCSVを提出する形式であったことが挙げられます。
他にも賞金のカテゴリで`TPU Star Prizes`というTPUを使った優秀なnotebookを公開した人に与えられる賞がありました。


### [データについて](https://www.kaggle.com/c/rfcx-species-audio-detection/data)    　
先にも述べた通り、このコンペでは他の多くのコンペとは異なり、TPラベルとFPラベル・周波数領域のアノテーションが含まれている学習データが提供されました。FPラベルがあるところから察することができる通り、アノテーションのTPラベルも完全なラベリングとは言い難い不十分なものでした。

### [評価指標](https://www.kaggle.com/c/rfcx-species-audio-detection/overview/evaluation)  
このコンペの評価指標はlabel-weighted label-ranking average precision(lwlrap)を用いていました。
この評価指標は過去の音声コンペである[Freesound Audio Tagging 2019](https://www.kaggle.com/c/freesound-audio-tagging-2019)で用いられたもので、性質としては行ごとのAUC指標とよく似ていて、それに気づき[magicを実装する人](https://www.kaggle.com/c/rfcx-species-audio-detection/discussion/220389)もいました。
この指標の計算や挙動については[日本語で書かれた解説notebook](https://www.kaggle.com/osciiart/understanding-lwlrap-sorry-it-s-in-japanese)がわかりやすいです。

### [期間](https://www.kaggle.com/c/rfcx-species-audio-detection/overview/timeline)  
2020年11月18日から2021年2月17日の期間で開催されました。

### コンペ期間中のトレンド  
このコンペでは直前に似たような課題設定の鳥コンペ1が開催されていたこともあり、序盤に公開されたnotebookのアプローチの土台はそれを継承したものが多かったと感じます。
また、tfrecordが提供されていたためそれを活用したnotebookも多く登場しました。
他にもvoteが多いnotebookとしては[araiさんが鳥コンペ1で用いたData Augment手法をまとめたもの](https://www.kaggle.com/hidehisaarai1213/rfcx-audio-data-augmentation-japanese-english)があり、このコンペに限らず音声分野において有益な資料となっています。

中盤になると[ホストからの情報提供](https://www.kaggle.com/c/rfcx-species-audio-detection/discussion/197866)があったこともあり[FPラベルの扱い方に関する話題](https://www.kaggle.com/c/rfcx-species-audio-detection/discussion/207624)がdiscussionで盛り上がっていました。
また他にも、有益かつ興味深い視点なdiscussion topicで知られるケロッピ先生が建てた[FPラベルを活用するための学習方法についてのdiscussion](https://www.kaggle.com/c/rfcx-species-audio-detection/discussion/217541)や、[不十分なTPラベルを擬似ラベルによって補完するdiscussion](https://www.kaggle.com/c/rfcx-species-audio-detection/discussion/209040)、[ノイズの多いデータをsemi-supervisedな手法で対処するnotebook](https://www.kaggle.com/reppic/mean-teachers-find-more-birds)、コンペ終了後ではありますが、[Beluga氏による可視化のためのツールについてのDiscussion](https://www.kaggle.com/c/rfcx-species-audio-detection/discussion/220305)などが中後半に渡っては筆者の印象に残りました。

### コンペの際立った解法　　 
上位の解法では、FPラベルをどう活用するか・不完全なTPラベルをどのように扱うかが肝になっているチームが多かったです。
[不完全なTPラベルについて擬似ラベリングを用いる解法](https://www.kaggle.com/c/rfcx-species-audio-detection/discussion/220563)、[ラベルの種類によって重み付けを行う解法](https://www.kaggle.com/c/rfcx-species-audio-detection/discussion/220432)、[ハンドラベリングを使った解法](https://www.kaggle.com/c/rfcx-species-audio-detection/discussion/220803)がありました。
他に特徴的なものとしては、[lwlrapが行ごとのAUC指標とよく似ていることを利用した解法](https://www.kaggle.com/c/rfcx-species-audio-detection/discussion/220389)、[CoordConv](https://arxiv.org/abs/1807.03247v2)を用いて[周波数軸に位置エンコーディングを明示的に追加する解法](https://www.kaggle.com/c/rfcx-species-audio-detection/discussion/220304)、周波数領域のアノテーションがあることから[特徴空間内でスライドウィンドウを用いて効率的にローカルな推論を行う解法](https://www.kaggle.com/c/rfcx-species-audio-detection/discussion/220309)などがありました。


## [BirdCLEF 2021 - Birdcall Identification(通称：鳥コンペ2・🦜コンペ2)](https://www.kaggle.com/c/birdclef-2021)  
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211495/cabcb7bd-d1c9-f6a6-c628-8fe0a64a8376.png)

### [コンペ概要](https://www.kaggle.com/c/birdclef-2021/overview)  
このコンペは鳥コンペ1と同じくコーネル大学鳥類学センターがホストとして開催されており、問題設定は鳥コンペ1のsite1, site2を用いたものと非常によく似ています。開催の形式としては鳥コンペ1のように独立したものではなく、毎年行われている LifeCLEF Bird Recognition Challenge ([BirdCLEF](https://www.imageclef.org/BirdCLEF2021))という学会付きコンペの中でLarge-scale soundscape task (main task)として開催されたました。
2021年度のLifeCLEFでは他にもGeoLifeCLEF、PlantCLEF、SnakeCLEFが行われており、Kaggleとは別のプラットフォームで行われたようです。
このコンペも鳥コンペ1と同じくマルチラベル分類で、ファイル別にラベリングされたデータから5秒おきのラベルを推論する必要があります。

他の特徴として、Working Note Awardがあることが挙げられます。
例えコンペで結果が出せなかったとしても、実験した過程をまとめて共有することはコミュニティにとって大きな貢献であり筆者は素晴らしい試みだと感じました。このような試みはKaggleでは脚光を浴びることは少ないですが、次回機会があれば筆者も参加してみたいです。(このコンペ当時は新社会人生活と学会準備で忙殺されていた)

### [データについて](https://www.kaggle.com/c/birdclef-2021/data) 
学習データに関しても鳥コンペ1と同じくxenocanto.orgからクローリングされたものが提供されているのですが、このコンペではtestデータと同じ形式でラベルも5秒おきに付けられたデータ(train_soundscape)が提供されています。
テストデータ(test_soundscape)はCOR、COL、SNE、SSWの4地点からデータが取得されており、そのうちtrain_soundscapeにはSSW、CORの2地点のデータが含まれています。
それぞれ4地点の詳細は以下のようになっています。

* COR: コスタリカ サンラモン
* COL: コロンビア ハルディン
* SNE: カリフォルニア州 シエラ・ネバダ山脈
* SSW: ニューヨーク州 イサカ  

soundscapeファイルはファイルIDと地点のデータ、データの取得日時を合わせた命名規則が適用されており、メタデータが用意されていないように見えるtest_soundscapeに関してもファイル名を参照することでこれらのデータを推論時に用いることができるようになっています。
学習データに関しての鳥コンペ1と異なる点はラベルに種類があり、primary labelとsecondary labelがあることです。
primary labelは音声を取得した人が最も興味がある鳥種を表しており、secondary labelは確信があるわけではないが背景音に混じっているかもしれない鳥種を表しています。([参考](https://www.kaggle.com/stefankahl/birdclef2021-exploring-the-data))

### [評価指標](https://www.kaggle.com/c/birdclef-2021/overview/evaluation)  
コンペの評価指標に関しては鳥コンペ1と同じなので説明を省略します。
working noteに関しても厳密な採点基準が設定されています。

### [期間](https://www.kaggle.com/c/birdclef-2021/overview/timeline)    
2021年4月2日から2021年6月2日の期間で開催されました。

### コンペ期間中のトレンド  
このコンペでは鳥コンペ1、熱帯雨林コンペと続いたこともありこれらのコンペから継続的に参加するKagglerは比較的少ないように見えました。(~~流石にこうも立て続けだと飽きる~~)
また、タスク設計も鳥コンペ1とほぼ同じということもあってdiscussionやnotebookにおいてモデリングなどの部分に関しては新しい知見が共有されることはあまりありませんでした。
序盤は[araiさんの鳥コンペ1の知見を含んだSED modelのstarter notebook](https://www.kaggle.com/hidehisaarai1213/pytorch-inference-birdclef2021-starter)やスペクトログラムに変換済みのデータセット、[ホストからの完成度が高いEDA](https://www.kaggle.com/stefankahl/birdclef2021-exploring-the-data)などが共有されており、初心者にも参加しやすい環境が作られていました。
中盤にはkkiller氏による[ensembleがかなりスコアに効くというdiscussion](https://www.kaggle.com/c/birdclef-2021/discussion/233454)や[ドメイン知識がある方によるEDA](https://www.kaggle.com/jmreuter/a-birder-s-eye-view-of-the-metadata-with-taxonomy)が印象に残っています。
他にも熱帯雨林コンペの解法を参照して[ハンドラベリングを試みる参加者](https://www.kaggle.com/c/birdclef-2021/discussion/239911)も存在しました。
LBでは序盤から終盤にかけてCPMP氏が首位を独走しており、discussionにも積極的に参加し知見を共有していました。
終盤になってくると、別のコンペが終わりnew baselineチームなどGM勢が参加しLBを登り詰めていくこともありかなり上位争いが激しくなっていきました。 

### コンペの際立った解法　
予想通りコンペ終了後、公開された解法は鳥コンペ1の解法をもとにしたものが多い結果となりました。(筆者の解法も鳥コンペ1の解法をもとに改良を加えたものです)
他に印象に残った解法として、[1位のチーム](https://www.kaggle.com/c/birdclef-2021/discussion/243927)はLightGBMを用いてスタッキングすることでメタデータをうまく扱う解法や、終盤まで首位を独走していた[CPMP氏](https://www.kaggle.com/c/birdclef-2021/discussion/243360)は画像認識ではもはやメジャーになっているVision Transformerの位置エンコーディングをスペクトログラムに特化させたモデルを用いていた解法は興味深かったです。　
また重要な要素として、生息地やデータ取得時間を用いた後処理や低めの閾値を採用することは多くの上位チームで採用されていました。


# 終わりに
以上、3つの鳥の鳴き声にまつわるコンペに参加してきたKagglerの振り返りでした。
今年は例に漏れずAudio分野においても[Transformerの研究](https://t.co/NG3vUmACHK)が発表されていたりするので、次に同じようなテーマで開催されるとしても解法の毛色も変わっていくのかなと考えています。
Kaggleのホスト側の視点で鳥コンペ三部作からどれだけの知見が得られたのかわからないですが、機械学習の社会実装に対して有用な知見を生み出していくべくKagglerとしてできる限り励んでいきたいなと感じました。