【图像检测与分割】Mask_rcnn demo.ipynb程序剖析

介绍: demo.ipynb文件是一个简单的mask_rcnn的演示,在配置好环境后,我们在jupytrer notebook 上运行该程序实现对image文件夹下随机一张图片的检测和分割,效果在最后。

运行需具备深度学习环境,教程参考https://blog.csdn.net/weixin_44763047/article/details/122927077

1.导入各种库,已经下载好权值文件

import os
import sys
import random
import math
import numpy as np
import skimage.io
import matplotlib
import matplotlib.pyplot as plt

# 项目根目录
ROOT_DIR = os.path.abspath("D:/BS/Mask_RCNN/")

# Import Mask RCNN
sys.path.append(ROOT_DIR)  # 查找库的本地版本
from mrcnn import utils
import mrcnn.model as modellib
from mrcnn import visualize
# Import COCO config
sys.path.append(os.path.join(ROOT_DIR, "samples/coco/"))  # 查找本地版本
import coco

%matplotlib inline 

# 保存日志和训练的模型到目录下
MODEL_DIR = os.path.join(ROOT_DIR, "logs")

#训练权重文件的本地路径
COCO_MODEL_PATH = os.path.join(ROOT_DIR, "mask_rcnn_coco.h5")
# 如果需要,从发布中下载COCO训练的重量
if not os.path.exists(COCO_MODEL_PATH):
    utils.download_trained_weights(COCO_MODEL_PATH)

#要在上面运行检测的图像的目录
IMAGE_DIR = os.path.join(ROOT_DIR, "images")
  1. Config我们将使用在 MS-COCO 数据集上训练的模型。此模型的配置位于coco.py的CocoConfig类中。为了进行推断,稍微修改配置以适应任务。为此,子类化’ CocoCofig '类并覆盖需要更改的属性
class InferenceConfig(coco.CocoConfig):
    # 设置批大小为 1 since we'll be running inference on
    # one image at a time. Batch size = GPU_COUNT * IMAGES_PER_GPU
    GPU_COUNT = 1
    IMAGES_PER_GPU = 1

config = InferenceConfig()
config.display()

输出:

Configurations:
BACKBONE resnet101
BACKBONE_STRIDES [4, 8, 16, 32, 64]
BATCH_SIZE 1
BBOX_STD_DEV [0.1 0.1 0.2 0.2]
COMPUTE_BACKBONE_SHAPE None
DETECTION_MAX_INSTANCES 100
DETECTION_MIN_CONFIDENCE 0.7
DETECTION_NMS_THRESHOLD 0.3
FPN_CLASSIF_FC_LAYERS_SIZE 1024
GPU_COUNT 1
GRADIENT_CLIP_NORM 5.0
IMAGES_PER_GPU 1
IMAGE_CHANNEL_COUNT 3
IMAGE_MAX_DIM 1024
IMAGE_META_SIZE 93
IMAGE_MIN_DIM 800
IMAGE_MIN_SCALE 0
IMAGE_RESIZE_MODE square
IMAGE_SHAPE [1024 1024 3]
LEARNING_MOMENTUM 0.9
LEARNING_RATE 0.001
LOSS_WEIGHTS {‘rpn_class_loss’: 1.0, ‘rpn_bbox_loss’: 1.0, ‘mrcnn_class_loss’: 1.0, ‘mrcnn_bbox_loss’: 1.0, ‘mrcnn_mask_loss’: 1.0}
MASK_POOL_SIZE 14
MASK_SHAPE [28, 28]
MAX_GT_INSTANCES 100
MEAN_PIXEL [123.7 116.8 103.9]
MINI_MASK_SHAPE (56, 56)
NAME coco
NUM_CLASSES 81
POOL_SIZE 7
POST_NMS_ROIS_INFERENCE 1000
POST_NMS_ROIS_TRAINING 2000
PRE_NMS_LIMIT 6000
ROI_POSITIVE_RATIO 0.33
RPN_ANCHOR_RATIOS [0.5, 1, 2]
RPN_ANCHOR_SCALES (32, 64, 128, 256, 512)
RPN_ANCHOR_STRIDE 1
RPN_BBOX_STD_DEV [0.1 0.1 0.2 0.2]
RPN_NMS_THRESHOLD 0.7
RPN_TRAIN_ANCHORS_PER_IMAGE 256
STEPS_PER_EPOCH 1000
TOP_DOWN_PYRAMID_SIZE 256
TRAIN_BN False
TRAIN_ROIS_PER_IMAGE 200
USE_MINI_MASK True
USE_RPN_ROIS True
VALIDATION_STEPS 50
WEIGHT_DECAY 0.0001

3.创建模型和下载训练权重文件

#在推理模式下创建模型对象
model = modellib.MaskRCNN(mode="inference", model_dir=MODEL_DIR, config=config)

# 在MS-COCO上训练权重
model.load_weights(COCO_MODEL_PATH, by_name=True)

类名
模型对对象进行分类并返回类id,类id是标识每个类的整数值。有些数据集给它们的类赋整数值,有些则不赋整数值。例如,在MS-COCO数据集中,“person”类是1,“teddy bear”是88。id通常是有顺序的,但并不总是如此。例如,COCO数据集具有与类id 70和72相关联的类,而不是与71相关联的类。

为了提高一致性,并支持同时对来自多个数据源的数据进行训练,我们的Dataset类将它自己的顺序整数id分配给每个类。例如,如果您使用我们的dataset类加载COCO数据集,'person’类将获得class ID = 1(就像COCO),而’teddy bear’类是78(不同于COCO)。在将类id映射到类名时请记住这一点。

要获得类名列表,需要加载数据集,然后像这样使用class_names属性。

#下载 COCO dataset
dataset = coco.CocoDataset() 
dataset.load_coco(COCO_DIR, "train") 
dataset.prepare()

#输出class names
print(dataset.class_names)

下面的类名列表。类名在列表中的索引表示它的ID(第一个类是0,第二个是1,第三个是2,等等)。
4.运行目标检测

# 从images文件夹中加载一个随机的图像
file_names = next(os.walk(IMAGE_DIR))[2]
image = skimage.io.imread(os.path.join(IMAGE_DIR, random.choice(file_names)))

#运行检测
results = model.detect([image], verbose=1)

#可视化的结果
r = results[0]
visualize.display_instances(image, r['rois'], r['masks'], r['class_ids'], 
                            class_names, r['scores'])

输出:

Processing 1 images
image shape: (448, 640, 3) min: 0.00000 max: 255.00000 uint8
molded_images shape: (1, 1024, 1024, 3) min: -123.70000 max: 151.10000 float64
image_metas shape: (1, 93) min: 0.00000 max: 1024.00000 float64
anchors shape: (1, 261888, 4) min: -0.35390 max: 1.29134 float32
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值