diff --git a/src/layer/roipooling.cpp b/src/layer/roipooling.cpp index aae2957b7..d253eecd2 100644 --- a/src/layer/roipooling.cpp +++ b/src/layer/roipooling.cpp @@ -82,10 +82,13 @@ int ROIPooling::forward(const std::vector& bottom_blobs, std::vector& // For each ROI R = [x y w h]: max pool over R const float* roi_ptr = roi_blob; - int roi_x = round(roi_ptr[0] * spatial_scale); - int roi_y = round(roi_ptr[1] * spatial_scale); - int roi_w = round(roi_ptr[2] * spatial_scale); - int roi_h = round(roi_ptr[3] * spatial_scale); + int roi_x1 = round(roi_ptr[0] * spatial_scale); + int roi_y1 = round(roi_ptr[1] * spatial_scale); + int roi_x2 = round(roi_ptr[2] * spatial_scale); + int roi_y2 = round(roi_ptr[3] * spatial_scale); + + int roi_w = std::max(roi_x2 - roi_x1 + 1, 1); + int roi_h = std::max(roi_y2 - roi_y1 + 1, 1); float bin_size_w = (float)roi_w / (float)pooled_width; float bin_size_h = (float)roi_h / (float)pooled_height; @@ -103,10 +106,10 @@ int ROIPooling::forward(const std::vector& bottom_blobs, std::vector& // Compute pooling region for this output unit: // start (included) = floor(ph * roi_height / pooled_height) // end (excluded) = ceil((ph + 1) * roi_height / pooled_height) - int hstart = roi_y + floor((float)(ph) * bin_size_h); - int wstart = roi_x + floor((float)(pw) * bin_size_w); - int hend = roi_y + ceil((float)(ph + 1) * bin_size_h); - int wend = roi_x + ceil((float)(pw + 1) * bin_size_w); + int hstart = roi_y1 + floor((float)(ph) * bin_size_h); + int wstart = roi_x1 + floor((float)(pw) * bin_size_w); + int hend = roi_y1 + ceil((float)(ph + 1) * bin_size_h); + int wend = roi_x1 + ceil((float)(pw + 1) * bin_size_w); hstart = std::min(std::max(hstart, 0), h); wstart = std::min(std::max(wstart, 0), w); @@ -133,7 +136,6 @@ int ROIPooling::forward(const std::vector& bottom_blobs, std::vector& } } - return 0; }