config = ShapesConfig()
# 我们把下面的代码注释掉 # MS COCO Dataset #import coco #config = coco.CocoConfig() #COCO_DIR = "path to COCO dataset" # TODO: enter value here
2、加载Dataset
# Load dataset if config.NAME == 'shapes': dataset = ShapesDataset() dataset.load_shapes(500, config.IMAGE_SHAPE[0], config.IMAGE_SHAPE[1]) elif config.NAME == "coco": dataset = coco.CocoDataset() dataset.load_coco(COCO_DIR, "train")
# 使用dataset之前必须调用prepare() dataset.prepare()
print("Image Count: {}".format(len(dataset.image_ids))) print("Class Count: {}".format(dataset.num_classes)) for i, info in enumerate(dataset.class_info): print("{:3}. {:50}".format(i, info['name']))
# 运行后的结果为: Image Count: 500 Class Count: 4 0. BG 1. square 2. circle 3. triangle
3、显示样本
我们可以显示一些样本。
image_ids = np.random.choice(dataset.image_ids, 4) for image_id in image_ids: image = dataset.load_image(image_id) mask, class_ids = dataset.load_mask(image_id) visualize.display_top_masks(image, mask, class_ids, dataset.class_names)
结果如下图所示。

图:Mask 显示4个样本
4、Bounding Box
一般的数据集同时提供Bounding box和Mask,但是为了简单,我们只需要数据集提供Mask,我们可以通过Mask计算出Bounding box来。这样还有一个好处,那就是如果我们对目标物体进行旋转缩放等操作,计算Mask会比较容易,我们可以用新的Mask重新计算新的Bounding Box。否则我们就得对Bounding box进行相应的旋转缩放,这通常比较麻烦。
# 随机加载一个图片和它对应的mask. image_id = random.choice(dataset.image_ids) image = dataset.load_image(image_id) mask, class_ids = dataset.load_mask(image_id) # 计算Bounding box bbox = utils.extract_bboxes(mask)
# 显示图片其它的统计信息 print("image_id ", image_id, dataset.image_reference(image_id)) log("image", image) log("mask", mask) log("class_ids", class_ids) log("bbox", bbox) # 显示图片 visualize.display_instances(image, bbox, mask, class_ids, dataset.class_names)
最重要的代码就是bbox = utils.extract_bboxes(mask)。最终得到的图片如下图所示。

图:显示样本
subsubsection{缩放图片} 我们需要把图片都缩放成1024x1024(shape数据是生成的,都是固定大小,但实际数据集肯定不是这样)。我们会保持宽高比比最大的缩放成1024,比如原来是512x256,那么就会缩放成1024x512。然后我们把不足的维度两边补零,比如把1024x512padding成1024x1024,height维度上下各补256个0(256个0+512个真实数据+256个0)。
# 随机加载一个图片和它的mask image_id = np.random.choice(dataset.image_ids, 1)[0] image = dataset.load_image(image_id) mask, class_ids = dataset.load_mask(image_id) original_shape = image.shape # 缩放图片, image, window, scale, padding, _ = utils.resize_image( image, min_dim=config.IMAGE_MIN_DIM, max_dim=config.IMAGE_MAX_DIM, mode=config.IMAGE_RESIZE_MODE)
# 缩放图片后一定要缩放mask,否则就不一致了 mask = utils.resize_mask(mask, scale, padding) # 计算Bounding box bbox = utils.extract_bboxes(mask)
# 显示图片的其它统计信息 print("image_id: ", image_id, dataset.image_reference(image_id)) print("Original shape: ", original_shape) log("image", image) log("mask", mask) log("class_ids", class_ids) log("bbox", bbox)
# 显示图片 visualize.display_instances(image, bbox, mask, class_ids, dataset.class_names)
5、Mini Masks
一个图片可能有多个目标物体,每个物体的Mask是一个bool数组,大小是[width, height]。很显然,Bounding box之外的Mask肯定都是False,如果物体的比较小的话,这么存储是比较浪费空间的。因此我们有如下改进方法:
|