如何从Grounding DINO的predict函数中获取正确的绝对边界框坐标?
如何从Grounding DINO的predict函数中获取正确的绝对边界框坐标?
看起来你遇到的问题是对Grounding DINO返回的边界框格式理解有误!我之前也踩过这个坑,它返回的并不是我们常用的[x1, y1, x2, y2](左上角+右下角)格式,而是归一化的[x_center, y_center, width, height](中心坐标+宽高)格式,这就是你直接相乘后坐标不对的核心原因。
解决思路
要得到正确的绝对坐标,需要分两步转换:
- 先把归一化的中心坐标、宽高转换成对应图像尺寸的绝对数值
- 从绝对中心坐标和宽高推导得到左上角与右下角的坐标
修正后的代码
替换你原来的边界框转换代码段:
# Convert bounding boxes to absolute coordinates abs_box = boxes * torch.tensor([wd, ht, wd, ht]) abs_box = [abs_bo.numpy().astype("int") for abs_bo in abs_box]
改为以下正确的转换逻辑:
# 处理Grounding DINO返回的归一化边界框格式:[x_center, y_center, width, height] # 第一步:将归一化值转换为对应图像尺寸的绝对数值 box_abs = boxes * torch.tensor([wd, ht, wd, ht]) # 第二步:从中心坐标+宽高推导左上角(x1,y1)和右下角(x2,y2) x1 = box_abs[:, 0] - box_abs[:, 2] / 2 y1 = box_abs[:, 1] - box_abs[:, 3] / 2 x2 = box_abs[:, 0] + box_abs[:, 2] / 2 y2 = box_abs[:, 1] + box_abs[:, 3] / 2 # 合并为[x1,y1,x2,y2]格式并转为整数 abs_box = torch.stack([x1, y1, x2, y2], dim=1).numpy().astype("int")
验证效果
修改后重新运行代码,你会发现用cv2.rectangle画出的蓝色框会和annotate函数生成的标注框完全重合,这样就得到了正确的绝对边界框坐标。
备注:内容来源于stack exchange,提问作者Leroy Jeslyn
相关产品推荐
相关产品推荐

