加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

潮科技行业入门指南 | 深度学习理论与实战:提高篇(14)——Mask R-CNN代码简介

发布时间:2019-03-26 00:54:27 所属栏目:教程 来源:36氪
导读:编者按:本文节选自《深度学习理论与实战:提高篇 》一书,原文链接http://fancyerii.github.io/2019/03/14/dl-book/ 。作者李理,环信人工智能研发中心vp,有十多年自然语言处理和人工智能研发经验,主持研发过多款智能硬件的问答和对话系统,负责环信中

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)

结果如下图所示。

潮科技行业入门指南 | 深度学习理论与实战:提高篇(14)——Mask R-CNN代码简介

图: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)。最终得到的图片如下图所示。

潮科技行业入门指南 | 深度学习理论与实战:提高篇(14)——Mask R-CNN代码简介

图:显示样本

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,如果物体的比较小的话,这么存储是比较浪费空间的。因此我们有如下改进方法:

  • 我们只存储Bounding Box里的坐标对应的Mask值

    我们把Mask缩小(比如56x56),用的时候在放大回去,这对大的目标物体会有误差。但是由于我们的(人工)标注本来就没那么准。

    为了可视化Mask缩放,我们来看几个例子。

    image_id = np.random.choice(dataset.image_ids, 1)[0]
    image, image_meta, class_ids, bbox, mask = modellib.load_image_gt(
    dataset, config, image_id, use_mini_mask=False)

    log("image", image)
    log("image_meta", image_meta)
    log("class_ids", class_ids)
    log("bbox", bbox)
    log("mask", mask)

    display_images([image]+[mask[:,:,i] for i in range(min(mask.shape[-1], 7))])

    # 输出
    image shape: (128, 128, 3) min: 4.00000 max: 241.00000 uint8
    image_meta shape: (16,) min: 0.00000 max: 409.00000 int64
    class_ids shape: (2,) min: 1.00000 max: 3.00000 int32
    bbox shape: (2, 4) min: 14.00000 max: 128.00000 int32
    mask shape: (128, 128, 2) min: 0.00000 max: 1.00000 bool

    如下图所示,这个图片有一个正方形和一个三角形。

    潮科技行业入门指南 | 深度学习理论与实战:提高篇(14)——Mask R-CNN代码简介

    图:显示样本

    接下来我们对图片进行增强,比如镜像。

    (编辑:温州站长网)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读