「感覚」の野球指導をAIで「数値と言語」へ。野球コンサルアプリ「DIAMONDMIND」
デモ動画
背景
私は父の勧めで、中学生の頃から野球を始め、高校はできなかったものの大学で再開し、社会人になった現在も硬式野球のクラブチームに所属し野球を続けています。
社会人野球は大きく分けて以下の2つがあります。
- 企業チーム(企業に所属し、社員でありつつ部活動として野球をしている)
- クラブチーム(特定の集団ではなく、硬式野球を続けたい人が任意で集まっている)
企業チームの特徴
- 所属企業が部の運営費を払っているので資金が潤沢
- 部員のレベルが高い(基本的に社会人からプロに行くのは企業チームの人)
- 企業の広報の方が宣伝したりするので人目につきやすい
- 元プロ野球選手がコーチに就くこともしばしば
クラブチームの特徴
- 個人での運営なので資金はあまりない
- 企業チームよりはレベルが高くない(上手い人は企業チームに呼ばれるため)
- 宣伝は部員がしないといけない(仕事との両立が負担)
- 基本的にコーチはいない
企業チームとクラブチームはリーグが違うので試合することはあまりないのですが、アマチュア野球の括りで試合をして県代表のチームを決める試合が都市対抗野球です。
都市対抗野球は東京ドームで試合があり、中継もされます。
私の思いは一つです。
限られた条件の中でなんとかして都市対抗野球に出場したい!!
勝つために克服しないといけない課題
企業チームに勝つために、クラブチームが超えないといけない課題は以下の2つが挙げられます。
- 課題1 : 野球の最新情報をキャッチアップする。
- 課題2 : お手本の動作と比べて良い、悪いが分かるようになる。
課題1 : 最新の情報のキャッチアップ
野球の動作(特に打撃)は年単位で新しい理論が提唱されます。
資金が十分にあると、新しい理論をリサーチする人を雇ったり、最新理論を学んだ人をコーチとして雇ったりします。
資金が十分にないチームは元プロ野球選手がYoutubeにあげている動画を参考にするのですが、様々な元プロ野球選手がそれぞれ異なった内容の動画をあげており、自分の知りたい情報に対して
「どの動画を見ればいいかわからない」、「いちいち動画をすべて見るのが面倒」
などの意見があります。
課題2 : 打撃・投球動作の定量的評価
ここが核心的な課題です。Youtubeで最新の打撃理論を学んだところで実践できなければ何の意味もありません。これまでの野球の指導は「上からたたけ」「脇を閉めろ」「腰から動かせ」など大雑把な指導がされてきました。ところが、実際は「上からたたく」「脇をしめる」などは意識の問題で、本当に理解しないといけないのはどれくらい脇をしめるのか?、なぜ上からたたく必要があるのか?の部分です。専属のコーチがいると付きっ切りで良し悪しを判断するのですが、何が悪いかわかっていない本人がいくらお手本の動画を見ても改善されることはありません。
使ってほしいターゲット層・目的
上記の課題を感じているのは、社会人クラブチームに限ったことではないと思います。都心部では野球教室があり、小学校低学年からトレーニング施設に通っている人たちがいる一方で、地方では野球教室がなく地元のちょっとした野球経験者の人が教えている。なんてことも往々にしてあると思います。
そういった地方にお住まいの方々、多額の費用を費やすのが厳しい方々がもっと野球が上手くなれるような統合プラットフォームを作成することが今回の目的です。
機能とシーケンス図
機能は大きく分けて三つです。
- Analyze : 動作の動画から骨格を推定して、その情報を基にAIが改善点を言う。
- Consultation : ポジションごとの悩みをAIが聞き、最適な改善方法とそのソースを提案する
- Training menu : 最適な動作をするための体作りとなるトレーニングメニューを提案する
機能1 : Analyze
これが最も実装したかったものです。
どのくらい? を定量的に評価するために、入力された動画から骨格を推定します。推定した骨格の動きから関節の速度を計算し、それを元にAIが今自分の状態がどうで何が悪いのかを教えてくれまう。
それだけではなく、目標としているプロ野球選手にどうしたら近くなれるか、プロ野球選手の意識はどのようなものかを検索して表示し、具体的な練習方法を提案します。
シーケンス図

動画解析機能の具体的な処理フローは上記のとおりです。
-
動画アップロード・解析リクエスト
ユーザーがフロントエンドから動画を選択し「解析開始」ボタンを押すと、認証トークンと共にSSE(Server-Sent Events)でバックエンドへ送信されます。 -
YOLOによる姿勢推定
バックエンド側では YOLO (You Only Look Once) を用いた姿勢推定処理が走ります。受け取った動画に対し、フレームごとに17関節点の骨格検出と補間・ノイズ除去を行い、各関節の速度を算出します。さらに、軽量な骨格アニメーション動画(WebM形式)を生成します。 -
結果表示
解析が完了するとフロントエンドに通知が飛び、解析済み動画(WebM)と速度グラフが表示されます。元動画ではなく、骨格のみを抽出した軽量なWebMを表示することで、動作の確認をしやすくしています。 -
AIコーチング(オプション)
さらに詳細なアドバイスが欲しい場合、目標とするプロ野球選手の名前を入力して「診断生成」を利用できます。YOLOで抽出した速度データを Vertex AI (Gemini) に送信し、Google Search で目標選手の情報を検索した上で、比較分析・改善ドリル・参考動画を生成して返却します。
機能2 : Consultation
野球はポジションごとに悩みが異なります。それぞれのポジションに合わせて、メンタル面、肉体面ともにどのように向き合えば良いのかを提案します。
シーケンス図

相談機能の処理フローは上記のとおりです。
-
ポジション選択・相談入力
ユーザーが5つのポジション(BATTER / PITCHER / CATCHER / INFIELDER / OUTFIELDER)から選択すると、そのポジション特有のよくある悩みが表示されます。ユーザーは自由入力またはよくある悩みの選択でAIに相談できます。 -
Gemini APIによるアドバイス生成
バックエンドではポジション専用のシステムプロンプトを構築し、Vertex AI (Gemini) に送信します。Google Search ツールを活用して最新のYouTube動画や技術情報を取得しながら、具体的なアドバイスを生成します。 -
結果表示
AIからの応答はJSON形式でパースされ、技術的なアドバイス・3つのトレーニング種目・ウォームアップメニュー・参考動画がまとめて表示されます。
機能3 : Training Menu
いくら知識をつけても体が出来ていないと、思うようにパフォーマンスが出ません。
ただ、自分が抱えている悩みに対してどのようなトレーニングをすればよいのかを探すのはとても手間で、探しているうちにトレーニングの意欲もなくなってきます。
また、筋肉をつけたとしても、日々のケアを怠ると体が硬くなってしまって可動域が狭くなりケガのリスクが上がってしまいます。そこで、AIがユーザーの悩みを元に最適なトレーニングを提案します。
シーケンス図

トレーニングメニュー機能の処理フローは上記のとおりです。
-
カテゴリ選択・目標入力
ユーザーが6つのトレーニングカテゴリ(胸郭・上半身 / 背中 / 下半身 / アジリティ / 走力 / リカバリー・ストレッチ)から選択し、具体的なトレーニング目標を入力します。 -
Gemini APIによるメニュー生成
バックエンドではS&C(ストレングス&コンディショニング)コーチ専用のシステムプロンプトを構築し、Vertex AI (Gemini) に送信します。Google Search で最新のトレーニング動画を検索しながら、野球に特化したメニューを生成します。 -
結果表示
AIからの応答はJSON形式でパースされ、トレーニング理論のアドバイス・3つのトレーニング種目(開始姿勢・動作・回数つき)・ウォームアップ/メインドリル/メンタルのメニュー・参考動画がまとめて表示されます。
システム概要図
システム図は以下の通りです。

Google Cloud (GCP) を全面的に採用し、スケーラビリティと運用負荷の軽減を意識したサーバーレス構成で構築しました。
Frontend
Cloud CDN と Cloud Load Balancing を前段に配置し、静的コンテンツの高速配信を実現しています。また、Cloud Armor を導入することで L7 レイヤーでの防御を固め、セキュリティ面も考慮しました。認証基盤には Firebase Auth SDK を利用し、セキュアかつ容易なユーザー管理を行っています。
Backend
サーバーレスアプリケーションには Cloud Run (FastAPI) を採用しました。
データベースである Cloud SQL への接続には Direct VPC Egress を使用し、プライベートIP経由での安全な通信経路を確保しています。
また、AI機能の中核となる部分では、Cloud Run から Vertex AI (Gemini API) を呼び出す構成としており、動画解析結果やチャット履歴などのデータは Cloud SQL と Cloud Storage に適切に振り分けて保存しています。
CI/CD
GitHub Actions を利用して自動デプロイ環境を構築しました。
セキュリティリスクとなるサービスアカウントキーの管理を避けるため、Workload Identity Federation (WIF) を採用し、キーレスでの認証を行っています。ビルドされたコンテナイメージは Artifact Registry にプッシュされ、そこから Cloud Run へとデプロイされるフローです。
工夫したことなど
今回のアプリを作成するにあたって以下の点を工夫しました。
1. コスト最適化とセキュリティ・拡張性のバランス
「資金が十分にないクラブチームでも使える」というコンセプトに合わせ、GCPサーバーレス構成を軸に、セキュリティを犠牲にしない最小コスト設計を意識しました。
2. サーバーレス × スケールtoゼロ
Cloud Runをmin_instance_count = 0に設定し、リクエストがない時間帯は課金が発生しない構成にしています。クラブチームの利用は週末練習の前後に集中するため、平日はほぼ$0で運用できます。VM常時起動型と比較してコスト効率が大幅に向上しています。
3. セキュリティの多層防御
コスト最適化を優先するあまりセキュリティを犠牲にしてはいけません。本システムでは以下の4層で防御しています。
| 層 | 対策 | 内容 | コスト |
|---|---|---|---|
| L7 WAF | Cloud Armor | SQLi/XSS防御 + レートリミット(100req/min/IP) | ~$5-7/月 |
| ネットワーク | VPC + Private IP | Cloud SQLのパブリックIP無効化。Cloud RunからDirect VPC Egressでプライベート接続 | 無料 |
| 認証 | Firebase Auth | 全APIエンドポイントでトークン検証 | 無料枠内 |
| シークレット | Secret Manager | 認証情報をコードや環境変数に埋め込まず安全に管理 | ~$0.10/月 |
特にCloud SQLのプライベートIP化はコスト増なしでネットワークレベルの隔離を実現しており、インターネットからDBへの直接アクセスを物理的に不可能にしています。
4. 拡張性を損なわない構成
Terraformの3層分離: Infrastructure(VPC等) / Platform(DB, Cloud Run等) / Application(LB, CDN等)の3層にStateを独立させ、変更頻度ごとに分離しています。アプリケーション層を変更しても、プラットフォーム層に影響を与えません。
CI/CDのキーレス認証: Workload Identity Federation(WIF)を採用し、サービスアカウントキーの発行・ローテーションという運用コストを排除しました。キー流出リスクがゼロになるため、運用コストとセキュリティの両方を改善しています。
パスベースルーティング: 単一ドメインでフロントエンド(GCS)とバックエンド(Cloud Run)を/api/*で振り分けています。将来マイクロサービス化する場合もURL Mapにパスルールを追加するだけで統合可能です。
5. コスト構成
本システムの固定費は月額約$35-55です。企業チームが多額の費用をかけるコーチング環境に対し、この金額でAI動作解析・相談・トレーニングメニュー生成を実現しています。セキュリティ対策の多くはGCPの無料機能(VPC, DNSSEC, CAA Record, Firebase Auth)を活用しており、コストを大きく増やすことなく多層防御を実現しました。
おわりに
今回のハッカソンを終えてアプリの作成の仕方、デプロイの方法、チーム作業の進め方など様々なことを経験できました。今回のハッカソンメンバーに感謝です。
このアプリを一人でも多くの人に使っていただき、一人でも多くの人が試合に勝てるようになれればなと思います。
都市対抗野球絶対出場するぞ!!
Discussion