主要内容

深層学習を使用した体の姿勢の推定

この例では,OpenPoseアルゴリズムと事前学習済みネットワークを使用して1人以上の人物の身体の姿勢を推定する方法を示します。

身体の姿勢の推定の目的は,。シーンに複数の人がいる場合は,オクルージョン,身体の接触,および類似の身体部位の近接のために,姿勢の推定が難しくなる可能性があります。

体の姿勢を推定する手法は2あります。トップダウン手法では,最初にオブジェクト検出を使用して個々の人物を特定し,次に各人物の姿勢を推定します。ボトムアップ手法では,最初に鼻や左肘など,イメージ内の身体部位を特定し,次に身体部位の妥当な組み合わせに基づいて個々の人物を組み立てます。ボトムアップ手法は,オクル,ジョンと身体の接触に対して有効ですが,手法の実装が難しくなります。OpenPoseは,ボトムアップ手法を使用して複数人の人間の姿勢を推定するアルゴリズムです[1]。

OpenPoseは,イメージ内の身体部位を特定するために,事前学習済みのニューラルネットワークを使用し,入力イメージの身体部位のヒートマップと拥堵(部分关联字段)を予測します[2]。各ヒトマップは,特定のタプの身体部位がメジの各ピクセルに位置する確率を示します。Pafは,2。首から左肩など,定義されたタイプの身体部位の組み合わせごとに,身体部位のインスタンス間におけるベクトル場のx成分とy成分を表す2つの拥堵があります。

身体部位から個々の人物を組み立てるために,OpenPoseアルゴリズムは一連の後処理演算を実行します。最初の演算では,ネットワ,クから返されたヒ,トマップを使用し,身体部位を特定して位置を推定します。その後の演算で,身体部位間の実際の接続を特定し,個々の姿勢を推定します。アルゴリズムの詳細にいては,ヒトマップとpafからの姿勢の特定を参照してください。

ネットワクのンポト

Onnxファルから事前学習済みのネットワクをンポトします。

dataDir = fullfile(tempdir,“OpenPose”);trainedOpenPoseNet_url =“https://ssd.mathworks.com/万博1manbetxsupportfiles/vision/data/human-pose-estimation.zip”;downloadTrainedOpenPoseNet (trainedOpenPoseNet_url dataDir)
预先训练的OpenPose网络已经存在。
解压缩(fullfile (dataDir,“human-pose-estimation.zip”), dataDir);

深度学习工具箱™转换器ONNX模型格式サポートパッケージをダウンロードしてインストールします。

深入学习工具箱转换器™ONNX模型格式がインストールされていない場合,必要なサポートパッケージへのリンクがこの関数によってアドオンエクスプローラーに表示されます。サポートパッケージをインストールするには,リンクをクリックして,[インストール]をクリックします。サポトパッケジがンストルされている場合,関数importONNXLayersLayerGraphオブジェクトを返します。

modelfile = fullfile(dataDir,“human-pose-estimation.onnx”);layers = importONNXLayers(模型文件,“ImportWeights”,真正的);

未使用の出力層を削除します。

layers = removeLayers(layers,layers. outputnames);Net = dlnetwork(layers);

テストメジのヒトマップとpafの予測

テスト▪▪メ▪▪ジを読み取って表示します。

Im = imread(“visionteam.jpg”);imshow (im)

ネットワ,クは,[-0.5,0.5]の範囲内にあるデ,タ型のメジデタを想定しています。デ,タをシフトして,この範囲に再スケ,リングします。

netInput = im2single(im)-0.5;

ネットワ,クは,青,緑,赤の順序のカラ,チャネルを想定しています。。

netInput = netInput(:,:,[3 2 1]);

イメージデータをdlarrayとして保存します。

netInput = darray (netInput,“SSC”);

2次元出力畳み込み層から出力されるヒートマップと拥堵(部分关联字段)を予測します。

[热图,pafs] =预测(net,netInput);

dlarrayに保存されているヒ,トマップの数値デ,タを取得します。デタには19のチャネルがあります。各チャネルは,固有の身体部位のヒ,トマップに対応し,背景のヒ,トマップが1追加されています。

热图= extractdata(热图);

ヒ,トマップをモンタ,ジュで表示し,デ,タ型のメジとして想定されている[0,1]の範囲にデタを再スケリングします。シンには6人がいて,各ヒトマップには6の明るい点があります。

蒙太奇(重新调节(热图),“写成BackgroundColor”“b”“BorderSize”3)

明るい点と身体の対応を可視化するには,テストイメージの上に最初のヒートマップをフォールスカラーで重ねて表示します。

Idx = 1;Hmap =热图(:,:,idx);Hmap = imresize(Hmap,size(im,[1 2]));imshowpair (hmap, im);

OpenPoseアルゴリズムでは,身体部位の位置の決定に背景のヒ,トマップは使用しません。背景のヒ,トマップを削除します。

热图=热图(:,:,1:end-1);

dlarrayに保存されているpafの数値デ,タを取得します。デタには38のチャネルがあります。身体部位の組み合わせのタイプごとに,ベクトル場のx成分とy成分を表す2つのチャネルがあります。

Pafs = extractdata(Pafs);

モンタ,ジュでpafを表示し,デ,タ型のメジとして想定されている[0,1]の範囲にデタを再スケリングします。2 .の列は,ベクトル場のx成分とy成分をそれぞれ表しています。身体部位の組み合わせの順序は,参数个数。PAF_INDEXの値によって決定されます。

  • ほぼ垂直に接続している身体部位の組み合わせでは,y成分の組み合わせの振幅が大きく,x成分の組み合わせの値がごくわずかです。一例は,2行目に表示されている右臀部から右膝への接続です。Pafは,econfメ,econfジ内の実際の姿勢に基づいていることに注意してください。横たわるなど,身体の向きが異なるイメージでは,右臀部から右膝の接続のy成分の振幅が必ずしも大きくなるとは限りません。

  • ほぼ水平に接続している身体部位の組み合わせでは,x成分の組み合わせの振幅が大きく,y成分の組み合わせの値がごくわずかです。一例は,7行目に表示されている首から左肩への接続です。

  • 角度のある身体部位の組み合わせには,ベクトル場のx成分とy成分の両方の値があります。一例は,1行目に表示されている首から左臀部です。

蒙太奇(重新调节(改善),“大小”(19 - 2),“写成BackgroundColor”“b”“BorderSize”3)

拥堵と身体の対応を可視化するには,身体部位の組み合わせの最初のタイプにおけるx成分とy成分をフォールスカラーでテストイメージの上に重ねて表示します。

Idx = 1;损害= horzcat(im,im);pafpair = horzcat(拥堵(:,:2 * idx-1),拥堵(:,:2 * idx));Pafpair = imresize(Pafpair,size(削弱,[1 2]));imshowpair (pafpair,损害);

ヒトマップとpafからの姿勢の特定

アルゴリズムの後処理部分で,ニューラルネットワークによって返されるヒートマップと拥堵を使用して,イメージ内の人物の個々の姿勢を特定します。

補助関数getBodyPoseParametersを使用して,OpenPoseアルゴリズムのパラメ,タ,を取得します。関数は,この例にサポ,トファ,ルとして添付されています。関数は、身体部位の数や考慮すべき身体部位のタイプ間の接続などのパラメーターを含む struct を返します。パラメーターには、アルゴリズムのパフォーマンスを向上させるために調整できるしきい値も含まれています。

params = getBodyPoseParameters;

補助関数getBodyPosesを使用して,個々の人物とその姿勢を特定します。この関数は,この例にサポ,トファ,ルとして添付されています。補助関数は、姿勢の推定のために以下のすべての後処理ステップを実行します。

  1. 非最大抑制を使用して,ヒ,トマップから身体部位の正確な位置を検出します。

  2. 身体部位の組み合わせのタesc escプごとに,検出された身体部位の中で可能な組み合わせをすべて生成します。たとえば,6。結果は2部グラフになります。

  3. 拥堵のベクトル場を使って,検出された2つの身体部位を結ぶ直線の線積分を計算することにより,組み合わせのスコアを算出します。大きなスコアは,検出された身体部位間の接続が強いことを示します。

  4. 可能な組み合わせをスコアで並べ替えて,有効な組み合わせを見けます。有効な身体部位の組み合わせは,同じ人物に属する2の身体部位をなぐ組み合わせです。通常,スコアが最大になる組み合わせが有効な組み合わせである可能性が最も高いため,最初に考慮します。ただし,アルゴリズムは追加の制約を使用してオクル,ジョンと近接を補正します。たとえば,同じ人物が身体部位の同じ組み合わせを複数もことはできません。また,1の身体部位が2。

  5. どの身体部位がながっているかを判別し,身体部位を個々の人物のそれぞれの姿勢へと組み立てます。

補助関数は3次元の行列を返します。1番目の次元は、イメージ内で特定された人物の数を表します。2 番目の次元は、身体部位のタイプの数を表します。3 番目の次元は、それぞれの人物の各身体部位の x 座標と y 座標を示します。身体部位がイメージの中から検出されない場合、その部位の座標は [NaN NaN] になります。

姿态= getbodypose(热图,pafs,params);

補助関数renderBodyPosesを使用して身体の姿勢を表示します。この関数は,この例にサポ,トファ,ルとして添付されています。

renderBodyPoses (im、姿势、大小(热图,1),大小(热图,2),参数);

参考文献

[1]曹、哲、希内斯·伊达尔戈、托马斯·西蒙、魏世恩和亚瑟·谢赫。OpenPose:使用部件亲和字段的实时多人2D姿态估计。ArXiv: 1812.08008 (Cs)2019年5月30日。https://arxiv.org/abs/1812.08008

[2]奥索金,丹尼尔。CPU上的实时2D多人姿态估计:轻量级OpenPoseArXiv: 1811.12004 (Cs)2018年11月29日。https://arxiv.org/abs/1811.12004

参考

(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)