こんにちは
AIチームの戸田です
本記事では先日終了しましたKaggleのコンペティション、BirdCLEF 2021 - Birdcall Identificationの振り返りを行いたいと思います。
コンペ概要
鳥の種類を推定する音声処理タスクで、以前振り返りブログを書かせていいただいた、Cornell Birdcall Identificationと非常に近い形式になっています。各音声Clipで鳴いている鳥を予測し、micro averaged F1で評価します。
以前のコンペティションと異なる点として、site情報が与えられていることがあります。つまりテストデータがいつ・どこで録音されたものかがわかる、ということです。またラベル数も増えており、以前は264種の鳥を分類する問題だったのですが、今回はその1.5倍の397種類を分類する必要があります。音声ファイル自体の量も増えており、大量のデータをどう扱うかも上位に食い込む重要な要素となります。
詳細はコンペティションのページをご参照いただければと思います。
戦略
今回のコンペティションは、shinmuraさんとteyoさんと3人でチームを組んで参戦させていただきました。
今回のコンペでは「Baggingが効く!」という話がDiscussionに上がっており、我々も実際のsubmissionでその手応えを感じていましたので、当初は知見を共有しつつ、できるだけ多様性のあるモデルを作って最後にアンサンブルしよう、という戦略になりました。しかしコンペの終盤、teyoさんのRexnet200が圧倒的スコアを叩き出したので、最終submitはRexnet200を後処理などで強化したものになりました。
詳細はKaggleのDiscussionにあげていますので、そちらをご覧いただければと思います。
本記事では、チームの最終submitには使われなかった私の解法を紹介したいと思います。
私の解法
私の解法はResNet18ベースのSEDモデルに加えて、以下の3点を工夫しました。
1. 背景ノイズを追加
今回のデータの特徴として、配布されている学習データは、ボランティアが鳥の鳴き声や鳥の鳴き声の録音を録音してアップロードしているXeno-cantoというサイトのデータを整形したものになっています。つまり「鳥の声を録音しよう」というモチベーションのもと録音された音声データなので、大多数がきれいに鳥の声が録音されています。一方テストデータは特定のsiteに置かれた録音機で録音された音声になりますので、学習データに比べて雑音が多く、また鳥の声も(遠くで鳴いているためか)音量が小さかったりします。
学習データの音声をできるだけテストデータに近づけるため、ESC50のデータを使って、学習データにノイズを乗せるようにしました。選択した音声を以下に列挙します。
- airplane: 飛行機の音
- rain: 雨の音
- water_drops: 水滴の音
- crackling fire: 火花の「パチパチ」いう音
- engine: エンジン音
- insects: 「ブーン、ブーン」という虫の羽音
- crickets: コオロギのなきごえ
- frog: カエルのなきごえ
- wind: 風の音
ちなみに鳥の声の音量にバリエーションをもたせるため、Gainなども調整したのですが、こちらはうまくいきませんでした
2. SITEを絞る
今回、テストデータに使われる音声データは以下に示す場所と期間に取得されたものになります。
- SSW
- アメリカ・ニューヨークのサウスパーク森林公園
- 2〜8月に取得
- SNE
- アメリカ・シエラネバダ州の山岳地帯
- 5月に取得
- COR
- コスタリカの農耕地帯
- 9, 10月に取得
- COL
- コロンビアの農耕地帯
- 9〜11月に取得
siteについての分析はこちらのnodebookがきれいにまとめられています。
地域によって観測される鳥は違うと考えられますし、渡り鳥のように特定の期間しか観測されない鳥もいることが予想されるので、対象の地域と期間で鳥の種類を絞って、各siteに特化したモデルをつくることにしました。具体的にはテストデータの観測地点から半径1000km以内、期間は対象の期間に対して前後1ヶ月バッファをもって(たとえばSSWだと1月〜8月)絞り込みました。
絞込んだ上で各音声ファイルのrating(音質)でソートして上位300件の先頭5秒を抽出しました。これは手元の実験で種ごとにデータがどのくらいあれば十分かを実験したところ300件が一つの目安になりそうだったことと、チームメンバーのshinmuraさんがハンドラベリングを行っており、そこで先頭5秒以内には対象の鳥が鳴いているということがわかったからです。
各siteのデータはサイトごとに、SSW, SNE, COR, COLで公開しています。
3. nocallの追加
テストデータの対象クリップ内に鳥の声が存在しない場合”nocall”というラベルをつける必要があります。加えてこのコンペティションを難しくしている点として、学習データに無い鳥の鳴き声がする場合でも”nocall”と予測する必要があります。したがってピッチなどで鳥の声を絞るという単純な方法は通じません。
学習データに"nocall"のデータはありませんが、以前のコンペの解法をみたところ、自身でnocallのデータを作って学習させた、とあったのでそれに習いnocallのデータを追加しました。
nocallのデータの作成方法は、siteの絞り込みと逆で、各siteの半径1000km外かつ対象の期間外、という条件で音声データを抽出しました。
nocallのデータはこちらに公開しています。
結果
Publcでは39位の銀メダル圏内だったのですが、Privateでは68位までShake Downしてしまいました...
とはいえ、Priveteでも最良なsubmitを選択できていたので、ベストは尽くせていたのかなと思います。今後公開されていく解法を見て何が足りなかったのか勉強していこうと思います。
おわりに
最終submitに私のモデルは使われませんでしたが、背景ノイズの追加は前回のコンペでやりたかったけどできなかったことなので、試せてよかったかなと思います。
今回のコンペティションでは、コミュニティへの貢献も意識してDatasetも公開してみました(こちらのDiscussionで紹介)。とはいえupvoteはほとんどもらえなかったので、もっと良いデータを作れるように努力したいと思います。
最後までご覧いただきありがとうございました!
参考
- チームのGithubリポジトリ: https://github.com/trtd56/BirdCLEF