Filter oversized shoe boxes in dynamic ROI

This commit is contained in:
tian 2026-03-15 20:39:54 +08:00
parent 499847f570
commit ce2a18b6f6
5 changed files with 12 additions and 0 deletions

View File

@ -109,6 +109,7 @@
"debug_roi_class_id": -1,
"max_rois": 3,
"min_person_height": 60,
"max_box_area_ratio": 0.60,
"x_offset": -0.24,
"y_offset": 0.64,
"width_scale": 1.48,

View File

@ -109,6 +109,7 @@
"debug_roi_class_id": -1,
"max_rois": 3,
"min_person_height": 60,
"max_box_area_ratio": 0.60,
"x_offset": -0.24,
"y_offset": 0.64,
"width_scale": 1.48,

View File

@ -109,6 +109,7 @@
"debug_roi_class_id": -1,
"max_rois": 3,
"min_person_height": 60,
"max_box_area_ratio": 0.60,
"x_offset": -0.24,
"y_offset": 0.64,
"width_scale": 1.48,

View File

@ -94,6 +94,7 @@
| `shoe_class_id` | 0 | 追加到结果中的鞋类别 ID |
| `max_rois` | 8 | 每帧最多处理多少个人 |
| `min_person_height` | 0 | 忽略过小的人框,减少无效 ROI |
| `max_box_area_ratio` | 0.0 | 鞋框相对脚部 ROI 的最大面积占比,超过则过滤 |
| `x_offset` | -0.15 | ROI 左上角相对人框左上角的横向偏移系数 |
| `y_offset` | 0.72 | ROI 左上角相对人框左上角的纵向偏移系数 |
| `width_scale` | 1.30 | ROI 宽度相对人框宽度的放大系数 |

View File

@ -43,6 +43,7 @@ struct DynamicRoiConfig {
int debug_roi_class_id = -1;
int max_rois = 8;
int min_person_height = 0;
float max_box_area_ratio = 0.0f;
float x_offset = -0.15f;
float y_offset = 0.72f;
float width_scale = 1.30f;
@ -334,6 +335,8 @@ public:
dynamic_roi_.max_rois = std::max(1, dyn->ValueOr<int>("max_rois", dynamic_roi_.max_rois));
dynamic_roi_.min_person_height =
std::max(0, dyn->ValueOr<int>("min_person_height", dynamic_roi_.min_person_height));
dynamic_roi_.max_box_area_ratio =
std::max(0.0f, dyn->ValueOr<float>("max_box_area_ratio", dynamic_roi_.max_box_area_ratio));
dynamic_roi_.x_offset = dyn->ValueOr<float>("x_offset", dynamic_roi_.x_offset);
dynamic_roi_.y_offset = dyn->ValueOr<float>("y_offset", dynamic_roi_.y_offset);
dynamic_roi_.width_scale = dyn->ValueOr<float>("width_scale", dynamic_roi_.width_scale);
@ -664,6 +667,11 @@ private:
if (!std::isfinite(x) || !std::isfinite(y) || !std::isfinite(w) || !std::isfinite(h)) return;
if (w <= 1e-3f || h <= 1e-3f) return;
if (w > model_w_ * 1.2f || h > model_h_ * 1.2f) return;
if (dynamic_roi_.enable && dynamic_roi_.max_box_area_ratio > 0.0f && win_w > 0 && win_h > 0) {
const float mapped_area_ratio =
(w * h) / (static_cast<float>(model_w_) * static_cast<float>(model_h_));
if (mapped_area_ratio > dynamic_roi_.max_box_area_ratio) return;
}
DetBox box;
box.x = win_x + x * scale_x;