Pythonでスポーツ動作分析(野球・バッティング編その②)


はじめに

スイングをした際にバットがどのような軌道を通ったか(スイング面)を可視化したいと思います。
セグメント検出が可能なMask-RCNNを使って、画像からバットを自動検出しスイング面を推定します。

イメージ図

スイング面はスイングプレーンと言ったりもするそうです。
出典:https://blogs.yahoo.co.jp/kinegawareds/21073734.html

環境

Mask-RCNN

Masc R-CNNは、下図のように物体の境界を識別できます。

今回使うライブラリは画像にある全ての物体を検出してしまうので、バッドのみを検出するよう少し手を加えます。

クラス分類

Microsoft COCO が提供する画像データセットを使って、画像の物体を以下に分類しているようです。
「baseball bat」ありました。

# COCO Class names
# Index of the class in the list is its ID. For example, to get ID of
# the teddy bear class, use: class_names.index('teddy bear')
class_names = ['BG', 'person', 'bicycle', 'car', 'motorcycle', 'airplane',
        ~途中略~
               'kite', 'baseball bat', 'baseball glove', 'skateboard', ##  ← ありました。
               'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup',
        ~途中略~
               'keyboard', 'cell phone', 'microwave', 'oven', 'toaster',
               'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors',
               'teddy bear', 'hair drier', 'toothbrush']

バットのみを検出するよう修正

検出した物体がclass_names中の35番目(baseball bat)の場合のみ、画像に色をつけるように修正

visualize.py
def display_instances(payerName, image_base, image, boxes, masks, class_ids, class_names,
                      scores=None, title="",
                      figsize=(16, 16), ax=None,
                      show_mask=True, show_bbox=True,
                      colors=None, captions=None):
  ~途中略
        if class_ids[i] == 35: ## ← この条件を追加
      ~途中略
            for verts in contours:
                p = Polygon(verts, facecolor="#FFFF00", edgecolor="#FFFF00") ## ← 修正(黄色で描画)
                ax.add_patch(p)

バットを自動検出

以下のように画像からバッドを検出していきます。

  1. OpenCVを使って、動画から画像を切出し
  2. Microsoft COCO画像を使って、画像判定モデルを学習させる
  3. 画像からバッドを検出⇒スイングの一番最後の画像に描画
  4. 「3」をスイングの全画像分繰り返し

実行ソース

スイング面を推定

ここも自動化したかったのですが・・・
描画されたバッドから人手でスイング面を推定します。

スイングタイプを推定

複数の選手を解析していったところ、3つのタイプに分類できそうでした。

関連記事