この記事は: 個人開発者としての私が、一般的なゲーミング GPU (GeForce GTX 1650) と AI エージェント(ClaudeCode)だけで「どこまで本格的な画像認識システムを短期間で組めるか」を検証した備忘録です。G検定レベルの知識でも、ChatGPT / ClaudeCode に相談しながら進めれば十分に精度を追い込めることを示します。
- ClaudeCode に投げたプロンプトと得られたアウトプット
- 物体検出+姿勢推定パイプラインの技術スタック
- 精度チューニングの試行錯誤と評価結果
1. なぜ作ったか
愛犬の散歩中、微妙な足のかばい方に気づけず獣医へ行くのが遅れた経験があり、
「カメラに映る仕草から早めに異常検知できないか?」 という動機で着手。週末 2 日+平日夜の計 12 時間で PoC を形にできたので、その工程をまとめる。
2. 技術スタック
レイヤ | 採用技術 | ClaudeCode から得た提案例 |
---|---|---|
物体検出 | YOLOv8 (犬クラス) | データ拡張テンプレ + 学習コマンドを 1 プロンプトで生成 |
姿勢推定 | YOLOv8‑Pose 20 keypoints | 検出→KP 推定をワンパス化し GTX1650 でも ~20 FPS |
後処理 | Part‑aware NMS, Transformer Tracker | NMS と時系列平滑を自動で関数化し jitter 80→15 px |
デバイス最適化 | ONNX + TensorRT / FP16 | ClaudeCode 推奨の export スクリプトで GTX1650 に最適化 |
🤖 ポイント: モデルのエクスポート、TensorRT 変換スクリプトまで ClaudeCode が生成。私はパスと GPU 名を修正した程度。
2.5 試した手法バリエーション
手法 | フレームワーク | Backbone | 特徴 | メモ |
DeepLabCut | PyTorch | ResNet‑50 | 少量データでも高精度 | 学習時間は長め |
YOLOv8‑Pose | Ultralytics | default | 軽量・高速 | リアルタイム重視 |
MMPose + HRNet | OpenMMLab | HRNet‑w32 | 精度・柔軟性◎ | モデル選択肢豊富 |
DeepPose | TF / PyTorch | ResNet‑50 | 回帰ベースの古典手法 | 解析しやすいがやや低精度 |
CPM | TensorFlow | VGG‑like | ステージ構造で精度向上 | モデルが大きい |
これらの候補を ClaudeCode に列挙させ、速度・精度・開発コストを比較。最終的に GTX1650 との相性とリアルタイム性で YOLOv8‑Pose をメインに採用。
2.6 トレーニングログ抜粋(YOLOv8‑Pose 系)
ID | 特色 | pose_mAP | FPS | サイズ |
train_001 | ベースライン | – | – | 19.6 MB |
train_002 | 強化Aug + MixUp | 0.781 | 45.8 | 7.0 MB |
train_003 | マルチスケール | 0.710 | ~20 | 6.7 MB |
train_004 | 時系列一貫性 | 0.538 | ~20 | 6.7 MB |
train_005 | 知識蒸留 | 0.796 | ~20 | 6.7 MB |
ベストモデルは知識蒸留(train_005)。ClaudeCode に「軽量学生モデルで pose_mAP>0.78 を達成したい」と依頼 → 蒸留パラメータ一式が提案され、1.9 h の CPU 学習でポータブルモデルを生成。
2.7 精度ランキング(mAP50 Pose)
Rank | モデル ID | 手法 / 特徴 | mAP50(P) | 簡易説明 |
🏆 1 | train_005_distillation | Knowledge Distillation (YOLOv8l→YOLOv8n) | 76.9 % | 大型教師モデルの知識を軽量学生に転移。サイズ 6.7 MB で最高精度を達成。 |
2 | train_002_enhanced_augmentation | 強化データ拡張 + MixUp/Copy‑Paste | 70.0 % | HSV・照度変化・合成貼付で多様性を拡張。FPS 45.8 と高速。 |
3 | train_007_diversity | 多様性重視 Aug (被毛色/犬種バランス) | 55.8 % | 黒・白・茶など被毛比率を均し recall 改善。精度はまだ伸び代。 |
4 | train_001_baseline | ベースライン(標準 Aug のみ) | 25.4 % | 初期比較用。深い分析の出発点。 |
5 | train_006_semisupervised | 半教師あり (Pseudo‑Labeling) | 10.5 % | ラベル無しデータ活用も精度伸びず—閾値調整が課題。 |
6 | train_003_multiscale | マルチスケール訓練 | 4.65 % | 解像度可変で汎化狙いも mAP 低迷。Aug 過多の可能性。 |
7 | train_004_simple | シンプル設計 (最小構成) | 2.9 % | デバッグ目的の極小モデル。実用外。 |
所感: Distillation が頭一つ抜けた結果に。半教師あり (train_006) は疑似ラベル品質や閾値がボトルネック。
2.8 なぜ mAP50(P) でランク付け?
- mAP (Mean Average Precision) は、信頼度スコアを 0→1 まで動かして作る Precision‑Recall 曲線の下面積。モデル全体の “曲線の形” を評価できる総合指標。
- IoU (Intersection‑over‑Union) は、予測と GT の重なり度合い。mAP を計算するときは IoU≥閾値 の判定が前提で、姿勢用では 0.5 を慣例的に採用 → mAP50(Pose)。
- F1 スコア は 1 つの信頼度閾値を決めた時の Precision‑Recall のバランスを見る指標。閾値調整には便利だが、ポイント値なのでランキングに使うと閾値依存が強い。
結論: モデル全体の性能比較には 曲線面積=mAP50(Pose) が客観的。閾値設計や運用時の挙動チェックは F1 や Precision/Recall を使い分ける、という棲み分け。
3. パイプライン概要 パイプライン概要
graph LR
A[入力フレーム] --> B[YOLOv8 犬検出 (GTX1650)]
B --> C[YOLOv8‑Pose 20KP]
C --> D[Part‑aware NMS]
D --> E[Transformer Tracker]
E --> F[異常スコアリング]
4. 精度チューニング & 結果
4.1 学習設定
- kaggleにて取得した犬の画像+ラベル
- ハード: GeForce GTX 1650 4 GB
- Aug: Mosaic, HSV, Random Blur, Synthetic Lighting
- Loss: SoftWingLoss + 0.2 × BoneLengthConstraint
4.2 評価指標
指標 | 値 | 備考 |
mAP50(Pose) | 0.79 | hold‑out 500 枚 |
F1@0.45 | 0.67 | 信頼度閾値 0.45 で算出* |
Precision@all | 0.82 | 高信頼域で誤検出抑制 |
* なぜ 0.45? 一般的な物体検出では 0.5 以上が使われることが多いですが、YOLOv8‑Pose の キーポイント信頼度は全体的に低めに出る 傾向があり、そのまま 0.5 を閾値にすると Recall が急落します。Precision‑Recall 曲線を描いて F1 が最大になる点 (≈0.45) を選ぶことで、
- Precision 0.78 → 0.82
- Recall 0.71 → 0.80 とバランスが取れ、実運用での取りこぼしを抑えられました。
G検定レベルでも、上図のような曲線を ClaudeCode に描かせて「F1 最大点=0.45」を読み取り、推論の信頼度閾値として適用できる。
G検定レベルでも、上図のような曲線を ClaudeCode に描かせて「F1 最大点=0.45」を読み取り、推論の信頼度閾値として適用できる。
4.3 可視化サンプル
学習時 Mosaic Aug:被毛色・体型の多様性を確保
推論サンプル:バウンディングボックスと 20 KP をリアルタイム描画
5. ClaudeCodeが提案した6つのコア手法と役割
ClaudeCode から提示された改善アイデアをまとめると、検出 → 学習安定化 → 後処理 → 時系列補正 の 6 段階に集約できます。
# | 用語 | ひと言で | もう少し詳しく |
1 | Core‑13 → Extended‑25 → Fine‑1333層スケルトン | 解像度の違う地図 | 13 点だけの超シンプル骨格(頭・胴・四肢の付け根)から始め、必要に応じて 25 点 → 133 点と 段階的に細かく します。粗い骨格で土台を固めてから細部を追加する方が “足が入れ替わる” 崩壊を防ぎ、少データでも高精度。 |
2 | SuperAnimal Base | 動物界の辞書を暗記したバックボーン | COCO(人主体)ではなく犬・猫・鳥など 45 種で事前学習した ConvNeXt‑Tiny。耳・尻尾などの特徴量を学習済みなので、少量追学習でも動物に強い。 |
3 | SoftWing Loss | 外れ点に優しい損失関数 | 誤差が小さいときは L2、外れ値には L1 と スイッチすることで、1 点の大きな誤差に引きずられず学習が安定。 |
4 | Bone Length Constraint | 骨の長さは基本変わらない | 「左前脚と右前脚は同じ長さ」など 骨格比のペナルティ を追加し、物理的にあり得ない姿勢(胴より長い脚など)を抑止。 |
5 | Part‑aware NMS | “この鼻と尻尾は同じ犬” を賢く判定 | 通常の NMS は bbox だけで重複除去。Part‑aware NMS は 頭‑胴‑尻尾根本が一直線か を見て、密集シーンでも誤マージを防ぐ。 |
6 | Transformer Tracker | 次フレームでも“同じ犬”を追跡 | 過去数フレームのキーポイント関係を 自己注意で学習し、予測位置を補正。カルマンより長期依存に強く、ブレが 80→15 px に。 |
実装メモ: 上記 1→6 を順番に組み込み、mAP50 は +0.10、キーポイントのフレーム間跳びは ‑65 px 改善しました。
Part‑aware NMS の具体的な構造
- 頭 (nose or eyes)・胴 (neck)・尻尾根本 (tail‑root) を必須リンクと定義。 └ 各候補 bbox に対し、これら 3 点がスケルトンで連結しているかをチェック。
- IoU≥0.45 で重複 bboxes をグループ化後、リンク強度スコア (=3 点の信頼度平均 × bbox 面積) を計算。
- グループ内でリンク強度が最大の bbox を残し、それ以外を抑制 (suppress)。
- 尻尾が長い犬種で “尻尾単体” が別個体扱いになる誤検出が 97→3 件 / 500 枚 に減少。
6. 今後の展望. 今後の展望. 今後の展望
- Extended‑25 → Fine‑133 へのキーポイント拡張で仕草解析を細粒度化
- Multi‑modal(鳴き声 × 姿勢)統合で痛み検知の精度向上
- MLOps: GitHubActions + TorchServe で継続学習パイプラインを構築予定
7. 用語解説(Glossary)
用語 | 意味 / 役割 | 本記事内での使い方 |
Aug (Augmentation) | 画像データ拡張。Mosaic, HSV, Random Blur, Synthetic Lighting などで人工的に多様な訓練サンプルを生成し、過学習を防ぎ汎化性能を上げる。 | train_002 で大幅に精度向上。 |
Pseudo‑Labeling | 未ラベル画像に既存モデルで疑似ラベルを付け、半教師あり学習に利用。 | train_006_semisupervised の基盤手法。 |
mAP (Mean Average Precision) | 適合率‑再現率曲線の平均適合率。物体検出全体の指標。 | 「mAP=0.993」などでモデル性能を比較。 |
mAP50 Pose | IoU=0.5 閾値で算出した姿勢推定 mAP。 | 精度ランキング表の基準。 |
Knowledge Distillation | 大きな教師モデルの知識を小さな学生モデルに転移して軽量化+精度維持。 | train_005_distillation が最高精度を達成。 |
Loss: SoftWingLoss + 0.2×BoneLengthConstraint | 外れ値にロバストな SoftWing と骨格比制約を組み合わせた損失関数。 | 学習を安定化し KP ノイズ削減。 |
hold‑out 500 枚 | 検証専用に取り分けた 500 画像。訓練に使わず汎化性能を測定。 | 4.2 評価指標 で使用。 |
F1@0.45 | 信頼度閾値 0.45 で計算した F1 スコア(精度と再現率の調和平均)。 | 閾値決定の根拠に利用。 |
Precision@all | 全信頼度域での平均精度。高値ほど誤検出が少ない。 | 4.2 評価指標 で 0.82 を達成。 |
F1 最大点=0.45 | F1 曲線が最大となる Confidence=0.45。 | 推論時のデフォルト閾値に採用。 |
Mosaic Aug | 複数画像を 2×2 に貼り合わせた拡張。局所コンテキストを崩して検出ロバスト性向上。 | 学習バッチ可視化で使用。 |
ConvNeXt‑Tiny | 軽量 CNN アーキテクチャ。SuperAnimal Base の backbone。 | 動物特化バックボーンとして使用。 |
NMS (Non‑Maximum Suppression) | 重複する検出結果を除去する後処理。 | Part‑aware NMS を独自実装。 |
TorchServe | PyTorch モデルを REST/gRPC で配信するサービングフレームワーク。 | 今後の MLOps でデプロイ予定。 |
8. まとめ
- GTX1650 + ClaudeCode だけでも週末 12 時間で mAP0.79 の姿勢推定 PoC が完成。
- G検定程度の基礎知識でも、AI エージェントに質問→提案→コード生成を回せば、モデル選定・データ拡張・後処理までスピーディに最適化可能。
- 物体検出 + 姿勢推定 + Tracker の三位一体がリアルタイム高精度の鍵。
「GPUも知識も限られるけど試したい」 という人は、AI エージェントを相棒にぜひトライしてみてください!