Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[bug] tinypose 使用 C++ 推理过程中 通过负数索引访问数组 #2359

Closed
ThinkWD opened this issue Jan 26, 2024 · 0 comments
Closed

Comments

@ThinkWD
Copy link
Contributor

ThinkWD commented Jan 26, 2024


温馨提示:根据社区不完全统计,按照模板提问,可以加快回复和解决问题的速度


环境

  • 【FastDeploy版本】: 最新的 develop 分支
  • 【编译命令】
    cmake .. \
    -D ENABLE_ORT_BACKEND=ON \
    -D ENABLE_VISION=ON \
    
  • 【系统平台】: Windows x64(Windows10)
  • 【硬件】: ORT CPU 推理
  • 【编译语言】: C++

问题日志及出现问题的操作流程

    1. fastdeploy/vision/utils/dark_parse.cc 添加打印代码
void DarkParse(const std::vector<float>& heatmap, const std::vector<int>& dim,
               std::vector<float>* coords, const int px, const int py,
               const int index, const int ch) {
  /*DARK postpocessing, Zhang et al. Distribution-Aware Coordinate
  Representation for Human Pose Estimation (CVPR 2020).
  1) offset = - hassian.inv() * derivative
  2) dx = (heatmap[x+1] - heatmap[x-1])/2.
  3) dxx = (dx[x+1] - dx[x-1])/2.
  4) derivative = Mat([dx, dy])
  5) hassian = Mat([[dxx, dxy], [dxy, dyy]])
  */
  std::vector<float>::const_iterator first1 = heatmap.begin() + index;
  std::vector<float>::const_iterator last1 =
      heatmap.begin() + index + dim[2] * dim[3];
  std::vector<float> heatmap_ch(first1, last1);
  cv::Mat heatmap_mat = cv::Mat(heatmap_ch).reshape(0, dim[2]);
  heatmap_mat.convertTo(heatmap_mat, CV_32FC1);
  cv::GaussianBlur(heatmap_mat, heatmap_mat, cv::Size(3, 3), 0, 0);
  heatmap_mat = heatmap_mat.reshape(1, 1);
  heatmap_ch = std::vector<float>(heatmap_mat.reshape(1, 1));

  printf("<%s ## %d> heatmap_ch.size(): %d\n", __FILE__, __LINE__, heatmap_ch.size());
  float epsilon = 1e-10;
  // sample heatmap to get values in around target location
  printf("< ## %d> index: %d\n", __LINE__, py * dim[3] + px);
  float xy = log(fmax(heatmap_ch[py * dim[3] + px], epsilon));

  printf("< ## %d> index: %d\n", __LINE__, py * dim[3] + px + 1);
  float xr = log(fmax(heatmap_ch[py * dim[3] + px + 1], epsilon));

  printf("< ## %d> index: %d\n", __LINE__, py * dim[3] + px - 1);
  float xl = log(fmax(heatmap_ch[py * dim[3] + px - 1], epsilon));

  printf("< ## %d> index: %d\n", __LINE__, py * dim[3] + px + 2);
  float xr2 = log(fmax(heatmap_ch[py * dim[3] + px + 2], epsilon));

  printf("< ## %d> index: %d\n", __LINE__, py * dim[3] + px - 2);
  float xl2 = log(fmax(heatmap_ch[py * dim[3] + px - 2], epsilon));

  printf("< ## %d> index: %d\n", __LINE__, (py + 1) * dim[3] + px);
  float yu = log(fmax(heatmap_ch[(py + 1) * dim[3] + px], epsilon));

  printf("< ## %d> index: %d\n", __LINE__, (py - 1) * dim[3] + px);
  float yd = log(fmax(heatmap_ch[(py - 1) * dim[3] + px], epsilon));

  printf("< ## %d> index: %d\n", __LINE__, (py + 2) * dim[3] + px);
  float yu2 = log(fmax(heatmap_ch[(py + 2) * dim[3] + px], epsilon));

  printf("< ## %d> index: %d\n", __LINE__, (py - 2) * dim[3] + px);
  float yd2 = log(fmax(heatmap_ch[(py - 2) * dim[3] + px], epsilon));

  printf("< ## %d> index: %d\n", __LINE__, (py + 1) * dim[3] + px + 1);
  float xryu = log(fmax(heatmap_ch[(py + 1) * dim[3] + px + 1], epsilon));

  printf("< ## %d> index: %d\n", __LINE__, (py - 1) * dim[3] + px + 1);
  float xryd = log(fmax(heatmap_ch[(py - 1) * dim[3] + px + 1], epsilon));

  printf("< ## %d> index: %d\n", __LINE__, (py + 1) * dim[3] + px - 1);
  float xlyu = log(fmax(heatmap_ch[(py + 1) * dim[3] + px - 1], epsilon));

  printf("< ## %d> index: %d\n", __LINE__, (py - 1) * dim[3] + px - 1);
  float xlyd = log(fmax(heatmap_ch[(py - 1) * dim[3] + px - 1], epsilon));

  printf("<%s ## %d>\n", __FILE__, __LINE__);

  // compute dx/dy and dxx/dyy with sampled values
  float dx = 0.5 * (xr - xl);
  float dy = 0.5 * (yu - yd);
  float dxx = 0.25 * (xr2 - 2 * xy + xl2);
  float dxy = 0.25 * (xryu - xryd - xlyu + xlyd);
  float dyy = 0.25 * (yu2 - 2 * xy + yd2);

  // finally get offset by derivative and hassian, which combined by dx/dy and
  // dxx/dyy
  if (dxx * dyy - dxy * dxy != 0) {
    float M[2][2] = {dxx, dxy, dxy, dyy};
    float D[2] = {dx, dy};
    cv::Mat hassian(2, 2, CV_32F, M);
    cv::Mat derivative(2, 1, CV_32F, D);
    cv::Mat offset = -hassian.inv() * derivative;
    (*coords)[ch * 2] += offset.at<float>(0, 0);
    (*coords)[ch * 2 + 1] += offset.at<float>(1, 0);
  }
}
    1. 编译并执行 examples/vision/keypointdetection/tiny_pose/cpp/pptinypose_infer.cc
    1. 使用的模型文件和图片: 链接: https://pan.baidu.com/s/1GizYI2qduObOHw0ygKg7Jg?pwd=imes 提取码: imes
    1. 获得日志: (奇怪的是虽然这个 -23 每次都出现, 但只是小概率导致程序退出)
D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-release-1.0.7\examples\vision\keypointdetection\tiny_pose\cpp\build\Release>infer_tinypose_demo.exe
[INFO] fastdeploy/runtime/runtime.cc(326)::fastdeploy::Runtime::CreateOrtBackend        Runtime initialized with Backend::ORT in Device::CPU.
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\keypointdet\pptinypose\pptinypose_utils.cc ## 105> j: 0
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\utils\dark_parse.cc ## 42> heatmap_ch.size(): 3072
< ## 45> index: 3000
< ## 48> index: 3001
< ## 51> index: 2999
< ## 54> index: 3002
< ## 57> index: 2998
< ## 60> index: 3048
< ## 63> index: 2952
< ## 66> index: 3096
< ## 69> index: 2904
< ## 72> index: 3049
< ## 75> index: 2953
< ## 78> index: 3047
< ## 81> index: 2951
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\utils\dark_parse.cc ## 84>
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\keypointdet\pptinypose\pptinypose_utils.cc ## 107> j: 0
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\keypointdet\pptinypose\pptinypose_utils.cc ## 105> j: 1
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\utils\dark_parse.cc ## 42> heatmap_ch.size(): 3072
< ## 45> index: 3002
< ## 48> index: 3003
< ## 51> index: 3001
< ## 54> index: 3004
< ## 57> index: 3000
< ## 60> index: 3050
< ## 63> index: 2954
< ## 66> index: 3098
< ## 69> index: 2906
< ## 72> index: 3051
< ## 75> index: 2955
< ## 78> index: 3049
< ## 81> index: 2953
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\utils\dark_parse.cc ## 84>
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\keypointdet\pptinypose\pptinypose_utils.cc ## 107> j: 1
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\keypointdet\pptinypose\pptinypose_utils.cc ## 105> j: 2
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\utils\dark_parse.cc ## 42> heatmap_ch.size(): 3072
< ## 45> index: 119
< ## 48> index: 120
< ## 51> index: 118
< ## 54> index: 121
< ## 57> index: 117
< ## 60> index: 167
< ## 63> index: 71
< ## 66> index: 215
< ## 69> index: 23
< ## 72> index: 168
< ## 75> index: 72
< ## 78> index: 166
< ## 81> index: 70
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\utils\dark_parse.cc ## 84>
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\keypointdet\pptinypose\pptinypose_utils.cc ## 107> j: 2
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\keypointdet\pptinypose\pptinypose_utils.cc ## 105> j: 3
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\utils\dark_parse.cc ## 42> heatmap_ch.size(): 3072
< ## 45> index: 73
< ## 48> index: 74
< ## 51> index: 72
< ## 54> index: 75
< ## 57> index: 71
< ## 60> index: 121
< ## 63> index: 25
< ## 66> index: 169
< ## 69> index: -23
< ## 72> index: 122
< ## 75> index: 26
< ## 78> index: 120
< ## 81> index: 24
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\utils\dark_parse.cc ## 84>
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\keypointdet\pptinypose\pptinypose_utils.cc ## 107> j: 3
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\keypointdet\pptinypose\pptinypose_utils.cc ## 105> j: 4
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\utils\dark_parse.cc ## 42> heatmap_ch.size(): 3072
< ## 45> index: 2809
< ## 48> index: 2810
< ## 51> index: 2808
< ## 54> index: 2811
< ## 57> index: 2807
< ## 60> index: 2857
< ## 63> index: 2761
< ## 66> index: 2905
< ## 69> index: 2713
< ## 72> index: 2858
< ## 75> index: 2762
< ## 78> index: 2856
< ## 81> index: 2760
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\utils\dark_parse.cc ## 84>
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\keypointdet\pptinypose\pptinypose_utils.cc ## 107> j: 4
TinyPose Prediction Done!
KeyPointDetectionResult: [x, y, conf]
405.110565,1040.763550, 0.982505
435.185120,1040.723511, 0.941282
379.676727,25.008259, 0.943791
413.712097,16.569639, 0.949045
419.809235,976.065735, 0.979562
num_joints:5

TinyPose visualized result saved in ./tinypose_vis_result.jpg

D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-release-1.0.7\examples\vision\keypointdetection\tiny_pose\cpp\build\Release>infer_tinypose_demo.exe
[INFO] fastdeploy/runtime/runtime.cc(326)::fastdeploy::Runtime::CreateOrtBackend        Runtime initialized with Backend::ORT in Device::CPU.
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\keypointdet\pptinypose\pptinypose_utils.cc ## 105> j: 0
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\utils\dark_parse.cc ## 42> heatmap_ch.size(): 3072
< ## 45> index: 3000
< ## 48> index: 3001
< ## 51> index: 2999
< ## 54> index: 3002
< ## 57> index: 2998
< ## 60> index: 3048
< ## 63> index: 2952
< ## 66> index: 3096
< ## 69> index: 2904
< ## 72> index: 3049
< ## 75> index: 2953
< ## 78> index: 3047
< ## 81> index: 2951
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\utils\dark_parse.cc ## 84>
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\keypointdet\pptinypose\pptinypose_utils.cc ## 107> j: 0
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\keypointdet\pptinypose\pptinypose_utils.cc ## 105> j: 1
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\utils\dark_parse.cc ## 42> heatmap_ch.size(): 3072
< ## 45> index: 3002
< ## 48> index: 3003
< ## 51> index: 3001
< ## 54> index: 3004
< ## 57> index: 3000
< ## 60> index: 3050
< ## 63> index: 2954
< ## 66> index: 3098
< ## 69> index: 2906
< ## 72> index: 3051
< ## 75> index: 2955
< ## 78> index: 3049
< ## 81> index: 2953
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\utils\dark_parse.cc ## 84>
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\keypointdet\pptinypose\pptinypose_utils.cc ## 107> j: 1
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\keypointdet\pptinypose\pptinypose_utils.cc ## 105> j: 2
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\utils\dark_parse.cc ## 42> heatmap_ch.size(): 3072
< ## 45> index: 119
< ## 48> index: 120
< ## 51> index: 118
< ## 54> index: 121
< ## 57> index: 117
< ## 60> index: 167
< ## 63> index: 71
< ## 66> index: 215
< ## 69> index: 23
< ## 72> index: 168
< ## 75> index: 72
< ## 78> index: 166
< ## 81> index: 70
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\utils\dark_parse.cc ## 84>
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\keypointdet\pptinypose\pptinypose_utils.cc ## 107> j: 2
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\keypointdet\pptinypose\pptinypose_utils.cc ## 105> j: 3
<D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-develop\fastdeploy\vision\utils\dark_parse.cc ## 42> heatmap_ch.size(): 3072
< ## 45> index: 73
< ## 48> index: 74
< ## 51> index: 72
< ## 54> index: 75
< ## 57> index: 71
< ## 60> index: 121
< ## 63> index: 25
< ## 66> index: 169
< ## 69> index: -23

D:\Work\__DataSet\__Deploy_bak\fastdeploy\FastDeploy-release-1.0.7\examples\vision\keypointdetection\tiny_pose\cpp\build\Release>
@ThinkWD ThinkWD mentioned this issue Jan 29, 2024
jiangjiajun pushed a commit that referenced this issue Jan 29, 2024
Update pptinypose_utils.cc

添加 py 范围限制, 避免 utils::DarkParse 内部出现数组越界
@ThinkWD ThinkWD closed this as completed Jan 29, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant