この記事は: 個人開発者としての私が、一般的なゲーミング 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 TrackerNMS と時系列平滑を自動で関数化し jitter 80→15 px
デバイス最適化ONNX + TensorRT / FP16ClaudeCode 推奨の export スクリプトで GTX1650 に最適化

🤖 ポイント: モデルのエクスポート、TensorRT 変換スクリプトまで ClaudeCode が生成。私はパスと GPU 名を修正した程度。


2.5 試した手法バリエーション

手法フレームワークBackbone特徴メモ
DeepLabCutPyTorchResNet‑50少量データでも高精度学習時間は長め
YOLOv8‑PoseUltralyticsdefault軽量・高速リアルタイム重視
MMPose + HRNetOpenMMLabHRNet‑w32精度・柔軟性◎モデル選択肢豊富
DeepPoseTF / PyTorchResNet‑50回帰ベースの古典手法解析しやすいがやや低精度
CPMTensorFlowVGG‑likeステージ構造で精度向上モデルが大きい

これらの候補を ClaudeCode に列挙させ、速度・精度・開発コストを比較。最終的に GTX1650 との相性とリアルタイム性で YOLOv8‑Pose をメインに採用。

2.6 トレーニングログ抜粋(YOLOv8‑Pose 系)

ID特色pose_mAPFPSサイズ
train_001ベースライン19.6 MB
train_002強化Aug + MixUp0.78145.87.0 MB
train_003マルチスケール0.710~206.7 MB
train_004時系列一貫性0.538~206.7 MB
train_005知識蒸留0.796~206.7 MB

ベストモデルは知識蒸留(train_005)。ClaudeCode に「軽量学生モデルで pose_mAP>0.78 を達成したい」と依頼 → 蒸留パラメータ一式が提案され、1.9 h の CPU 学習でポータブルモデルを生成。


2.7 精度ランキング(mAP50 Pose)

Rankモデル ID手法 / 特徴mAP50(P)簡易説明
🏆 1train_005_distillationKnowledge Distillation (YOLOv8l→YOLOv8n)76.9 %大型教師モデルの知識を軽量学生に転移。サイズ 6.7 MB で最高精度を達成。
2train_002_enhanced_augmentation強化データ拡張 + MixUp/Copy‑Paste70.0 %HSV・照度変化・合成貼付で多様性を拡張。FPS 45.8 と高速。
3train_007_diversity多様性重視 Aug (被毛色/犬種バランス)55.8 %黒・白・茶など被毛比率を均し recall 改善。精度はまだ伸び代。
4train_001_baselineベースライン(標準 Aug のみ)25.4 %初期比較用。深い分析の出発点。
5train_006_semisupervised半教師あり (Pseudo‑Labeling)10.5 %ラベル無しデータ活用も精度伸びず—閾値調整が課題。
6train_003_multiscaleマルチスケール訓練4.65 %解像度可変で汎化狙いも mAP 低迷。Aug 過多の可能性。
7train_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.79hold‑out 500 枚
F1@0.450.67信頼度閾値 0.45 で算出*
Precision@all0.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 段階に集約できます。

#用語ひと言でもう少し詳しく
1Core‑13 → Extended‑25 → Fine‑1333層スケルトン解像度の違う地図13 点だけの超シンプル骨格(頭・胴・四肢の付け根)から始め、必要に応じて 25 点 → 133 点と 段階的に細かく します。粗い骨格で土台を固めてから細部を追加する方が “足が入れ替わる” 崩壊を防ぎ、少データでも高精度。
2SuperAnimal Base動物界の辞書を暗記したバックボーンCOCO(人主体)ではなく犬・猫・鳥など 45 種で事前学習した ConvNeXt‑Tiny。耳・尻尾などの特徴量を学習済みなので、少量追学習でも動物に強い。
3SoftWing Loss外れ点に優しい損失関数誤差が小さいときは L2、外れ値には L1 と スイッチすることで、1 点の大きな誤差に引きずられず学習が安定。
4Bone Length Constraint骨の長さは基本変わらない「左前脚と右前脚は同じ長さ」など 骨格比のペナルティ を追加し、物理的にあり得ない姿勢(胴より長い脚など)を抑止。
5Part‑aware NMS“この鼻と尻尾は同じ犬” を賢く判定通常の NMS は bbox だけで重複除去。Part‑aware NMS は 頭‑胴‑尻尾根本が一直線か を見て、密集シーンでも誤マージを防ぐ。
6Transformer Tracker次フレームでも“同じ犬”を追跡過去数フレームのキーポイント関係を 自己注意で学習し、予測位置を補正。カルマンより長期依存に強く、ブレが 80→15 px に。

実装メモ: 上記 1→6 を順番に組み込み、mAP50 は +0.10、キーポイントのフレーム間跳びは ‑65 px 改善しました。

Part‑aware NMS の具体的な構造

  1. 頭 (nose or eyes)・胴 (neck)・尻尾根本 (tail‑root) を必須リンクと定義。 └ 各候補 bbox に対し、これら 3 点がスケルトンで連結しているかをチェック。
  2. IoU≥0.45 で重複 bboxes をグループ化後、リンク強度スコア (=3 点の信頼度平均 × bbox 面積) を計算。
  3. グループ内でリンク強度が最大の bbox を残し、それ以外を抑制 (suppress)。
  4. 尻尾が長い犬種で “尻尾単体” が別個体扱いになる誤検出が 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 PoseIoU=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.45F1 曲線が最大となる Confidence=0.45。推論時のデフォルト閾値に採用。
Mosaic Aug複数画像を 2×2 に貼り合わせた拡張。局所コンテキストを崩して検出ロバスト性向上。学習バッチ可視化で使用。
ConvNeXt‑Tiny軽量 CNN アーキテクチャ。SuperAnimal Base の backbone。動物特化バックボーンとして使用。
NMS (Non‑Maximum Suppression)重複する検出結果を除去する後処理。Part‑aware NMS を独自実装。
TorchServePyTorch モデルを REST/gRPC で配信するサービングフレームワーク。今後の MLOps でデプロイ予定。

8. まとめ

  • GTX1650 + ClaudeCode だけでも週末 12 時間で mAP0.79 の姿勢推定 PoC が完成。
  • G検定程度の基礎知識でも、AI エージェントに質問→提案→コード生成を回せば、モデル選定・データ拡張・後処理までスピーディに最適化可能。
  • 物体検出 + 姿勢推定 + Tracker の三位一体がリアルタイム高精度の鍵。

「GPUも知識も限られるけど試したい」 という人は、AI エージェントを相棒にぜひトライしてみてください!

投稿者 kojiro777

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です