CenterNetを使ってテニスの選手，ボール，コートの位置を検出してみた

# やったこと
CenterNet (https://arxiv.org/abs/1904.07850) を使ってテニスの動画から選手，ボール，コートの四隅の位置を検出しました．
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おたこさん(<a href="https://twitter.com/otakoma?ref_src=twsrc%5Etfw">@otakoma</a>)の記事を参考に，CenterNetを使ってテニスの動画から選手，コートの四隅，ボールを検出してみました．<br>各フレームを入力して位置を検出しています．動画はアントワープ決勝のマレー対ワウリンカ<a href="https://t.co/hFoL0SJrbS">https://t.co/hFoL0SJrbS</a> <a href="https://t.co/Q3kAxLJEzU">pic.twitter.com/Q3kAxLJEzU</a></p>&mdash; iwashi (@iwashi_tennis) <a href="https://twitter.com/iwashi_tennis/status/1187960862687952897?ref_src=twsrc%5Etfw">October 26, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#CenterNet
論文の著者の方が[GitHubのソースコード](https://github.com/xingyizhou/CenterNet)を公開しています．
モデルの理解については，[DeNAさんのページ](https://engineer.dena.jp/2019/07/cv-papers-19-keypoint-object-detection.html)を参考にさせて頂きました．
ざっくりいうと，物体の中心点を表すヒートマップ，縦横の大きさ，オフセットを予測してバウンディングボックスを生成する手法です．ヒートマップ，大きさ，オフセットそれぞれの損失の重み付き線形和を全体の損失としています．
<img width="1236" alt="fig2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400405/b4af417c-02ee-6c73-64ce-77fd7c8471cb.png">

今回は「手前の選手，奥の選手，コートの四隅，ボール」の４クラスを設定し，学習させました．コートの四隅とボールは縦横15ピクセルのバウンディングボックスとして教師データとしています．
バックボーンモデルはDLA34を使用しました．出力は４クラスのバウンディングボックスですが，ツイートの動画ではコート，ボールのバウンディングボックスの中心点を表示しています．CenterNetのデフォルトでは入力画像のサイズは512×512ですが，今回は384×384にリサイズした画像を入力しています．
下のツイートはヒートマップの動画です．４クラスの物体の中央部分が反応しています．CenterNetのデフォルトでは出力されるヒートマップは入力画像の1/4のサイズになっているので，拡大して入力画像とアルファブレンドしています．

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ヒートマップの動画 <a href="https://t.co/JtTKqyglZN">pic.twitter.com/JtTKqyglZN</a></p>&mdash; iwashi (@iwashi_tennis) <a href="https://twitter.com/iwashi_tennis/status/1187962712271114240?ref_src=twsrc%5Etfw">October 26, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#テスト結果
ハードコートの試合だけでなく，クレー，芝のコートでもテストをしました．
用意したテストデータでは選手，コートの位置推定はほぼ間違いなくできていますが，ボールに関しては未検出や誤検出が見られます．動画のフレームを切り取ると，モーションブラーにより人間でも位置がわからない場合もあります．ここから先は物体検出の精度を上げるよりも，いかに補正していくかが重要なようにも思えます．

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">CenterNetを用いたテニスの動画の選手，コート，ボールの位置検出　クレーコート編<br>2019ローマ決勝　<a href="https://t.co/Wki050Ft7g">https://t.co/Wki050Ft7g</a><br>選手，コートの四隅の検出は問題なし<br>クレーでもボールの検出はできている <a href="https://t.co/eqbrDhkHcl">pic.twitter.com/eqbrDhkHcl</a></p>&mdash; iwashi (@iwashi_tennis) <a href="https://twitter.com/iwashi_tennis/status/1189878144376786945?ref_src=twsrc%5Etfw">October 31, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">CenterNetを用いたテニスの動画の選手，コート，ボールの位置検出　グラスコート編<br>2019ウィンブルドン決勝 <a href="https://t.co/HciP4ywr8B">https://t.co/HciP4ywr8B</a><br>選手，コートの四隅の検出はこちらも問題なし<br>フェデラーのバックボレーだけ怪しいが，概ねボールも検出できている <a href="https://t.co/SjAAVD0iuC">pic.twitter.com/SjAAVD0iuC</a></p>&mdash; iwashi (@iwashi_tennis) <a href="https://twitter.com/iwashi_tennis/status/1189879602291720192?ref_src=twsrc%5Etfw">October 31, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">CenterNetを用いたテニスの動画の選手，コート，ボールの位置検出　グラスコート編<br>2017シュツットガルト決勝 <a href="https://t.co/wkIaeFoEFg">https://t.co/wkIaeFoEFg</a><br>選手の検出は問題なし<br>時折コート上の四隅ではない点を検出している<br>ボールを検出できていない時間が多い <a href="https://t.co/Rm0XKf0xhw">pic.twitter.com/Rm0XKf0xhw</a></p>&mdash; iwashi (@iwashi_tennis) <a href="https://twitter.com/iwashi_tennis/status/1189881031437930497?ref_src=twsrc%5Etfw">October 31, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>