@@ -26,6 +26,10 @@ class SimCCLabelDecode : public MMPose {
2626 auto & params = config[" params" ];
2727 flip_test_ = params.value (" flip_test" , flip_test_);
2828 simcc_split_ratio_ = params.value (" simcc_split_ratio" , simcc_split_ratio_);
29+ export_postprocess_ = params.value (" export_postprocess" , export_postprocess_);
30+ if (export_postprocess_) {
31+ simcc_split_ratio_ = 1.0 ;
32+ }
2933 if (params.contains (" input_size" )) {
3034 from_value (params[" input_size" ], input_size_);
3135 }
@@ -52,26 +56,31 @@ class SimCCLabelDecode : public MMPose {
5256
5357 Tensor keypoints ({Device{" cpu" }, DataType::kFLOAT , {simcc_x.shape (0 ), simcc_x.shape (1 ), 2 }});
5458 Tensor scores ({Device{" cpu" }, DataType::kFLOAT , {simcc_x.shape (0 ), simcc_x.shape (1 ), 1 }});
55- get_simcc_maximum (simcc_x, simcc_y, keypoints, scores);
59+ float *keypoints_data = nullptr , *scores_data = nullptr ;
60+ if (!export_postprocess_) {
61+ get_simcc_maximum (simcc_x, simcc_y, keypoints, scores);
62+ keypoints_data = keypoints.data <float >();
63+ scores_data = scores.data <float >();
64+ } else {
65+ keypoints_data = simcc_x.data <float >();
66+ scores_data = simcc_y.data <float >();
67+ }
5668
5769 std::vector<float > center;
5870 std::vector<float > scale;
5971 from_value (img_metas[" center" ], center);
6072 from_value (img_metas[" scale" ], scale);
6173 PoseDetectorOutput output;
6274
63- float * keypoints_data = keypoints.data <float >();
64- float * scores_data = scores.data <float >();
6575 float scale_value = 200 , x = -1 , y = -1 , s = 0 ;
6676 for (int i = 0 ; i < simcc_x.shape (1 ); i++) {
67- x = *(keypoints_data + 0 ) / simcc_split_ratio_;
68- y = *(keypoints_data + 1 ) / simcc_split_ratio_;
77+ x = *(keypoints_data++) / simcc_split_ratio_;
78+ y = *(keypoints_data++) / simcc_split_ratio_;
79+ s = *(scores_data++);
80+
6981 x = x * scale[0 ] * scale_value / input_size_[0 ] + center[0 ] - scale[0 ] * scale_value * 0.5 ;
7082 y = y * scale[1 ] * scale_value / input_size_[1 ] + center[1 ] - scale[1 ] * scale_value * 0.5 ;
71- s = *(scores_data + 0 );
7283 output.key_points .push_back ({{x, y}, s});
73- keypoints_data += 2 ;
74- scores_data += 1 ;
7584 }
7685 return to_value (output);
7786 }
@@ -104,6 +113,7 @@ class SimCCLabelDecode : public MMPose {
104113
105114 private:
106115 bool flip_test_{false };
116+ bool export_postprocess_{false };
107117 bool shift_heatmap_{false };
108118 float simcc_split_ratio_{2.0 };
109119 std::vector<int > input_size_{192 , 256 };
0 commit comments