opencv使用openPose实现人体姿态检测

摘要:
原文地址:https://www.learnopencv.com/deep-learning-based-human-pose-estimation-using-opencv-cpp-python/COCO输出格式:鼻子–0,脖子–1,右肩–2,右肘–3,右腕–4,左肩–5,左肘–6,左腕–7,右臀部–8,右膝盖–9,右脚踝–10,左髋–11,左膝–12,LAnkle–13,右眼–14,左眼–15

原文地址:https://www.learnopencv.com/deep-learning-based-human-pose-estimation-using-opencv-cpp-python/

COCO输出格式:

鼻子– 0,脖子– 1,右肩– 2,右肘– 3,右腕– 4,左肩– 5,左肘– 6,左腕– 7,右臀部– 8,右膝盖– 9 ,右脚踝– 10,左髋– 11,左膝– 12,LAnkle – 13,右眼– 14,左眼– 15,右耳– 16,左耳– 17,背景– 18

opencv使用openPose实现人体姿态检测第1张

模型文件:

input: "image"input_dim: 1input_dim: 3input_dim: 1# This value will be defined at runtime
input_dim: 1# This value will be defined at runtime
layer {
  name: "conv1_1"type: "Convolution"bottom: "image"top: "conv1_1"param {
    lr_mult: 1.0decay_mult: 1}
  param {
    lr_mult: 2.0decay_mult: 0}
  convolution_param {
    num_output: 64pad: 1kernel_size: 3weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "relu1_1"type: "ReLU"bottom: "conv1_1"top: "conv1_1"}
layer {
  name: "conv1_2"type: "Convolution"bottom: "conv1_1"top: "conv1_2"param {
    lr_mult: 1.0decay_mult: 1}
  param {
    lr_mult: 2.0decay_mult: 0}
  convolution_param {
    num_output: 64pad: 1kernel_size: 3weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "relu1_2"type: "ReLU"bottom: "conv1_2"top: "conv1_2"}
layer {
  name: "pool1_stage1"type: "Pooling"bottom: "conv1_2"top: "pool1_stage1"pooling_param {
    pool: MAX
    kernel_size: 2stride: 2}
}
layer {
  name: "conv2_1"type: "Convolution"bottom: "pool1_stage1"top: "conv2_1"param {
    lr_mult: 1.0decay_mult: 1}
  param {
    lr_mult: 2.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 1kernel_size: 3weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "relu2_1"type: "ReLU"bottom: "conv2_1"top: "conv2_1"}
layer {
  name: "conv2_2"type: "Convolution"bottom: "conv2_1"top: "conv2_2"param {
    lr_mult: 1.0decay_mult: 1}
  param {
    lr_mult: 2.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 1kernel_size: 3weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "relu2_2"type: "ReLU"bottom: "conv2_2"top: "conv2_2"}
layer {
  name: "pool2_stage1"type: "Pooling"bottom: "conv2_2"top: "pool2_stage1"pooling_param {
    pool: MAX
    kernel_size: 2stride: 2}
}
layer {
  name: "conv3_1"type: "Convolution"bottom: "pool2_stage1"top: "conv3_1"param {
    lr_mult: 1.0decay_mult: 1}
  param {
    lr_mult: 2.0decay_mult: 0}
  convolution_param {
    num_output: 256pad: 1kernel_size: 3weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "relu3_1"type: "ReLU"bottom: "conv3_1"top: "conv3_1"}
layer {
  name: "conv3_2"type: "Convolution"bottom: "conv3_1"top: "conv3_2"param {
    lr_mult: 1.0decay_mult: 1}
  param {
    lr_mult: 2.0decay_mult: 0}
  convolution_param {
    num_output: 256pad: 1kernel_size: 3weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "relu3_2"type: "ReLU"bottom: "conv3_2"top: "conv3_2"}
layer {
  name: "conv3_3"type: "Convolution"bottom: "conv3_2"top: "conv3_3"param {
    lr_mult: 1.0decay_mult: 1}
  param {
    lr_mult: 2.0decay_mult: 0}
  convolution_param {
    num_output: 256pad: 1kernel_size: 3weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "relu3_3"type: "ReLU"bottom: "conv3_3"top: "conv3_3"}
layer {
  name: "conv3_4"type: "Convolution"bottom: "conv3_3"top: "conv3_4"param {
    lr_mult: 1.0decay_mult: 1}
  param {
    lr_mult: 2.0decay_mult: 0}
  convolution_param {
    num_output: 256pad: 1kernel_size: 3weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "relu3_4"type: "ReLU"bottom: "conv3_4"top: "conv3_4"}
layer {
  name: "pool3_stage1"type: "Pooling"bottom: "conv3_4"top: "pool3_stage1"pooling_param {
    pool: MAX
    kernel_size: 2stride: 2}
}
layer {
  name: "conv4_1"type: "Convolution"bottom: "pool3_stage1"top: "conv4_1"param {
    lr_mult: 1.0decay_mult: 1}
  param {
    lr_mult: 2.0decay_mult: 0}
  convolution_param {
    num_output: 512pad: 1kernel_size: 3weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "relu4_1"type: "ReLU"bottom: "conv4_1"top: "conv4_1"}
layer {
  name: "conv4_2"type: "Convolution"bottom: "conv4_1"top: "conv4_2"param {
    lr_mult: 1.0decay_mult: 1}
  param {
    lr_mult: 2.0decay_mult: 0}
  convolution_param {
    num_output: 512pad: 1kernel_size: 3weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "relu4_2"type: "ReLU"bottom: "conv4_2"top: "conv4_2"}
layer {
  name: "conv4_3_CPM"type: "Convolution"bottom: "conv4_2"top: "conv4_3_CPM"param {
    lr_mult: 1.0decay_mult: 1}
  param {
    lr_mult: 2.0decay_mult: 0}
  convolution_param {
    num_output: 256pad: 1kernel_size: 3weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "relu4_3_CPM"type: "ReLU"bottom: "conv4_3_CPM"top: "conv4_3_CPM"}
layer {
  name: "conv4_4_CPM"type: "Convolution"bottom: "conv4_3_CPM"top: "conv4_4_CPM"param {
    lr_mult: 1.0decay_mult: 1}
  param {
    lr_mult: 2.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 1kernel_size: 3weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "relu4_4_CPM"type: "ReLU"bottom: "conv4_4_CPM"top: "conv4_4_CPM"}
layer {
  name: "conv5_1_CPM_L1"type: "Convolution"bottom: "conv4_4_CPM"top: "conv5_1_CPM_L1"param {
    lr_mult: 1.0decay_mult: 1}
  param {
    lr_mult: 2.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 1kernel_size: 3weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "relu5_1_CPM_L1"type: "ReLU"bottom: "conv5_1_CPM_L1"top: "conv5_1_CPM_L1"}
layer {
  name: "conv5_1_CPM_L2"type: "Convolution"bottom: "conv4_4_CPM"top: "conv5_1_CPM_L2"param {
    lr_mult: 1.0decay_mult: 1}
  param {
    lr_mult: 2.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 1kernel_size: 3weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "relu5_1_CPM_L2"type: "ReLU"bottom: "conv5_1_CPM_L2"top: "conv5_1_CPM_L2"}
layer {
  name: "conv5_2_CPM_L1"type: "Convolution"bottom: "conv5_1_CPM_L1"top: "conv5_2_CPM_L1"param {
    lr_mult: 1.0decay_mult: 1}
  param {
    lr_mult: 2.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 1kernel_size: 3weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "relu5_2_CPM_L1"type: "ReLU"bottom: "conv5_2_CPM_L1"top: "conv5_2_CPM_L1"}
layer {
  name: "conv5_2_CPM_L2"type: "Convolution"bottom: "conv5_1_CPM_L2"top: "conv5_2_CPM_L2"param {
    lr_mult: 1.0decay_mult: 1}
  param {
    lr_mult: 2.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 1kernel_size: 3weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "relu5_2_CPM_L2"type: "ReLU"bottom: "conv5_2_CPM_L2"top: "conv5_2_CPM_L2"}
layer {
  name: "conv5_3_CPM_L1"type: "Convolution"bottom: "conv5_2_CPM_L1"top: "conv5_3_CPM_L1"param {
    lr_mult: 1.0decay_mult: 1}
  param {
    lr_mult: 2.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 1kernel_size: 3weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "relu5_3_CPM_L1"type: "ReLU"bottom: "conv5_3_CPM_L1"top: "conv5_3_CPM_L1"}
layer {
  name: "conv5_3_CPM_L2"type: "Convolution"bottom: "conv5_2_CPM_L2"top: "conv5_3_CPM_L2"param {
    lr_mult: 1.0decay_mult: 1}
  param {
    lr_mult: 2.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 1kernel_size: 3weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "relu5_3_CPM_L2"type: "ReLU"bottom: "conv5_3_CPM_L2"top: "conv5_3_CPM_L2"}
layer {
  name: "conv5_4_CPM_L1"type: "Convolution"bottom: "conv5_3_CPM_L1"top: "conv5_4_CPM_L1"param {
    lr_mult: 1.0decay_mult: 1}
  param {
    lr_mult: 2.0decay_mult: 0}
  convolution_param {
    num_output: 512pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "relu5_4_CPM_L1"type: "ReLU"bottom: "conv5_4_CPM_L1"top: "conv5_4_CPM_L1"}
layer {
  name: "conv5_4_CPM_L2"type: "Convolution"bottom: "conv5_3_CPM_L2"top: "conv5_4_CPM_L2"param {
    lr_mult: 1.0decay_mult: 1}
  param {
    lr_mult: 2.0decay_mult: 0}
  convolution_param {
    num_output: 512pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "relu5_4_CPM_L2"type: "ReLU"bottom: "conv5_4_CPM_L2"top: "conv5_4_CPM_L2"}
layer {
  name: "conv5_5_CPM_L1"type: "Convolution"bottom: "conv5_4_CPM_L1"top: "conv5_5_CPM_L1"param {
    lr_mult: 1.0decay_mult: 1}
  param {
    lr_mult: 2.0decay_mult: 0}
  convolution_param {
    num_output: 38pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "conv5_5_CPM_L2"type: "Convolution"bottom: "conv5_4_CPM_L2"top: "conv5_5_CPM_L2"param {
    lr_mult: 1.0decay_mult: 1}
  param {
    lr_mult: 2.0decay_mult: 0}
  convolution_param {
    num_output: 19pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "concat_stage2"type: "Concat"bottom: "conv5_5_CPM_L1"bottom: "conv5_5_CPM_L2"bottom: "conv4_4_CPM"top: "concat_stage2"concat_param {
    axis: 1}
}
layer {
  name: "Mconv1_stage2_L1"type: "Convolution"bottom: "concat_stage2"top: "Mconv1_stage2_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu1_stage2_L1"type: "ReLU"bottom: "Mconv1_stage2_L1"top: "Mconv1_stage2_L1"}
layer {
  name: "Mconv1_stage2_L2"type: "Convolution"bottom: "concat_stage2"top: "Mconv1_stage2_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu1_stage2_L2"type: "ReLU"bottom: "Mconv1_stage2_L2"top: "Mconv1_stage2_L2"}
layer {
  name: "Mconv2_stage2_L1"type: "Convolution"bottom: "Mconv1_stage2_L1"top: "Mconv2_stage2_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu2_stage2_L1"type: "ReLU"bottom: "Mconv2_stage2_L1"top: "Mconv2_stage2_L1"}
layer {
  name: "Mconv2_stage2_L2"type: "Convolution"bottom: "Mconv1_stage2_L2"top: "Mconv2_stage2_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu2_stage2_L2"type: "ReLU"bottom: "Mconv2_stage2_L2"top: "Mconv2_stage2_L2"}
layer {
  name: "Mconv3_stage2_L1"type: "Convolution"bottom: "Mconv2_stage2_L1"top: "Mconv3_stage2_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu3_stage2_L1"type: "ReLU"bottom: "Mconv3_stage2_L1"top: "Mconv3_stage2_L1"}
layer {
  name: "Mconv3_stage2_L2"type: "Convolution"bottom: "Mconv2_stage2_L2"top: "Mconv3_stage2_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu3_stage2_L2"type: "ReLU"bottom: "Mconv3_stage2_L2"top: "Mconv3_stage2_L2"}
layer {
  name: "Mconv4_stage2_L1"type: "Convolution"bottom: "Mconv3_stage2_L1"top: "Mconv4_stage2_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu4_stage2_L1"type: "ReLU"bottom: "Mconv4_stage2_L1"top: "Mconv4_stage2_L1"}
layer {
  name: "Mconv4_stage2_L2"type: "Convolution"bottom: "Mconv3_stage2_L2"top: "Mconv4_stage2_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu4_stage2_L2"type: "ReLU"bottom: "Mconv4_stage2_L2"top: "Mconv4_stage2_L2"}
layer {
  name: "Mconv5_stage2_L1"type: "Convolution"bottom: "Mconv4_stage2_L1"top: "Mconv5_stage2_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu5_stage2_L1"type: "ReLU"bottom: "Mconv5_stage2_L1"top: "Mconv5_stage2_L1"}
layer {
  name: "Mconv5_stage2_L2"type: "Convolution"bottom: "Mconv4_stage2_L2"top: "Mconv5_stage2_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu5_stage2_L2"type: "ReLU"bottom: "Mconv5_stage2_L2"top: "Mconv5_stage2_L2"}
layer {
  name: "Mconv6_stage2_L1"type: "Convolution"bottom: "Mconv5_stage2_L1"top: "Mconv6_stage2_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu6_stage2_L1"type: "ReLU"bottom: "Mconv6_stage2_L1"top: "Mconv6_stage2_L1"}
layer {
  name: "Mconv6_stage2_L2"type: "Convolution"bottom: "Mconv5_stage2_L2"top: "Mconv6_stage2_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu6_stage2_L2"type: "ReLU"bottom: "Mconv6_stage2_L2"top: "Mconv6_stage2_L2"}
layer {
  name: "Mconv7_stage2_L1"type: "Convolution"bottom: "Mconv6_stage2_L1"top: "Mconv7_stage2_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 38pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mconv7_stage2_L2"type: "Convolution"bottom: "Mconv6_stage2_L2"top: "Mconv7_stage2_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 19pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "concat_stage3"type: "Concat"bottom: "Mconv7_stage2_L1"bottom: "Mconv7_stage2_L2"bottom: "conv4_4_CPM"top: "concat_stage3"concat_param {
    axis: 1}
}
layer {
  name: "Mconv1_stage3_L1"type: "Convolution"bottom: "concat_stage3"top: "Mconv1_stage3_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu1_stage3_L1"type: "ReLU"bottom: "Mconv1_stage3_L1"top: "Mconv1_stage3_L1"}
layer {
  name: "Mconv1_stage3_L2"type: "Convolution"bottom: "concat_stage3"top: "Mconv1_stage3_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu1_stage3_L2"type: "ReLU"bottom: "Mconv1_stage3_L2"top: "Mconv1_stage3_L2"}
layer {
  name: "Mconv2_stage3_L1"type: "Convolution"bottom: "Mconv1_stage3_L1"top: "Mconv2_stage3_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu2_stage3_L1"type: "ReLU"bottom: "Mconv2_stage3_L1"top: "Mconv2_stage3_L1"}
layer {
  name: "Mconv2_stage3_L2"type: "Convolution"bottom: "Mconv1_stage3_L2"top: "Mconv2_stage3_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu2_stage3_L2"type: "ReLU"bottom: "Mconv2_stage3_L2"top: "Mconv2_stage3_L2"}
layer {
  name: "Mconv3_stage3_L1"type: "Convolution"bottom: "Mconv2_stage3_L1"top: "Mconv3_stage3_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu3_stage3_L1"type: "ReLU"bottom: "Mconv3_stage3_L1"top: "Mconv3_stage3_L1"}
layer {
  name: "Mconv3_stage3_L2"type: "Convolution"bottom: "Mconv2_stage3_L2"top: "Mconv3_stage3_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu3_stage3_L2"type: "ReLU"bottom: "Mconv3_stage3_L2"top: "Mconv3_stage3_L2"}
layer {
  name: "Mconv4_stage3_L1"type: "Convolution"bottom: "Mconv3_stage3_L1"top: "Mconv4_stage3_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu4_stage3_L1"type: "ReLU"bottom: "Mconv4_stage3_L1"top: "Mconv4_stage3_L1"}
layer {
  name: "Mconv4_stage3_L2"type: "Convolution"bottom: "Mconv3_stage3_L2"top: "Mconv4_stage3_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu4_stage3_L2"type: "ReLU"bottom: "Mconv4_stage3_L2"top: "Mconv4_stage3_L2"}
layer {
  name: "Mconv5_stage3_L1"type: "Convolution"bottom: "Mconv4_stage3_L1"top: "Mconv5_stage3_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu5_stage3_L1"type: "ReLU"bottom: "Mconv5_stage3_L1"top: "Mconv5_stage3_L1"}
layer {
  name: "Mconv5_stage3_L2"type: "Convolution"bottom: "Mconv4_stage3_L2"top: "Mconv5_stage3_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu5_stage3_L2"type: "ReLU"bottom: "Mconv5_stage3_L2"top: "Mconv5_stage3_L2"}
layer {
  name: "Mconv6_stage3_L1"type: "Convolution"bottom: "Mconv5_stage3_L1"top: "Mconv6_stage3_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu6_stage3_L1"type: "ReLU"bottom: "Mconv6_stage3_L1"top: "Mconv6_stage3_L1"}
layer {
  name: "Mconv6_stage3_L2"type: "Convolution"bottom: "Mconv5_stage3_L2"top: "Mconv6_stage3_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu6_stage3_L2"type: "ReLU"bottom: "Mconv6_stage3_L2"top: "Mconv6_stage3_L2"}
layer {
  name: "Mconv7_stage3_L1"type: "Convolution"bottom: "Mconv6_stage3_L1"top: "Mconv7_stage3_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 38pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mconv7_stage3_L2"type: "Convolution"bottom: "Mconv6_stage3_L2"top: "Mconv7_stage3_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 19pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "concat_stage4"type: "Concat"bottom: "Mconv7_stage3_L1"bottom: "Mconv7_stage3_L2"bottom: "conv4_4_CPM"top: "concat_stage4"concat_param {
    axis: 1}
}
layer {
  name: "Mconv1_stage4_L1"type: "Convolution"bottom: "concat_stage4"top: "Mconv1_stage4_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu1_stage4_L1"type: "ReLU"bottom: "Mconv1_stage4_L1"top: "Mconv1_stage4_L1"}
layer {
  name: "Mconv1_stage4_L2"type: "Convolution"bottom: "concat_stage4"top: "Mconv1_stage4_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu1_stage4_L2"type: "ReLU"bottom: "Mconv1_stage4_L2"top: "Mconv1_stage4_L2"}
layer {
  name: "Mconv2_stage4_L1"type: "Convolution"bottom: "Mconv1_stage4_L1"top: "Mconv2_stage4_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu2_stage4_L1"type: "ReLU"bottom: "Mconv2_stage4_L1"top: "Mconv2_stage4_L1"}
layer {
  name: "Mconv2_stage4_L2"type: "Convolution"bottom: "Mconv1_stage4_L2"top: "Mconv2_stage4_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu2_stage4_L2"type: "ReLU"bottom: "Mconv2_stage4_L2"top: "Mconv2_stage4_L2"}
layer {
  name: "Mconv3_stage4_L1"type: "Convolution"bottom: "Mconv2_stage4_L1"top: "Mconv3_stage4_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu3_stage4_L1"type: "ReLU"bottom: "Mconv3_stage4_L1"top: "Mconv3_stage4_L1"}
layer {
  name: "Mconv3_stage4_L2"type: "Convolution"bottom: "Mconv2_stage4_L2"top: "Mconv3_stage4_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu3_stage4_L2"type: "ReLU"bottom: "Mconv3_stage4_L2"top: "Mconv3_stage4_L2"}
layer {
  name: "Mconv4_stage4_L1"type: "Convolution"bottom: "Mconv3_stage4_L1"top: "Mconv4_stage4_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu4_stage4_L1"type: "ReLU"bottom: "Mconv4_stage4_L1"top: "Mconv4_stage4_L1"}
layer {
  name: "Mconv4_stage4_L2"type: "Convolution"bottom: "Mconv3_stage4_L2"top: "Mconv4_stage4_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu4_stage4_L2"type: "ReLU"bottom: "Mconv4_stage4_L2"top: "Mconv4_stage4_L2"}
layer {
  name: "Mconv5_stage4_L1"type: "Convolution"bottom: "Mconv4_stage4_L1"top: "Mconv5_stage4_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu5_stage4_L1"type: "ReLU"bottom: "Mconv5_stage4_L1"top: "Mconv5_stage4_L1"}
layer {
  name: "Mconv5_stage4_L2"type: "Convolution"bottom: "Mconv4_stage4_L2"top: "Mconv5_stage4_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu5_stage4_L2"type: "ReLU"bottom: "Mconv5_stage4_L2"top: "Mconv5_stage4_L2"}
layer {
  name: "Mconv6_stage4_L1"type: "Convolution"bottom: "Mconv5_stage4_L1"top: "Mconv6_stage4_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu6_stage4_L1"type: "ReLU"bottom: "Mconv6_stage4_L1"top: "Mconv6_stage4_L1"}
layer {
  name: "Mconv6_stage4_L2"type: "Convolution"bottom: "Mconv5_stage4_L2"top: "Mconv6_stage4_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu6_stage4_L2"type: "ReLU"bottom: "Mconv6_stage4_L2"top: "Mconv6_stage4_L2"}
layer {
  name: "Mconv7_stage4_L1"type: "Convolution"bottom: "Mconv6_stage4_L1"top: "Mconv7_stage4_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 38pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mconv7_stage4_L2"type: "Convolution"bottom: "Mconv6_stage4_L2"top: "Mconv7_stage4_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 19pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "concat_stage5"type: "Concat"bottom: "Mconv7_stage4_L1"bottom: "Mconv7_stage4_L2"bottom: "conv4_4_CPM"top: "concat_stage5"concat_param {
    axis: 1}
}
layer {
  name: "Mconv1_stage5_L1"type: "Convolution"bottom: "concat_stage5"top: "Mconv1_stage5_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu1_stage5_L1"type: "ReLU"bottom: "Mconv1_stage5_L1"top: "Mconv1_stage5_L1"}
layer {
  name: "Mconv1_stage5_L2"type: "Convolution"bottom: "concat_stage5"top: "Mconv1_stage5_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu1_stage5_L2"type: "ReLU"bottom: "Mconv1_stage5_L2"top: "Mconv1_stage5_L2"}
layer {
  name: "Mconv2_stage5_L1"type: "Convolution"bottom: "Mconv1_stage5_L1"top: "Mconv2_stage5_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu2_stage5_L1"type: "ReLU"bottom: "Mconv2_stage5_L1"top: "Mconv2_stage5_L1"}
layer {
  name: "Mconv2_stage5_L2"type: "Convolution"bottom: "Mconv1_stage5_L2"top: "Mconv2_stage5_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu2_stage5_L2"type: "ReLU"bottom: "Mconv2_stage5_L2"top: "Mconv2_stage5_L2"}
layer {
  name: "Mconv3_stage5_L1"type: "Convolution"bottom: "Mconv2_stage5_L1"top: "Mconv3_stage5_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu3_stage5_L1"type: "ReLU"bottom: "Mconv3_stage5_L1"top: "Mconv3_stage5_L1"}
layer {
  name: "Mconv3_stage5_L2"type: "Convolution"bottom: "Mconv2_stage5_L2"top: "Mconv3_stage5_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu3_stage5_L2"type: "ReLU"bottom: "Mconv3_stage5_L2"top: "Mconv3_stage5_L2"}
layer {
  name: "Mconv4_stage5_L1"type: "Convolution"bottom: "Mconv3_stage5_L1"top: "Mconv4_stage5_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu4_stage5_L1"type: "ReLU"bottom: "Mconv4_stage5_L1"top: "Mconv4_stage5_L1"}
layer {
  name: "Mconv4_stage5_L2"type: "Convolution"bottom: "Mconv3_stage5_L2"top: "Mconv4_stage5_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu4_stage5_L2"type: "ReLU"bottom: "Mconv4_stage5_L2"top: "Mconv4_stage5_L2"}
layer {
  name: "Mconv5_stage5_L1"type: "Convolution"bottom: "Mconv4_stage5_L1"top: "Mconv5_stage5_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu5_stage5_L1"type: "ReLU"bottom: "Mconv5_stage5_L1"top: "Mconv5_stage5_L1"}
layer {
  name: "Mconv5_stage5_L2"type: "Convolution"bottom: "Mconv4_stage5_L2"top: "Mconv5_stage5_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu5_stage5_L2"type: "ReLU"bottom: "Mconv5_stage5_L2"top: "Mconv5_stage5_L2"}
layer {
  name: "Mconv6_stage5_L1"type: "Convolution"bottom: "Mconv5_stage5_L1"top: "Mconv6_stage5_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu6_stage5_L1"type: "ReLU"bottom: "Mconv6_stage5_L1"top: "Mconv6_stage5_L1"}
layer {
  name: "Mconv6_stage5_L2"type: "Convolution"bottom: "Mconv5_stage5_L2"top: "Mconv6_stage5_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu6_stage5_L2"type: "ReLU"bottom: "Mconv6_stage5_L2"top: "Mconv6_stage5_L2"}
layer {
  name: "Mconv7_stage5_L1"type: "Convolution"bottom: "Mconv6_stage5_L1"top: "Mconv7_stage5_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 38pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mconv7_stage5_L2"type: "Convolution"bottom: "Mconv6_stage5_L2"top: "Mconv7_stage5_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 19pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "concat_stage6"type: "Concat"bottom: "Mconv7_stage5_L1"bottom: "Mconv7_stage5_L2"bottom: "conv4_4_CPM"top: "concat_stage6"concat_param {
    axis: 1}
}
layer {
  name: "Mconv1_stage6_L1"type: "Convolution"bottom: "concat_stage6"top: "Mconv1_stage6_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu1_stage6_L1"type: "ReLU"bottom: "Mconv1_stage6_L1"top: "Mconv1_stage6_L1"}
layer {
  name: "Mconv1_stage6_L2"type: "Convolution"bottom: "concat_stage6"top: "Mconv1_stage6_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu1_stage6_L2"type: "ReLU"bottom: "Mconv1_stage6_L2"top: "Mconv1_stage6_L2"}
layer {
  name: "Mconv2_stage6_L1"type: "Convolution"bottom: "Mconv1_stage6_L1"top: "Mconv2_stage6_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu2_stage6_L1"type: "ReLU"bottom: "Mconv2_stage6_L1"top: "Mconv2_stage6_L1"}
layer {
  name: "Mconv2_stage6_L2"type: "Convolution"bottom: "Mconv1_stage6_L2"top: "Mconv2_stage6_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu2_stage6_L2"type: "ReLU"bottom: "Mconv2_stage6_L2"top: "Mconv2_stage6_L2"}
layer {
  name: "Mconv3_stage6_L1"type: "Convolution"bottom: "Mconv2_stage6_L1"top: "Mconv3_stage6_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu3_stage6_L1"type: "ReLU"bottom: "Mconv3_stage6_L1"top: "Mconv3_stage6_L1"}
layer {
  name: "Mconv3_stage6_L2"type: "Convolution"bottom: "Mconv2_stage6_L2"top: "Mconv3_stage6_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu3_stage6_L2"type: "ReLU"bottom: "Mconv3_stage6_L2"top: "Mconv3_stage6_L2"}
layer {
  name: "Mconv4_stage6_L1"type: "Convolution"bottom: "Mconv3_stage6_L1"top: "Mconv4_stage6_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu4_stage6_L1"type: "ReLU"bottom: "Mconv4_stage6_L1"top: "Mconv4_stage6_L1"}
layer {
  name: "Mconv4_stage6_L2"type: "Convolution"bottom: "Mconv3_stage6_L2"top: "Mconv4_stage6_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu4_stage6_L2"type: "ReLU"bottom: "Mconv4_stage6_L2"top: "Mconv4_stage6_L2"}
layer {
  name: "Mconv5_stage6_L1"type: "Convolution"bottom: "Mconv4_stage6_L1"top: "Mconv5_stage6_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu5_stage6_L1"type: "ReLU"bottom: "Mconv5_stage6_L1"top: "Mconv5_stage6_L1"}
layer {
  name: "Mconv5_stage6_L2"type: "Convolution"bottom: "Mconv4_stage6_L2"top: "Mconv5_stage6_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 3kernel_size: 7weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu5_stage6_L2"type: "ReLU"bottom: "Mconv5_stage6_L2"top: "Mconv5_stage6_L2"}
layer {
  name: "Mconv6_stage6_L1"type: "Convolution"bottom: "Mconv5_stage6_L1"top: "Mconv6_stage6_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu6_stage6_L1"type: "ReLU"bottom: "Mconv6_stage6_L1"top: "Mconv6_stage6_L1"}
layer {
  name: "Mconv6_stage6_L2"type: "Convolution"bottom: "Mconv5_stage6_L2"top: "Mconv6_stage6_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 128pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mrelu6_stage6_L2"type: "ReLU"bottom: "Mconv6_stage6_L2"top: "Mconv6_stage6_L2"}
layer {
  name: "Mconv7_stage6_L1"type: "Convolution"bottom: "Mconv6_stage6_L1"top: "Mconv7_stage6_L1"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 38pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "Mconv7_stage6_L2"type: "Convolution"bottom: "Mconv6_stage6_L2"top: "Mconv7_stage6_L2"param {
    lr_mult: 4.0decay_mult: 1}
  param {
    lr_mult: 8.0decay_mult: 0}
  convolution_param {
    num_output: 19pad: 0kernel_size: 1weight_filler {
      type: "gaussian"std: 0.01}
    bias_filler {
      type: "constant"}
  }
}
layer {
  name: "concat_stage7"type: "Concat"bottom: "Mconv7_stage6_L2"bottom: "Mconv7_stage6_L1"# top: "concat_stage7"top: "net_output"concat_param {
    axis: 1}
}

下载模型权重

步骤一:

我们正在使用在Caffe深度学习框架上训练的模型。Caffe模型具有2个文件–

  1. .prototxt文件,指定了神经网络的体系结构–不同层的排列方式等。
  2. .caffemodel文件,用于存储训练后的模型的权重

我们将使用这两个文件将网络加载到内存中。

protoFile = "model/pose_deploy_linevec.prototxt"weightsFile = "model/pose_iter_440000.caffemodel"
net = cv2.dnn.readNetFromCaffe(protoFile, weightsFile)

步骤二:

读取图像并准备输入网络

我们使用OpenCV读取的输入帧应转换为输入Blob(例如Caffe),以便可以将其输入到网络。这是使用blobFromImage函数完成的,该函数将图像从OpenCV格式转换为Caffe blob格式。这些参数将在blobFromImage函数中提供。首先,我们将像素值标准化为(0,1)。然后,我们指定图像的尺寸。接下来,要减去的平均值为(0,0,0)。由于OpenCV和Caffe都使用BGR格式,因此无需交换R和B通道。

net = cv2.dnn.readNetFromCaffe(protoFile, weightsFile) #读取caffe模型
inWidth = 368inHeight = 368inpBlob = cv2.dnn.blobFromImage(frame, 1.0 / 255, (inWidth, inHeight),
                                (0, 0, 0), swapRB=False, crop=False) #将输入图片转成相应模型识别的blob数据
net.setInput(inpBlob) #放进网络

步骤三:

进行预测并解析关键点

一旦将图像传递到模型,就可以使用单行代码进行预测。OpenCV中DNN类的正向方法通过网络进行正向传递,这只是说它正在做出预测的另一种方式。

output = net.forward() #向前传播,进行预测

输出为4D矩阵:

  1. 第一维是图像ID(如果您将多个图像传递到网络)。
  2. 第二个维度指示关键点的索引。该模型将生成所有连接在一起的置信度图和零件亲和度图。对于COCO模型,它由57个部分组成– 18个关键点置信度图+ 1个背景+ 19 * 2个部分亲和度图。同样,对于MPI,它会产生44点。我们将仅使用与关键点相对应的前几个点。
  3. 第三维是输出图的高度。
  4. 第四个维度是输出图的宽度。

我们检查图像中是否存在每个关键点。我们通过找到关键点的置信度图的最大值来获得关键点的位置。我们还使用阈值来减少错误检测。

H = out.shape[2]
W = out.shape[3]
#Empty list to store the detected keypoints
points =[]
for i inrange(len()):
    #confidence map of corresponding body's part.
    probMap =output[0, i, :, :]
 
    #Find global maxima of the probMap.
    minVal, prob, minLoc, point =cv2.minMaxLoc(probMap)
 
    #Scale the point to fit on the original image
    x = (frameWidth * point[0]) /W
    y = (frameHeight * point[1]) /H
 
    if prob > threshold :
        cv2.circle(frame, (int(x), int(y)), 15, (0, 255, 255), thickness=-1, lineType=cv.FILLED)
        cv2.putText(frame, "{}".format(i), (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 1.4, (0, 0, 255), 3, lineType=cv2.LINE_AA)
 
        #Add the point to the list if the probability is greater than the threshold
points.append((int(x), int(y)))
    else:
        points.append(None)
 
cv2.imshow("Output-Keypoints",frame)
cv2.waitKey(0)
cv2.destroyAllWindows()

由于我们事先知道了点的索引,因此只要有关键点,我们就可以通过仅加入对来绘制骨架。这是使用下面给出的代码完成的。

for pair inPOSE_PAIRS:
    partA =pair[0]
    partB = pair[1]
 
    if points[partA] andpoints[partB]:
        cv2.line(frameCopy, points[partA], points[partB], (0, 255, 0), 3)

完整代码:

importcv2
importtime
importnumpy as np

MODE = "COCO"

if MODE is "COCO":
    protoFile = "model/pose_deploy_linevec.prototxt"weightsFile = "model/pose_iter_440000.caffemodel"nPoints = 18POSE_PAIRS = [[1, 0], [1, 2], [1, 5], [2, 3], [3, 4], [5, 6], [6, 7], [1, 8], [8, 9], [9, 10], [1, 11], [11, 12],
                  [12, 13], [0, 14], [0, 15], [14, 16], [15, 17]]
frame = cv2.imread("image.jpg")
frameCopy =np.copy(frame)
frameWidth = frame.shape[1]
frameHeight =frame.shape[0]
threshold = 0.1
net = cv2.dnn.readNetFromCaffe(protoFile, weightsFile) #读取caffe模型
t =time.time()
inWidth = 368inHeight = 368inpBlob = cv2.dnn.blobFromImage(frame, 1.0 / 255, (inWidth, inHeight),
                                (0, 0, 0), swapRB=False, crop=False) #将输入图片转成相应模型识别的blob数据
net.setInput(inpBlob) #放进网络
output = net.forward() #向前传播,进行预测
print("time taken by network : {:.3f}".format(time.time() -t))
#print(output.shape, output)#输出4D举证:#第一维是图像ID(如果您将多个图像传递到网络)。#第二个维度指示关键点的索引。该模型将生成所有连接在一起的置信度图和零件亲和度图。对于COCO模型,它由57个部分组成– 18个关键点置信度图+ 1个背景+ 19 * 2个部分亲和度图。同样,对于MPI,它会产生44点。我们将仅使用与关键点相对应的前几个点。#第三维是输出图的高度。#第四个维度是输出图的宽度。
H = output.shape[2] #输出的图像的高度
W = output.shape[3] #输出图像的宽度

#Empty list to store the detected keypoints
points =[]

for i inrange(nPoints):
    #confidence map of corresponding body's part.
    probMap = output[0, i, :, :] #获取关键点

    #Find global maxima of the probMap.
    minVal, prob, minLoc, point = cv2.minMaxLoc(probMap) #通过minMaxLoc得出该矩阵中的最小值、最大值、最小值索引,最大值索引
    print(minVal, prob, minLoc, point)

    #Scale the point to fit on the original image将输出图像中的关键点映射到原始图片上
    x = (frameWidth / W) *point[0]
    y = (frameHeight / H) * point[1]

    if prob >threshold:
        cv2.circle(frameCopy, (int(x), int(y)), 4, (0, 255, 255), thickness=-1, lineType=cv2.FILLED)
        cv2.putText(frameCopy, "{}".format(i), (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0, 0, 255),
                    lineType=cv2.LINE_AA)

        #Add the point to the list if the probability is greater than the threshold
points.append((int(x), int(y)))
    else:
        points.append(None)

#Draw Skeleton
for pair inPOSE_PAIRS:
    partA =pair[0]
    partB = pair[1]

    if points[partA] andpoints[partB]:
        cv2.line(frame, points[partA], points[partB], (0, 255, 255), 2)
        cv2.circle(frame, points[partA], 8, (0, 0, 255), thickness=-1, lineType=cv2.FILLED)

cv2.imshow('Output-Keypoints', frameCopy)
cv2.imshow('Output-Skeleton', frame)

print("Total time taken : {:.3f}".format(time.time() -t))

cv2.waitKey(0)

免责声明:文章转载自《opencv使用openPose实现人体姿态检测》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇安卓开发学习日记 DAY5——监听事件onClick的实现方法python模块整理6tarfile模块下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

三: vue组件开发及自动化工具vue-cli

一: 组件化开发 1 组件 1: 组件(Component)是自定义封装的功能。在前端开发过程中,经常出现多个网页的功能是重复的,而且很多不同的网站之间,也存在同样的功能。 2: 什么是组件 而在网页中实现一个功能,需要使用html定义功能的内容结构,使用css声明功能的外观样式,还要使用js来定义功能的特效,因此就产生了把一个功能相关的[HTML、cs...

数字识别,神经网络

来源:https://www.numpy.org.cn/deep/basics/fit_a_line.html 数字识别 本教程源代码目录在book/recognize_digits,初次使用请您参考Book文档使用说明。 #说明: 硬件环境要求: 本文可支持在CPU、GPU下运行 Docker镜像支持的CUDA/cuDNN版本: 如果使用了Docke...

使用 suspend 和 resume 暂停和恢复线程

suspend 和 resume 的使用 在 Thread 类中有这样两个方法:suspend 和 resume,这两个方法是成对出现的。 suspend() 方法的作用是将一个线程挂起(暂停), resume() 方法的作用则是将一个挂起的线程重新开始并继续向下运行。 通过一个例子来看一下这两个方法的使用: public class SuspendT...

wx.setStorage、wx.getStorage和wx.getStorageSync

Page({ data: { testnum:""//设置测试参数 }, test:function(){ var Num = this.data.testnum; wx.setStorage({//存储到本地 key:"testNum", data:Num }) } }) Page...

python3去除行号

问题:在复制一些代码时会同时复制每行的行号,删除比较麻烦,所以利用python3本身的代码进行一键删除。 # 导入re 模块来使用正则表达式 import re """去掉行号""" print('remove application start') # 定义去除行号函数 def remove_line_num(instr): p = re.co...

使用TPU在PyTorch中实现ResNet50

作者|DR. VAIBHAV KUMAR 编译|VK 来源|Analytics In Diamag PyTorch通过提供大量强大的工具和技术,一直在推动计算机视觉和深度学习领域的发展。 在计算机视觉领域,基于深度学习的执行需要处理大量的图像数据集,因此需要一个加速的环境来加快执行过程以达到可接受的精度水平。 PyTorch通过XLA(加速线性代数)提供了...