OpenCV

Pythonの画像認識で人間の姿勢を認識してみよう! 【MediaPipeで超簡単認識を学ぶ】

【この記事で出来るようになること】

MediaPipeで姿勢認識_Python

え? 今って、こんなことまでオープンソースで出来ちゃうんですか!?

出来ちゃうんですね~これが。

出来ちゃうんで、さっそくやっていきましょう!

準備

モジュールの導入

本記事では、Pythonに以下のモジュールを使用し、導入には【pip】を使用いたします。

以下のモジュールをpipでインストールしてください。(Python本体が3.7以上であるかも合わせて確認してください)

【OpenCV】

pip install opencv-python

【MediaPipe】

pip install mediapipe

【MediaPipeとは】

Googleが開発している『多種多様な物体認識を遅延なく実行できるように作られたモジュール』です。

本記事で扱う『人間の姿勢(ポーズ)の認識』の他にも、『顔のパーツの認識』『物体の検出』『物体の姿勢推定』など、多くの機能を持っています。

気付けば、こんな代物が一般人でも使える時代に・・・すごい。

また別の記事でもご紹介しますので、興味の湧いた方は、ぜひ。(記事の最後にアウトプットも置いておきます)

動画の用意(Webカメラでも可)

人間の全身、もしくは上半身が映った動画を用意してください。

その際、一人だけが映っているものが望ましいです。(複数人を認識するには工夫が必要です)

形式は、OpenCVが読み取れる形式であれば問題ありませんが、こだわりがなければ【.mp4】にしましょう。

以下に、本記事で使用した動画のダウンロード先を示します。

無題(ボクシング練習)-Anthony Shkrada氏 ※可能であれば、下の公式HPで検索してダウンロードしましょう!

無料の写真素材-Pexels-公式ホームページ ※検索したら、左上のボタンで【動画】の閲覧に切り替えられます。ボクシングと検索しました。

Webカメラを使用する場合は、PCに接続しておいてください。

コードの入手・導入

以下のページより、【pose.py】を入手してください。

MediaPipeSetup-GitHub ダウンロードページ

入手したコードで実行ファイルを作成したら、先ほど用意した動画と同じ階層(同じフォルダ)に置いてください。

もちろん、ディレクトリを引数に入れるルールをご存じであれば、その限りではありません。

コードの加工

動画を読み込ませるためにコードを加工しましょう。(この辺を理解している方はスキップして構いません)

【7行目:動画 or Webカメラの読み込み】

Webカメラの方は変更不要です。

動画ファイルの場合は、以下のように引数に入れると読み込まれます。

### 7行目 ###

# 変更前
cap = cv2.VideoCapture(0)     # プログラム実行でWebカメラ起動

# 引数の使い方
cap = cv2.VideoCapture("動画ファイル名.mp4")

# 変更後の例:
cap = cv2.VideoCapture("pose_test_1.mp4")     # 同じフォルダにあるpose_test_1.mp4を読み込む。

【29,30行目:描画の設定を挿入】

冒頭の動画にある通り、今回の処理では人間の骨格に合わせて緑色の線を描きますが、通常では線が細く見にくいです。

そこで、描画の設定を引数に挿入します。

※挿入する変数はまだ作っていませんが、行数で説明するためにコチラを先に説明しています

### 29, 30行目 ###

# コチラの引数を以下のように挿入してください。
connection_drawing_spec = drawing_spec

# 修正前
        mp_drawing.draw_landmarks(
            image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)

# 修正後
        mp_drawing.draw_landmarks(
            image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS, connection_drawing_spec = drawing_spec)

【4行目の下:描画の設定インスタンスの作成】

4行目の下に、以下のコードを挿入してください。

thicknessの値を変更することで、線の太さを変更できるようになります。

### 4行目の下に挿入 ###
drawing_spec = mp_drawing.DrawingSpec(thickness = 10, circle_radius = 1)

以上で、コードの準備は完了です。

実行する

それでは実行してください。

冒頭のような映像になったでしょうか。

なれば、完了です。

もしも、ならない場合は、お知らせ願えれば幸いです。使用環境に応じて検討いたします。

おまけ:MediaPipeでつくったアウトプット達

MediaPipeで手の指の認識_Python
MediaPipeでダンスの認識_Python

いつの日か、今よりも画像処理も動画編集も上達して、『あの時はこんなだったんだな~』とかつぶやくのが楽しみですね~。

最後までお付き合い頂き、本当にありがとうございました!
それでは、また次回お会いしましょう!