balloon.py 中的['regions'] KeyError

a['regions'] KeyError in balloon.py

在 Detectron2 示例的 balloon.py 文件中,每当我 运行 我的自定义数据集上的 balloon.py 时,我都会得到 'regions' 的 KeyError。我认为train文件夹中的json文件有问题,所以我先使用最新的VIA 3,然后使用VIA 2.0.0。两个 json 都创建相同的 KeyError。

我将气球的训练 VIA json 与我的训练 VIA json 进行了比较,它们现在具有相同的结构,所以我认为这不是 json 的问题了。为什么 Python 无法读取字符串作为键?

这里是 balloon.py:https://github.com/matterport/Mask_RCNN/blob/master/samples/balloon/balloon.py

你还没有给我们你的 JSON 所以不可能真的告诉我们,但是扫描 link 中的文件我不认为这是你的错,[的第 117 行=17=] 是

annotations = [a for a in annotations if a['regions']]

(阅读这一行上方的评论)看起来他们正在尝试过滤任何没有 regions 键的对象,但如果它不存在,它实际上只会抛出一个键错误。该行可能应该是

annotations = [a for a in annotations if ‘regions’ in a]

您的自定义数据集的 JSON 文件是如何从 VIA 工具中导出的?

根据 VIA 的版本,有两个导出选项:

(a) 使用“注释”菜单下的“导出注释(如 JSON)”选项。结果 JSON 仅包含顶层的注释数据。

(b) 使用“保存项目”选项(软盘图标)。生成的 JSON 包含整个项目的详细信息,注释放在 _via_img_metadata 属性.

根据我的经验,威盛 1.0 似乎只有 (a) 可用,而威盛 2.0 则同时提供 (a) 和 (b)。

下面是两个 JSON 结构的屏幕截图。

matterport/Mask_RCNN代码好久没更新了,虽然评论里提到了VIA 2.0,但样本好像还是以VIA为主1.0。因此,气球数据集的 JSON 结构与上面的 (a) 匹配(甚至 JSON 文件的名称 - via_region_data.json 是给定的默认名称威盛 1.0.6).

如果不查看您的 JSON 文件的内容,我无法完全确定这一点,但是 您的自定义数据集的 JSON 文件结构可能不会实际上符合预期。 基本上,我认为您已经使用选项 (b) 导出了文件,而代码需要来自 (a) 的文件。由于 (b) 在顶层不包含 regions 属性,因此您会得到 KeyError.

如果我是对的,您可以通过将 balloon.py(加载 JSON)的第 112 行修改为正在关注。

annotations = json.load(open(os.path.join(dataset_dir, "via_region_data.json")))['_via_img_metadata']

根据快速浏览,来自 VIA 3.0 的 JSON 结构似乎是来自 (a) 和 (b) 的 completely different。因此,尝试将 VIA 3.0 JSON 文件与示例代码一起使用也会引发 KeyError。支持 VIA 3.0 格式需要完全修改 load_balloon 方法。