-2

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

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

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

4

2 回答 2

0

你没有给我们你的 JSON,所以不可能真的告诉我们,但是扫描链接中的文件我不认为这是你的错,balloons.py 的第 117 行是

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

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

annotations = [a for a in annotations if ‘regions’ in a]
于 2021-12-05T21:21:13.777 回答
0

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

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

(a) 使用“注释”菜单下的“导出注释(作为 JSON)”选项。生成的 JSON 仅包含位于顶层的注释数据。

或者

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

根据我的经验,VIA 1.0 似乎只有 (a) 可用,而 VIA 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)完全不同。因此,尝试将 VIA 3.0 JSON 文件与示例代码一起使用也会引发KeyError. 支持 VIA 3.0 格式需要对该load_balloon方法进行完全修改。

于 2021-12-06T15:27:29.783 回答