我正在训练git中的train_shapes样本,用于3个对象类的maskRCNN。我使用VIA 2.0.8将图像批注提取到JSON。
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-11-bbed02f10f39> in <module>
3 for image_id in image_ids:
4 image = dataset.load_image(image_id)
----> 5 mask, class_ids = dataset.load_mask(image_id)
6 visualize.display_top_masks(image, mask, class_ids, dataset.class_names)
K:\Python\maskRCNN\samples\dining\dining.py in load_mask(self, image_id)
186 mask[:, :, i] = mask[:, :, i] * occlusion
187 occlusion = np.logical_and(occlusion, np.logical_not(mask[:, :, i]))
--> 188 # Map class names to class IDs.
189 class_ids = np.array([self.class_names.index(s[0]) for s in polygons])
190 return mask.astype(np.bool), class_ids.astype(np.int32)
K:\Python\maskRCNN\samples\dining\dining.py in <listcomp>(.0)
186 mask[:, :, i] = mask[:, :, i] * occlusion
187 occlusion = np.logical_and(occlusion, np.logical_not(mask[:, :, i]))
--> 188 # Map class names to class IDs.
189 class_ids = np.array([self.class_names.index(s[0]) for s in polygons])
190 return mask.astype(np.bool), class_ids.astype(np.int32)
KeyError: 0
这是它调用的代码:
def load_mask(self, image_id):
"""Generate instance masks for an image.
Returns:
masks: A bool array of shape [height, width, instance count] with
one mask per instance.
class_ids: a 1D array of class IDs of the instance masks.
"""
# If not a dining dataset image, delegate to parent class.
image_info = self.image_info[image_id]
if image_info["source"] != "dining":
return super(self.__class__, self).load_mask(image_id)
# Convert polygons to a bitmap mask of shape
# [height, width, instance_count]
info = self.image_info[image_id]
polygons = info["polygons"]
count = len(info["polygons"])
mask = np.zeros([info["height"], info["width"], count],
dtype=np.uint8)
for i, p in enumerate(info["polygons"]):
# Get indexes of pixels inside the polygon and set them to 1
rr, cc = skimage.draw.polygon(p['all_points_y'], p['all_points_x'])
mask[rr, cc, i] = 1
# Handle occlusions
occlusion = np.logical_not(mask[:, :, -1]).astype(np.uint8)
for i in range(count-2, -1, -1):
mask[:, :, i] = mask[:, :, i] * occlusion
occlusion = np.logical_and(occlusion, np.logical_not(mask[:, :, i]))
# Map class names to class IDs.
class_ids = np.array([self.class_names.index(s[0]) for s in polygons])
return mask.astype(np.bool), class_ids.astype(np.int32)
什么是KeyError?这是我的多边形变量导致的数据结构错误吗?
Key errors and how to handle them
总之。无论多边形是什么,它似乎都包含某种字典对象,当您在class_ids = np.array([self.class_names.index(s[0]) for s in polygons])
行中循环时,将其分配给s
,然后尝试访问键0
,但没有一个。
我的建议是调试出polygons
和其中的每个s
的确切含义。然后计算出您期望s[0]
到底是什么。不知道每个s
是什么样子,很难给出更具体的解决方案。