mediapipe(メディアパイプ)& OpenCV・ Pythonでposeランドマーク検出Telloの自動操縦
mediapipe(メディアパイプ)& OpenCV・ Pythonでposeランドマーク検出Telloの自動操縦

mediapipe(メディアパイプ)& OpenCV・ Pythonでposeランドマーク検出Telloの自動操縦

こんにちは、 まずは mediapipe poseランドマーク検出 によるTelloの自動操縦 の動画をご覧ください~
MediaPipeを使いプログラミングをしてみました。ポーズ トラッキングは、コンピューターがコンピューター ビジョンを使用して入力画像からポーズランドマークを検出し、体の動きと方向に焦点を合わせ続けるプロセスです。ランドマークの追跡により、ポーズの動きと向きの座標を入力として使用できます。これを応用して楽しくドローンを操縦したいと思います。

まず、mediapipe(メディアパイプ)とは。。。。。。

MediaPipe ソリューションは、人工知能 (AI) および機械学習 (ML) 技術をアプリケーションにすばやく適用するための一連のライブラリとツールを提供してます。Google ML の専門知識で作成された、一般的なタスク向けの高度な ML ソリューション
そしてここが、凄い!! 速い、本当に速い ハードウェア アクセラレーションを含むエンド ツー エンドの最適化を行いながら、バッテリ駆動のデバイスで十分に動作するほど軽量です

まず パソコンの環境設定から説明していきます。

anacondaでの仮想環境(install先はリンクを貼っときます)にて バージョンを指定して実行してみました。
AnacondaとはPythonの実行環境で、データサイエンスに必要とされる各種ツールやライブラリを提供するプラットフォームです。Anacondaは数値計算および科学計算において世界で好まれているディストリビューションです。とても利便性が高いです。Anacondaの利用者は3,500 万人のユーザーです。
私は、IDEはVisualStudioCodeを使っていますここでは仮想環境はAnacondaで作っています。
mediapipeは、まだ開発途中のため、バージョンが上がっていきますが、古いバージョンでないと対応できないところもあり、バージョン指定をしてインストールしていきます。
今回は、古いバージョン出ないと エラーが出てしまい。最初は、実行できませんでした。
各バージョンは次の通りです。
mediapipe == 0.8.9.1
opencv-contrib-python==4.5.4.60
Python == 3.8
例えば、pip install mediapipe ==0.8.9.1 とバージョンを指定してインストールしていきました。

上記内容をインストールした時の実行エラー次の通りです。
TypeError: Descriptors cannot not be created directly.
If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0.
If you cannot immediately regenerate your protos, some other possible workarounds are:
Downgrade the protobuf package to 3.20.x or lower.
Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).


解決策 1:

protobufプラグインをダウングレードできます

pip install protobuf==3.20.*

それでは、環境設定ができましたので、プログラムを説明していきます。

landmsark

このプログラムは、MediaPipeとOpenCVを使用して、Webカメラからのストリームを受信し、人物の姿勢推定を行います。MediaPipeは、機械学習モデルを使用して、人物の姿勢を検出するために使用されます。OpenCVは、Webカメラからのストリームを表示するために使用されます。
具体的には、MediaPipeの mpPose.Pose() メソッドを使って姿勢推定のためのオブジェクトを作成し、OpenCVの cv2.VideoCapture() メソッドを使ってWebカメラからのストリームを取得します。また、 mpDraw.draw_landmarks() メソッドを使って、画像に対して姿勢推定結果のランドマークを描画し、 cv2.circle() メソッドを使って、各ランドマークを円で表示します。
findpose() 関数は、姿勢推定結果をリストに格納し、それを画像に描画するために使用されます。関数は画像、姿勢推定結果、ランドマークリストを引数に受け取り、以下のことを行います。
results.pose_landmarks が存在する場合は、 mpDraw.draw_landmarks() メソッドを使ってランドマークを描画します。
ランドマークの各座標を計算して、それを画像に表示します。座標は、リストに格納されます。
リストに格納された座標情報を使って、特定の部位の位置を取得します。取得した位置情報は、画像に表示されます。


次は、座標位置の設定です。以下は、一例ですが、 いろいろ設定を考えてしてみるのも面白味の一つです。

trottle

座標位置からの指示数値設定の説明

lmlist[16][2]の座標位置がどの位置にきたら、 ドローンをどう動かしたいかを組んでいきます。

lmlist[16] とは、以下のランドマーク表からright_wristを表します。[2]はappendしたlmlistの3番目の数値を表します。

pose landmmark

以上が Mediapipeポーズランドマーク検出を使ったドローンの自動操縦でした
参考までにcode添付しておきますね

code

コメントを残す

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