人物画像の姿勢推定をNode-REDで行う方法

日立製作所OSSソリューションセンタの横井です。[前の記事](https://qiita.com/kazuhitoyokoi/items/268b70bdf87014bff914)では、RedHat OpenShiftのNode-REDオペレータの使用方法をご紹介しました。この記事では、OpenShiftのNode-RED環境と、TensorFlowコンテナを接続する手順についてご説明します。

# 使用例

ここでは、自動車を運転する際の警報システムを実現するNode-REDのフローの例を使用します。日本では、ご存知のように自動車は左側の道路を走り、サイクリストもその自動車の同じ左側を走ります。そのため、サイクリストが自動車に近づく際は、ドライバーは衝突を回避する必要があります。この状況を支援するため、このシステムは、サイクリストが右折する兆候を示したことを人間の姿勢推定モデルを使用して判定し、ドライバーへ警告を表示します。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/ec0523df-08f4-e2e8-fdae-aaa84ecf443d.png' width='500px'>

次の手順を行う前に、前の記事で説明したようにNode-REDオペレータを使用して、事前にNode-RED環境を作成する必要があります。すべての操作は、OpenShiftウェブコンソール上で、adminロールではなく、developerアカウントで行う必要があります。

# (1) TensorFlowコンテナのデプロイ

ウェブコンソール上で、「+Add」->「Container image」の項目へアクセスします。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/8816d0d7-1bec-5476-510a-0da5fb06c298.png)

次のウィザードでは、Image name from external registryに「quay.io/codait/max-human-pose-estimator」を貼り付けます。このコンテナには、入力画像から人間の姿勢を推定するREST API サーバが含まれています(興味がある場合は、[詳細](https://github.com/IBM/MAX-Human-Pose-Estimator#deploy-on-red-hat-openshift)を参照してください)。Generalフィールドの"application name"と"name"の他の項目については、イメージ名を貼り付けた後、自動的に入力されます。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/fb311a39-5236-6d79-bcf0-09822bb0d680.png)

ウィザードのCreateボタンをクリックしてから約2分が経過すると、max-human-pose-estimatorインスタンスのリングが青になり、デプロイが成功したことが分かります。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/ec03e77c-3dc5-b170-1868-15dfcee36513.png)

OpenShiftのロゴが表示されているmax-human-pose-estimatorインスタンスをダブルクリックすることによって、詳細サイドエリアのResourcesタブのRoutesフィールドの中にREST APIのエンドポイントURLが生成されていることを確認できます。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/d5b31528-ab39-a912-3d81-ee038e088f9b.png)

エンドポイントのURLにアクセスすると、Swagger UIからREST APIサーバに用意されているメソッドを呼び出すことができます。最後に、Node-REDのフローを編集する時に用いるため、このエンドポイントのURLを覚えておいてください。

# (2) Node-REDのフローを読み込み

GitHubからサンプルフローを読み込むには、まずNode-REDフローエディタのメニューで「プロジェクト」->「新規」を選択します。Node-REDオペレータによって作成されたNode-RED環境では、このプロジェクト機能と呼ばれるGitHubとの統合機能がデフォルトで有効になっています。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/66ece29a-ab65-c84b-3597-7c905037827a.png' width='500px'>

以下のウィザードで「リポジトリのクローン」ボタンをクリックして、サンプルのNode-REDフローを含むリポジトリを複製します。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/9b59bfe2-0f20-4664-765d-1c5ceab99294.png' width='500px'>

次のウィンドウでは、gitコマンドが使用する名前と電子メールアドレスを入力する必要があります。ただし、ここでの手順では、本情報を必要とするgit commitコマンドが登場しないため、この情報は使用されません。

最後に、GitリポジトリのURLに「[https://github.com/kazuhitoyokoi/node-red-pose-estimation-demo.git](https://github.com/kazuhitoyokoi/node-red-pose-estimation-demo.git)」を貼り付けます。プロジェクト名は自動的に入力されます。また、その他のフィールドは空である必要があります。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/b2f279ee-8e08-38d1-4edd-b2aa5c17c522.png' width='500px'>

この時点では、いくつかのNode-REDノードのモジュールが存在しないため、読み込み処理の後にエラー通知がポップアップ表示されます。この問題を解決するには、まず「プロジェクトの依存関係を管理」のボタンをクリックしてプロジェクト設定UIを開きます(もし、このボタンがない場合は、情報タブにあるプロジェクト名の横の「・・・」ボタンをクリックします)。

![ja10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/528bac7d-35a2-822f-0d6d-b8efb270fae2.png)

プロジェクト設定UIの依存関係タブには、次のようにいくつかのNode-REDモジュールが不足していることが示されます。これらのモジュールをNode-REDにインストールするには、各インストールボタンをクリックします。

![ja11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/33aac0dc-d0ed-d068-36f9-4191b59dd9f9.png)

モジュールが存在しない問題を修正すると、Node-REDのフローが、赤い点線を持つ不明なノードがないフローになります。

# (3) エンドポイントを編集

エンドポイントのURLを、OpenShift環境にデプロイしたTensorFlowコンテナに変更するには、まずhuman-pose-estimatorノードをダブルクリックします。

![flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/604b9230-f5e7-8c5f-f901-6c594f29aed3.png)

エンドポイントの設定UIに移動するには、ノードプロパティUIにある鉛筆ボタンをクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/6d11aae2-4bbd-1711-67a4-c1bb6e2ba002.png' width='500px'>

エンドポイント設定UIのホスト欄については、前もってデプロイしておいたmax-human-pose-estimatorインスタンスからコピーしたエンドポイントのURLを貼り付けます。なお、名前のフィールドをopenshiftに変更することは必須ではありません。エンドポイント設定UIの「更新」ボタン、ノードプロパティUIの「完了」ボタンをクリックし、フローエディタの画面に戻った後、右上のデプロイボタンをクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/2a788978-d5aa-c80c-33cc-d5e1719a8f3f.png' width='500px'>

# (4) フローの動作確認

左上にあるinjectノードの左側にあるボタンをクリックすると、右上のimage previewノードの下に注釈付きの画像が表示されます。同時に、OKの画像が右下のimage previewノードの下に出現します。両者の間にあるanalyzeノードによって、人間が自転車に乗っているときの通常のポジションかどうかが判断されます。

![okflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/ec6cc736-ff1d-7ddd-d0e2-55cf84d87166.png)

次の手順として、2番目のinjectノードのボタンをクリックすると、結果として警告の画像が表示されます。右側の腕が上がったため、サイクリストがすぐに右に曲がるだろうと、analyzeノードを使用して判断されました。

![ngflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/2e09e19e-575a-6497-1cdd-cfc8cea27c11.png)

必要に応じて、http requestノードだけではなく、その他のプロトコルを介して、その自動車に装備されているカメラに接続することもできます。

この記事では、Node-REDとRedHat OpenShiftにデプロイした他のコンポーネントとを統合する例を説明しました。MySQLノードのようなNode-REDノードモジュールで接続できる便利なコンポーネントがOpenShiftにはいくつかあるため、今後もこれらのコンポーネントを調べ、その他の利用例についても考えてゆこうと思います。