はじめに
ちょうど1年ぐらい前に猫ミームが流行りましたね!🐈
猫ミームの動きを見ていると、「これ、ロボットで再現できたら面白そう...」と思ったことはありませんか??
今回は、猫ミームのGIFから動きを抽出し、Unitree Go2ロボットに同じ動きをさせてみようと思います!!
実行環境
- Python 3.10+:メイン開発言語
- OpenCV 4.8+:画像処理とポーズ推定
- Genesis 0.2.1:物理シミュレーション
- YOLOv8:深層学習ベースのポーズ推定
- UV:Pythonパッケージマネージャー
システムの概要
動作抽出の流れ
GIF(またはMP4)から各フレームを抽出し、猫の姿勢推定を行います。そこから、頭・腕・足などのキーポイントを抽出し、逆運動学を用いてロボットのどの関節をどれぐらい動かせばいいかを計算してシミュレータ上で制御します。
ポーズ推定手法
今回は、2つのポーズ推定手法を実装しました
CV-Pose(Computer Visionベース)
- OpenCVの画像処理技術を活用
- 動物専用に設計
- 精度メトリクスの詳細な分析が可能
- 外部依存なし(OpenCVのみ)
YOLO(深層学習ベース)
- YOLOv8を使用した最新のポーズ推定
- 人間のポーズから動物のポーズへのマッピング
- GPUで高速処理可能
ここの実装が一番大変だったのですが、やはり古典的な画像処理や人間向けの姿勢推定モデルでは精度が出ません。
DeepLabCutやMMPoseなどのより動物の姿勢推定に適しているツールを用いりたかったのですが、使用ライブラリのバージョンの衝突など、環境構築に少し手こずったので諦めました😢
ModelZooに動物向けのモデルが公開されていたりするので、興味のある方は試してみてください!!
実装
動物ポーズ推定
YOLOを用いた手法では、人間用のモデルのため、得られたキーポイントを動物のキーポイントに対応付けるマッピングを行っています。
一方、CV-Poseでは、以下の手法を組み合わせて動物のキーポイントを検出します。
def extract_cv_keypoints(self, frame):
"""CV-based keypoint extraction using multiple detection methods"""
keypoints = []
# 1. SIFT特徴点検出
sift_kp = self._detect_sift_features(gray)
keypoints.extend(sift_kp)
# 2. 輪郭検出による関節候補の抽出
contour_kp = self._detect_contour_keypoints(frame)
keypoints.extend(contour_kp)
# 3. 色情報による特定部位の検出(鼻、足先など)
color_kp = self._detect_color_based_keypoints(frame)
keypoints.extend(color_kp)
# 4. 動き情報を使った関節の追跡
if self.prev_frame is not None:
motion_kp = self._track_motion_keypoints(self.prev_frame, frame)
keypoints.extend(motion_kp)
# キーポイントのクラスタリングと選択
final_keypoints = self._select_best_keypoints(keypoints)
return final_keypoints
古典的な画像処理技術の組み合わせですが、なんとか姿勢推定が可能です。
人間用のポーズ推定とは異なり、動物の体型や動きの特性を考慮しなくてはいけません。具体的には、
- 四足歩行特有の関節配置
- 毛皮による輪郭の曖昧さへの対処
- 種別による体型差の吸収
などがあります。これらに対応できるようにしていますが、そもそも元のデータの画質が悪く、検出が困難な場合が多いです。
キーポイントが検出できない場合でも、基本的な動作を生成するようにしています。
if not keypoints_detected:
# プリセットされた動作パターンから選択
motion = self._generate_fallback_motion(frame_index)
ロボット制御への変換
抽出したキーポイントを逆運動学で四足歩行ロボットの関節角度に変換します。
def keypoints_to_joint_angles(self, keypoints):
"""キーポイントから関節角度への変換"""
# 1. キーポイントの正規化
normalized_kp = self._normalize_keypoints(keypoints)
# 2. 逆運動学による関節角度計算
joint_angles = {}
for leg in ['FR', 'FL', 'RR', 'RL']: # 前右、前左、後右、後左
hip_angle, thigh_angle, calf_angle = self._inverse_kinematics(
normalized_kp, leg
)
joint_angles[leg] = {
'hip': hip_angle,
'thigh': thigh_angle,
'calf': calf_angle
}
# 3. 物理的制約の適用
constrained_angles = self._apply_joint_constraints(joint_angles)
return constrained_angles
実行結果
猫パンチ |
![]() Pose Estimation |
→ |
![]() Simulation |
Happy Cat |
![]() Pose Estimation |
→ |
![]() Simulation |
Dansing Dog?? |
![]() Pose Estimation |
→ |
![]() Simulation |
ぎこちないですが、なんとなくそれぞれの動物の動きを模倣できているような気がします??ね
ハッピーキャットみたいな複雑な動きは、単純な姿勢推定で真似るのは難しそうです。
また、そもそも元データの質が悪かったり、今回の姿勢検出手法では、キーポイントが正しく検出できていなかったりします。
上の画像は、CV-pose手法を用いたときの、精度分析結果です。
出力には以下の情報が含まれます。
- キーポイント検出位置
- キーポイントの移動軌跡
- フレームごとの信頼度グラフ
- 全体的な検出精度メトリクス
信頼度80%になっていますが、これでもまだマシな方で、ひどいときは10~30%ほどしか精度が出ません(そもそも元データ的に厳しいこともありますが、、、)
まとめ
今回は猫ミームから動きを抽出し、ロボットに模倣させることを挑戦しました!
かなり無理やりな実装もありましたが、古典的な画像処理技術でも、工夫次第である程度フレームから四足歩行ロボットの動作を生成することができました
ずっと使ってみたかったGenesisを触ってみたのですが、学習速度が早くて驚きです!!
今回はだいぶ雑な実装でしたが、画像や映像から人や動物の動きを抽出し、ロボットに転用できるシステムが構築できれば、かなり多くの応用が期待できる夢のような技術ですね✨
ぜひ皆さんも、お気に入りの動物GIFで試してみてください!
感想や、面白い動きのGIFがあれば、ぜひGitHubのIssueやPR、コメントでお知らせください!🐈✨