TensorFlow目标检测API裁剪边界框触发NameError报错解决方案咨询
问题解决方法
错误原因
你抛出NameError: name 'boxes' is not defined的核心原因是裁剪代码中直接调用了未定义的boxes变量。检测模型输出的所有边界框存储在detections['detection_boxes']对象中,你在可视化阶段已经调用过该变量,但没有提前赋值给boxes,所以直接调用会触发未定义错误。
另外你裁剪代码中写的img_np和之前定义的图片变量image_np命名不一致,修复完boxes问题后还会触发新的未定义错误,也需要同步修正。
修正逻辑
- 先从检测结果中提取边界框、置信度参数,赋值给对应变量
- 动态读取当前图片的实际宽高,不要硬编码宽高值,避免不同尺寸的图片裁剪偏移
- 同步匹配图片变量命名,增加置信度过滤逻辑,避免裁剪无效低置信度框
完整可运行裁剪代码
# 从检测结果中提取边界框、置信度 boxes = detections['detection_boxes'][0].numpy() scores = detections['detection_scores'][0].numpy() # 置信度阈值和可视化阶段设置的0.5保持一致即可 min_score_thresh = 0.5 # 动态读取当前图片的实际宽高 height, width = image_np.shape[:2] # 存储所有符合要求的裁剪后图片 cropped_imgs = [] # 遍历所有检测框 for idx in range(boxes.shape[0]): # 过滤低于置信度的无效框 if scores[idx] < min_score_thresh: continue # 把模型输出的归一化坐标转为实际像素坐标 ymin = int(boxes[idx][0] * height) xmin = int(boxes[idx][1] * width) ymax = int(boxes[idx][2] * height) xmax = int(boxes[idx][3] * width) # 执行裁剪 crop = image_np[ymin:ymax, xmin:xmax] cropped_imgs.append(crop) # 如果你只需要置信度最高的第一个框,不需要循环,直接取索引0即可 # ymin = int(boxes[0][0] * height) # xmin = int(boxes[0][1] * width) # ymax = int(boxes[0][2] * height) # xmax = int(boxes[0][3] * width) # result = image_np[ymin:ymax, xmin:xmax]
内容的提问来源于stack exchange,提问作者maryam mehboob
相关产品推荐
相关产品推荐

