如何使用TensorFlow检测图像指定区域内的目标并过滤无关边界框
解决方案
方案1:调用可视化函数前提前过滤(优先推荐)
该方案无需修改官方提供的可视化工具代码,后续版本升级不受影响,适配性最好。
- 先定义你需要保留目标的content区域坐标,因为你调用可视化时开启了
use_normalized_coordinates=True,建议直接使用归一化坐标(取值范围0~1,为相对于整张图宽高的比例值) - 计算所有检测框的中心点,过滤出中心点落在content区域内的目标,再将过滤后的结果传入可视化函数即可。
示例代码如下:
# 先拿到原始检测结果 boxes = np.squeeze(boxes) classes = np.squeeze(classes).astype(np.int32) scores = np.squeeze(scores) # 替换为你自己的content区域归一化坐标,顺序为(ymin, xmin, ymax, xmax) content_ymin, content_xmin, content_ymax, content_xmax = 0.2, 0.1, 0.8, 0.9 # 计算每个检测框的中心点归一化坐标 box_centers_y = (boxes[:, 0] + boxes[:, 2]) / 2 box_centers_x = (boxes[:, 1] + boxes[:, 3]) / 2 # 生成过滤掩码:同时满足中心点在指定区域、分数高于阈值两个条件 filter_mask = (box_centers_y >= content_ymin) & (box_centers_y <= content_ymax) & \ (box_centers_x >= content_xmin) & (box_centers_x <= content_xmax) & \ (scores >= 0.2) # 应用过滤得到符合要求的结果 filtered_boxes = boxes[filter_mask] filtered_classes = classes[filter_mask] filtered_scores = scores[filter_mask] # 传入过滤后的结果调用可视化函数 vis_util.visualize_boxes_and_labels_on_image_array( image_np, filtered_boxes, filtered_classes, filtered_scores, category_index, use_normalized_coordinates=True, line_thickness=3, min_score_thresh=0.2)
方案2:修改原可视化函数新增区域过滤逻辑
如果需要复用区域过滤能力,可以直接修改visualize_boxes_and_labels_on_image_array函数:
- 在函数参数列表中新增可选参数
valid_region=None,参数说明:接收格式为(content_ymin, content_xmin, content_ymax, content_xmax)的归一化坐标元组,传入后仅绘制中心点落在该区域内的目标,为None时保留原有逻辑不做过滤。 - 找到函数内遍历检测框的循环逻辑:
for i in range(min(max_boxes_to_draw, boxes.shape[0])): if scores is None or scores[i] > min_score_thresh:
在该判断下方新增区域过滤逻辑:
# 新增区域过滤逻辑 if valid_region is not None: v_ymin, v_xmin, v_ymax, v_xmax = valid_region ymin, xmin, ymax, xmax = boxes[i] center_y = (ymin + ymax) / 2 center_x = (xmin + xmax) / 2 # 中心点不在指定区域则跳过当前框 if not (v_ymin <= center_y <= v_ymax and v_xmin <= center_x <= v_xmax): continue
- 调用时传入你的content区域参数即可:
vis_util.visualize_boxes_and_labels_on_image_array( image_np, np.squeeze(boxes), np.squeeze(classes).astype(np.int32), np.squeeze(scores), category_index, use_normalized_coordinates=True, line_thickness=3, min_score_thresh=0.2, valid_region=(0.2, 0.1, 0.8, 0.9) # 替换为你实际的content区域归一化坐标 )
内容的提问来源于stack exchange,提问作者CocoCoder41
相关产品推荐
相关产品推荐

