見出し画像

骨格推定ライブラリとしてよく使われているOpenPoseを試す

牧野 浩二

当記事はInterface増刊 AI自習ドリル 第19回「骨格推定ライブラリとしてよく使われているOpenPoseを試す」【PDF版】の一部を抜粋したものです.
ご購入はコチラ https://cc.cqpub.co.jp/lib/system/doclib_item/1624/

 骨格推定ライブラリとして大学や研究所で利用されているOpenPose を使って,人間が写っている1 枚の画像から頭や手足を認識し,骨格を描画する方法を紹介します.本稿の方法を応用すれば,人間の頭や手足の座標を得ることができるので,画像や動画から人間がどこにいるのか,どんなことをしているのかなどが解析できるようになります.

1.できること

● 人間の頭や手足の位置を推測できる
 OpenPose を用いると,図1−1 のように人間の頭や手足の位置を見分けることができます.人間の関節位置を見分けて線を引くことは骨格抽出と呼ばれています.

● 使うのはカメラとPC だけ
 OpenPose では,骨格抽出を行うために,特別なセンサを必要としません.普通のディジタル・カメラやスマートフォンで撮影した画像を利用できる点が優れたところです.
 他にも図1−2 〜図1−4 に示すような優れた点があります.また,動画にも対応していて動画に骨格を付けて生成することもできます.

● 骨格抽出の応用例
写真や動画から骨格抽出ができると,以下のようなことができそうです.

• ダンスで先生と同じ動きになっているかどうか
• 教室で手を挙げているかどうか
• スポーツで上手な動作かどうか
• 腰が曲がっているかどうかの診断
• 手話
• 職人の動き

 「骨格抽出」や「OpenPose」で検索をかけると,さまざまな実例が出てきます.ぜひ調べてみてください.

2.イメージでつかむ

● 可視領域をもとに見えない箇所を推測する
 OpenPose は骨格を推定するためにディープ・ラーニングを使っています.そのため,見えている部分の情報をうまく使って見えない部分を推測することで,隠れた部分も推測しています.
● 人間のように自然な推測ができる
 例えば,図2−1 はよく見ると右手が隠れています.人間が見れば,この人の右手は,きっとお腹の前あたりにあるだろうと推測します.OpenPose では,その推測通りにちゃんと右手の位置を推測して,このあた
りとして結果を出します(図2−2).
 ただし,推測は万能なわけではありません.図2−3は人間だと右足がどこにあるか分かりますが,OpenPoseでは推測できていません.

3.やってみよう

 OpenPose はソース・ファイルだけではなく,実行ファイル(exe ファイル)もダウンロードできます.ここでは実行ファイルを使って骨格抽出を行います.なお,本稿ではWindowsにおける実行方法を示します.

● 環境準備…ファイルのダウンロードと展開
▲1,ウェブ・サイトにアクセス
 OpenPoseのウェブ・ページを開きます.

https://github.com/CMU−Perceptual−Computing−Lab/openpose

 このページでは図1−3 と図1−4 に示した画像のgifアニメーションを見ることができます.

▲2,リンクのクリック
 README.mdをクリックして開きます.図3−1 のようにInstallation の下にある「download and use…」と書かれたリンクをクリックします.Windows
Portable Demo の下にある「Releases」と書かれたリンクをクリックします(図3−2).

▲3,ダウンロード
 ファイルをダウンロードします.CPU だけで動かす場合は,

openpose−1.7.0−binaries−win64−cpu−python3.7−flir−3d.zip

をクリックしてダウンロードします.使用中のPC がGPU を搭載している場合は,

openpose−1.7.0−binaries−win64−gpu−python3.7−flir−3d_recommended.zip

をダウンロードします(図3−3).ダウンロードしたzip ファイルを解凍すると図3−4 のようなフォルダ構造になっています.

▲GPUのバージョンやメモリ不足に注意する
 GPU を使うと高速に処理できますが,GPU のバージョンや搭載しているメモリ量によっては動作しない場合があります.その場合は,後に示すような解像度を落とす設定をするか,CPU版を使ってください.

● 画像変換するサンプルの実行
▲1,カレント・ディレクトリを変更する
 コマンド プロンプトを開き,cdコマンドを使ってカレント・ディレクトリをopenposeフォルダに移動します.例えば,D ドライブの下にopenposeフォルダがある場合は,次のコマンドで移動します.

C:\users\username>d:
D:>cd openpose

▲2,フォルダの作成
 openposeフォルダにmydataフォルダを作ります(図3−5).フォルダ作成はエクスプローラでフォルダを開いて新規作成で行います.


▲3,バッチ・ファイルの実行
 openposeフォルダの中のmodelsフォルダにあるgetBaseModels.batをダブルクリックして実行します(図3−6).これを実行しないとエラーが出るので気を付けてください.
▲4,コマンドの実行
 コマンド プロンプトでリスト3−1 を実行します.ここでは,examples フォルダの下のmedia フォルダにある全ての画像を変換し,mydataフォルダに保存することを行います.実行にはかなりの時間がかかる場合がありますので,最初は念のため解像度を下げて実行します.実行中は図3−7 のように画像が次々に現れます.
 筆者のPC はCPU はCore i7−8700(最高動作周波数4.60 GHz),メモリは16G バイトですが,1 つの画像を処理するのに2 秒くらいかかりました.

● 画像から骨格抽出する
 ここでは図3−8 を使って,手の認識や顔の認識を行う方法を説明します.実行時の主なオプションを表3−1 に示します.
▲通常の認識
 実行のためのコマンドをリスト3−2 に示します.リスト3−1 からの変更点は出力先をmydataフォルダの下のbodyフォルダにした点です.出力結果を図3−9 に示します.
▲手の認識
 手を認識するためには−−handオプションを使います(リスト3−3).手の認識を行った場合,1 枚当たり10秒程度かかりました.出力結果を図3−10に示します.
▲顔の認識
 手を認識するためには,−−faceオプションを使います(リスト3−4).手の認識を行った場合,1 枚当たり5 秒程度かかりました.出力結果を図3−11 に示します.

▲手と顔の認識
 手と顔の両方を認識するためには,−−handオプションと−−face オプションを同時に使います(リスト3−5).この場合,1枚当たり15 秒程度かかりました.
▲骨格だけ出力
 骨格だけ画像として出力するには,−−disable_blendingオプションを使います(リスト3−6).この場合,1 枚当たり2 秒程度かかりました.出力結果を図3−12 に示します.

● 映像から骨格抽出する
▲動画
 動画の場合は,−−videoオプションで動画を選択し,−−write_video オプションで出力します(リスト3−7).ここではexamplesフォルダの下のmediaフォルダにあるvideo.aviを使います.なお,このビデオのフレーム数は205枚です.
 処理時間は画像1 枚ずつ処理する時間とほぼ変わりませんので,205 枚の画像を処理する時間がかかります.画像の左下にフレーム数が表示されていますので,残り時間の見当がつきます.

▲ウェブ・カメラ
 USB 接続のウェブ・カメラを使う場合は,−−cameraオプションを使います(リスト3−8).この場合も画像を1 枚処理する時間は変わりません.ESC キーを押してから1 〜2 フレーム後に終了します.
● エラーの対処法
▲ net_resolution設定時のエラー
 設定する解像度は16 の倍数でなければなりません.例えば,リスト3−9 のように240 ではなく250 とした場合は,リスト3−10 のエラーが表示されます.
▲GPU使用時のエラー
 GPU を使った場合で,メモリが不足した場合はリスト3−11 のエラーが表示されます.この場合は,−−net_resolution オプションの解像度を下げてください.繰り返しになりますが,解像度は16 の倍数でなければなりません.

<プログラムの入手先>
https://www.cqpub.co.jp/interface/download/contents_ai.htm

本稿は著作物であり,著作権法により保護されています.本書の一部,または全部を著作権者に断りなく,複製または改変し他人に譲渡すること,インターネットなどに公開することは法律により固く禁止されています.違反した場合は,民事上の制裁および刑事罰の対象となることがあります.

この記事が気に入ったらサポートをしてみませんか?