@@ -18,13 +18,6 @@ namespace mmdeploy::mmpose {
1818using std::string;
1919using std::vector;
2020
21- template <class F >
22- struct _LoopBody : public cv ::ParallelLoopBody {
23- F f_;
24- _LoopBody (F f) : f_(std::move(f)) {}
25- void operator ()(const cv::Range& range) const override { f_ (range); }
26- };
27-
2821std::string to_lower (const std::string& s) {
2922 std::string t = s;
3023 std::transform (t.begin (), t.end (), t.begin (), [](unsigned char c) { return std::tolower (c); });
@@ -88,15 +81,11 @@ class TopdownHeatmapBaseHeadDecode : public MMPose {
8881 return to_value (std::move (output));
8982 }
9083
91- Tensor keypoints_from_heatmap (const Tensor& _heatmap , const vector<float >& center,
84+ Tensor keypoints_from_heatmap (Tensor& heatmap , const vector<float >& center,
9285 const vector<float >& scale, bool unbiased_decoding,
9386 const string& post_process, int modulate_kernel,
9487 float valid_radius_factor, bool use_udp,
9588 const string& target_type) {
96- Tensor heatmap (_heatmap.desc ());
97- heatmap.CopyFrom (_heatmap, stream ()).value ();
98- stream ().Wait ().value ();
99-
10089 int K = heatmap.shape (1 );
10190 int H = heatmap.shape (2 );
10291 int W = heatmap.shape (3 );
@@ -114,14 +103,12 @@ class TopdownHeatmapBaseHeadDecode : public MMPose {
114103 } else if (to_lower (target_type) == to_lower (string (" CombinedTarget" ))) {
115104 // output channel = 3 * channel_cfg['num_output_channels']
116105 assert (K % 3 == 0 );
117- cv::parallel_for_ (cv::Range (0 , K), _LoopBody{[&](const cv::Range& r) {
118- for (int i = r.start ; i < r.end ; i++) {
119- int kt = (i % 3 == 0 ) ? 2 * modulate_kernel + 1 : modulate_kernel;
120- float * data = heatmap.data <float >() + i * H * W;
121- cv::Mat work = cv::Mat (H, W, CV_32FC (1 ), data);
122- cv::GaussianBlur (work, work, {kt, kt}, 0 ); // inplace
123- }
124- }});
106+ for (int i = 0 ; i < K; i++) {
107+ int kt = (i % 3 == 0 ) ? 2 * modulate_kernel + 1 : modulate_kernel;
108+ float * data = heatmap.data <float >() + i * H * W;
109+ cv::Mat work = cv::Mat (H, W, CV_32FC (1 ), data);
110+ cv::GaussianBlur (work, work, {kt, kt}, 0 ); // inplace
111+ }
125112 float valid_radius = valid_radius_factor_ * H;
126113 TensorDesc desc = {Device{" cpu" }, DataType::kFLOAT , {1 , K / 3 , H, W}};
127114 Tensor offset_x (desc);
@@ -209,13 +196,11 @@ class TopdownHeatmapBaseHeadDecode : public MMPose {
209196 int K = heatmap.shape (1 );
210197 int H = heatmap.shape (2 );
211198 int W = heatmap.shape (3 );
212- cv::parallel_for_ (cv::Range (0 , K), _LoopBody{[&](const cv::Range& r) {
213- for (int i = r.start ; i < r.end ; i++) {
214- float * data = heatmap.data <float >() + i * H * W;
215- cv::Mat work = cv::Mat (H, W, CV_32FC (1 ), data);
216- cv::GaussianBlur (work, work, {kernel, kernel}, 0 ); // inplace
217- }
218- }});
199+ for (int i = 0 ; i < K; i++) {
200+ float * data = heatmap.data <float >() + i * H * W;
201+ cv::Mat work = cv::Mat (H, W, CV_32FC (1 ), data);
202+ cv::GaussianBlur (work, work, {kernel, kernel}, 0 ); // inplace
203+ }
219204 std::for_each (heatmap.data <float >(), heatmap.data <float >() + K * H * W, [](float & x) {
220205 x = std::max (0 .001f , std::min (50 .f , x));
221206 x = std::log (x);
@@ -341,23 +326,21 @@ class TopdownHeatmapBaseHeadDecode : public MMPose {
341326 TensorDesc pred_desc = {Device{" cpu" }, DataType::kFLOAT , {1 , K, 3 }};
342327 Tensor pred (pred_desc);
343328
344- cv::parallel_for_ (cv::Range (0 , K), _LoopBody{[&](const cv::Range& r) {
345- for (int i = r.start ; i < r.end ; i++) {
346- float * src_data = const_cast <float *>(heatmap.data <float >()) + i * H * W;
347- cv::Mat mat = cv::Mat (H, W, CV_32FC1, src_data);
348- double min_val, max_val;
349- cv::Point min_loc, max_loc;
350- cv::minMaxLoc (mat, &min_val, &max_val, &min_loc, &max_loc);
351- float * dst_data = pred.data <float >() + i * 3 ;
352- *(dst_data + 0 ) = -1 ;
353- *(dst_data + 1 ) = -1 ;
354- *(dst_data + 2 ) = max_val;
355- if (max_val > 0.0 ) {
356- *(dst_data + 0 ) = max_loc.x ;
357- *(dst_data + 1 ) = max_loc.y ;
358- }
359- }
360- }});
329+ for (int i = 0 ; i < K; i++) {
330+ float * src_data = const_cast <float *>(heatmap.data <float >()) + i * H * W;
331+ cv::Mat mat = cv::Mat (H, W, CV_32FC1, src_data);
332+ double min_val, max_val;
333+ cv::Point min_loc, max_loc;
334+ cv::minMaxLoc (mat, &min_val, &max_val, &min_loc, &max_loc);
335+ float * dst_data = pred.data <float >() + i * 3 ;
336+ *(dst_data + 0 ) = -1 ;
337+ *(dst_data + 1 ) = -1 ;
338+ *(dst_data + 2 ) = max_val;
339+ if (max_val > 0.0 ) {
340+ *(dst_data + 0 ) = max_loc.x ;
341+ *(dst_data + 1 ) = max_loc.y ;
342+ }
343+ }
361344
362345 return pred;
363346 }
0 commit comments