使用 Detectron2 Visualizer 绘图时注释多边形的位置不正确

问题描述 投票:0回答:0

Stack Overflow 社区您好,

如果我的问题看起来微不足道,我深表歉意。我目前正在致力于从航空 PNG 图像构建检测。每张图像的尺寸为 2000 像素 x 2000 像素,分辨率为 20 厘米。为了实现这一目标,我使用 Facebook AI Research 的 Detectron2。

Detectron2 有一个名为

get_balloon_dicts
的函数,用于注册数据集注释和一个
visualizer
模块来可视化注释。在 Detectron2 提供的教程 IPython Notebook 文件(可在 https://colab.research.google.com/drive/16jcaJoc6bCFAQ96jDe2HwtXj7BMD_-m5 访问)中,成功地针对 气球示例演示了该过程。

我遵循了 Detectron2 教程中的 balloon 示例,它在我的 Anaconda 环境中运行良好。注释 JSON 文件在气球图像上正确可视化,如所附屏幕截图所示。

但是,当我尝试将相同的过程应用于我的构建图像和注释 JSON 文件时,图像显示正确,但注释无法可视化。相反,一些标签出现在图像顶部,如所附屏幕截图所示。

我希望获得与气球示例相同的结果,因为建筑注释 JSON 文件是以类似的格式、结构和属性创建的。我使用以下代码(来自 Detectron2 教程的气球代码的复制版本)来注册数据集并可视化注释:

注册数据集代码:

from detectron2.utils.visualizer import Visualizer
from detectron2.data import MetadataCatalog, DatasetCatalog
from detectron2.structures import BoxMode
import cv2

def get_building_dicts(img_dir):
    json_file = os.path.join(img_dir, "via_region_data.json")
    with open(json_file) as f:
        imgs_anns = json.load(f)

    dataset_dicts = []
    for idx, v in enumerate(imgs_anns.values()):
        record = {}
        
        filename = os.path.join(img_dir, v["filename"])
        height, width = cv2.imread(filename).shape[:2]

        record["file_name"] = filename
        record["image_id"] = idx
        record["height"] = height
        record["width"] = width
      
        annos = v["regions"]
        objs = []
        for _, anno in annos.items():
            assert not anno["region_attributes"]
            anno = anno["shape_attributes"]
            px = anno["all_points_x"]
            py = anno["all_points_y"]
            poly = [(x + 0.5, y + 0.5) for x, y in zip(px, py)]
            poly = [p for x in poly for p in x]

            obj = {
                "bbox": [np.min(px), np.min(py), np.max(px), np.max(py)],
                "bbox_mode": BoxMode.XYXY_ABS,
                "segmentation": [poly],
                "category_id": 0,
            }
            objs.append(obj)
        record["annotations"] = objs
        dataset_dicts.append(record)
    return dataset_dicts

for d in ["train", "val"]:
    DatasetCatalog.register("building_" + d, lambda d=d: get_building_dicts("wisconsin_dataset2020/" + d))
    MetadataCatalog.get("building_" + d).set(thing_classes=["building"])
building_metadata = MetadataCatalog.get("building_train")


可视化注释和图像的代码:

dataset_dicts = get_building_dicts("wisconsin_dataset2020/train")
for d in random.sample(dataset_dicts, 1):
    img = cv2.imread(d["file_name"])
    print(d["file_name"])
    visualizer = Visualizer(img[:, :, ::-1], metadata=building_metadata, scale=1.0)
    out = visualizer.draw_dataset_dict(d)
    #cv_imshow(out.get_image()[:, :, ::-1])
    plt.figure(figsize=(20, 20))
    plt.imshow(out.get_image()[:, :, ::-1])
    plt.show()

我在此链接上附加了图像和注释 JSON 文件的示例,用于故障排除目的 https://github.com/facebookresearch/detectron2/files/12052249/building_dataset.zip。

任何可以帮助我实现所需结果(如提供的屏幕截图所示)的潜在解决方案或代码改进,我将不胜感激。

预先感谢您的协助。

我希望看到这样的图像:

环境:


sys.platform win32 Python 3.8.16 |由 conda-forge 打包 | (默认,2023 年 2 月 1 日 15:53:35)[MSC v.1929 64 位 (AMD64)] numpy 1.24.3 探测器2 0.6 DETECTRON2_ENV_MODULE PyTorch 2.0.1 @L:\projects\pythonlove

python deep-learning pytorch semantic-segmentation detectron
© www.soinside.com 2019 - 2024. All rights reserved.