Cet article est reproduit à partir de Notre blog.
Cette fois, je vais lancer OpenPose sur Mac en utilisant chainer. (Ce sera une partie de la fonction pour générer la carte thermique de détection au lieu de l'ensemble)
Il a déjà été rapporté qu'OpenPose, un algorithme d'estimation de squelette utilisant une caméra monoculaire annoncé au CVPR2017, réalisera un traitement en temps réel sur Ubuntu et Windows. Cependant, étant donné que le GPU est requis ou que Mac ne le prend pas en charge, je me suis demandé s'il pouvait être exécuté sur Mac ou CPU, je vais donc charger le modèle Caffe avec Chainer et exécuter uniquement la partie DNN de la première moitié.
Mac book Pro (2.7 GHz Intel Core i5,16 GB 1867 MHz DDR3) Python2.7 (Chainer, Numpy)
Téléchargez l'exécutable binaire pour Windows à ici. Il contient le fichier de paramètres Caffe. (Si vous êtes intéressé par les liens directs, téléchargez et décompressez la démo portable OpenPose 1.0. Au milieu de https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/installation.md. Veuillez passer de 1.)
Cette fois, nous utiliserons un modèle COCO qui estime 18 squelettes. (Le modèle MPI peut être fait par la même procédure) Le modèle Caffe est stocké dans le répertoire suivant.
OpenPose_demo_1.0.1/models/pose/coco/pose_iter_440000.caffemodel
Lisez ceci du chainer.
from chainer.functions import caffe
func = caffe.CaffeFunction('pose_iter_440000.caffemodel')
OpenPose_demo_1.0.1/models/pose/coco/pose_deploy_linevec.prototxt Si vous lisez, la configuration du réseau est écrite, et si vous regardez la dernière couche de sortie
layer {
name: "concat_stage7"
type: "Concat"
bottom: "Mconv7_stage6_L2"
bottom: "Mconv7_stage6_L1"
# top: "concat_stage7"
top: "net_output"
concat_param {
axis: 1
}
}
Le premier nœud de sortie est défini avec le nom Mconv7_stage6_L2. (Mconv7_stage6_L1 ressemble plus à un os)
Ainsi, en spécifiant ceci dans la couche de sortie de func, vous pouvez obtenir la carte de sortie de (1,19, h, w).
x = chainer.Variable([Tableau Numpy d'images])
y, = func(inputs={'data': x}, outputs=['Mconv7_stage6_L2'])
print y.data.shape #(1,19,h,w)
Le tableau numpy d'images a une taille de 0,0 à 1,0 (1, 4, hauteur, largeur) et des valeurs au lieu de 0 à 255. Notez également que le dtype doit être np.float32. (Je ne sais pas si RGBA est censé être utilisé à la place de RGB, mais je tape dans le 4ème avec 0 rempli)
↓ Cette image j'ai essayé
POSE_COCO_BODY_PARTS {
{0, "Nose"},
{1, "Neck"},
{2, "RShoulder"},
{3, "RElbow"},
{4, "RWrist"},
{5, "LShoulder"},
{6, "LElbow"},
{7, "LWrist"},
{8, "RHip"},
{9, "RKnee"},
{10, "RAnkle"},
{11, "LHip"},
{12, "LKnee"},
{13, "LAnkle"},
{14, "REye"},
{15, "LEye"},
{16, "REar"},
{17, "LEar"},
{18, "Bkg"},
}
La carte thermique montre la probabilité d'existence de chaque partie du corps écrite dans la structure ci-dessus. Cela prend environ 10 secondes par feuille, mais cela fonctionne sur le processeur, donc il semble être plus polyvalent.
Recommended Posts