Tensorrt 加速 OpenPose

在这里插入图片描述

关于OpenPose

    OpenPose人体姿态识别项目是美国卡耐基梅隆大学(CMU)基于卷积神经网络和监督学习并以caffe为框架开发的开源库。可以实现人体动作、面部表情、手指运动等姿态估计。适用于单人和多人,具有极好的鲁棒性。是世界上首个基于深度学习的实时多人二维姿态估计应用,基于它的实例如雨后春笋般涌现。人体姿态估计技术在体育健身、动作采集、3D试衣、舆情监测等领域具有广阔的应用前景,人们更加熟悉的应用就是抖音尬舞机。

OpenPose 各显卡预计能达到的运行速度基准

在这里插入图片描述
在这里插入图片描述
OpenPose项目Github链接:https://github.com/CMU-Perceptual-Computing-Lab/openpose


基于Tensorrt 实现OpenPose

测试环境

win10 + VS2019 + opencv4.3 + tensorrt7.0 + cuda11.1 + cudnn8

实现过程

  1. clone tensorrt-zoo: https://github.com/zerollzeng/tensorrt-zoo
  2. clone tiny-tensorrt: https://github.com/zerollzeng/tiny-tensorrt/tree/7ac9c6c6863ca3435a3407a6241f276ad3c49672
  3. 将 tiny-tensorrt 拷贝到 tensorrt-zoo文件夹下,由于博主是在Linux下编译的,而我在 windows下编译的,所以我删除了cmake中的 -Wfloat-conversion
  4. cmake 编译 , 配置下 tensorrt 、opencv等目录。 然后我取消勾选了 BUILD_TEST, BUILD_PYTHON,我测试的显卡是1080Ti,所以SM设置 61 , 具体如下。
    在这里插入图片描述
  5. VS 打开项目,编译 tiny-tensorrt , testopenpose。
    1. 编译 tiny-tensorrt ,修改下 tensorrt ,opencv , cuda 的 include, lib ,然后生成,编译成功会生成 tinytrt.dll
    2. 同理编译 testopenpose, 生成 testopenpose.exe
  6. 将openpose body_25 caffe model 拷贝到exe目录,修改 prototxt : input_dim, 我输入的是 640 * 480, 可以自行设置,但必须是 16 倍数。
  7. 生成 engine, 并测试 .
 testopenpose.exe  --prototxt "models/pose/body_25/pose_deploy.prototxt" --caffemodel "models/pose/body_25/pose_iter_584000.caffemodel" --save_engine "engine/pose_body_25_640_480.engine" --input "image/test.jpg" --run_mode 1 --h 480 --w 640

在这里插入图片描述
在这里插入图片描述

  1. 根据body_25姿态图,我们给绘制成线,这样看的更直观一些。
    在这里插入图片描述
  2. 连接线
    点的顺序已经连接好了, 有需要的改改颜色就行, 这样看起来颜色搭配能舒服一些
void MakeLineImage(cv::Mat& image, std::vector<std::vector<cv::Point>>& res) {for (auto p : res){drawLine(image, p[17], p[15], cv::Scalar(155, 0, 153));drawLine(image, p[15], p[0], cv::Scalar(99, 2, 149));drawLine(image, p[0], p[16], cv::Scalar(153, 1, 101));drawLine(image, p[16], p[18], cv::Scalar(156, 1, 49));drawLine(image, p[0], p[1], cv::Scalar(51, 0, 152));drawLine(image, p[1], p[2], cv::Scalar(0, 51, 154));drawLine(image, p[2], p[3], cv::Scalar(1, 101, 153));drawLine(image, p[3], p[4], cv::Scalar(0, 154, 151));drawLine(image, p[1], p[5], cv::Scalar(1, 154, 99));drawLine(image, p[5], p[6], cv::Scalar(1, 150, 51));drawLine(image, p[6], p[7], cv::Scalar(0, 255, 255));drawLine(image, p[1], p[8], cv::Scalar(0, 159, 46));drawLine(image, p[8], p[9], cv::Scalar(154, 104, 3));drawLine(image, p[9], p[10], cv::Scalar(151, 50, 0));drawLine(image, p[10], p[11], cv::Scalar(154, 104, 3));drawLine(image, p[11], p[24], cv::Scalar(154, 104, 3));drawLine(image, p[11], p[22], cv::Scalar(154, 104, 3));drawLine(image, p[22], p[23], cv::Scalar(154, 104, 3));drawLine(image, p[8], p[12], cv::Scalar(154, 104, 5));drawLine(image, p[12], p[13], cv::Scalar(151, 50, 0));drawLine(image, p[13], p[14], cv::Scalar(161, 0, 0));drawLine(image, p[14], p[21], cv::Scalar(161, 0, 0));drawLine(image, p[14], p[19], cv::Scalar(161, 0, 0));drawLine(image, p[19], p[20], cv::Scalar(161, 0, 0));}
}std::vector<float> inputData;
processImage(image, inputData);
std::vector<float> result;
openPose_->DoInference(inputData, result);
std::vector<std::vector<cv::Point>> res;
int kNumOfBodyPoint = 25;
for (size_t i = 0; i < result.size() / 3 / kNumOfBodyPoint; i++) {if (i >= kMaxPerson)break;std::vector<cv::Point> p;for (size_t j = 0; j < kNumOfBodyPoint; j++){p.push_back(cv::Point(result[i * 3 * kNumOfBodyPoint + j * 3] * scale_w, result[i * 3 * kNumOfBodyPoint + j * 3 + 1] * scale_h));}res.push_back(p);
}
MakeLineImage(image,res);

在这里插入图片描述
1080ti 上测试 运行速度差不多在 30ms左右 ( net: 640 * 480) , 如果缩小net , 速度会更快。


END

  1. 以上基本就是我整理的全部内容了,有兴趣的小伙伴可以参考参考。
  2. 如果有不对的地方,欢迎大神楼下留言指正。
  3. 最后非常感谢两位大神 :
    1. https://github.com/zerollzeng/tensorrt-zoo
    2. https://github.com/CMU-Perceptual-Computing-Lab/openpose
      在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部