mask rcnn model.py 总结

这个作者代码长度差不多3000,666.jpg。我们先看下他的网络代码。

目录

类MaskRCNN

__init__方法

build方法

train方法

set_trainable方法



类MaskRCNN

这里有个比较重要的类就是Mask RCNN类,该类包含了很多种方法,简单的看一下:

总览MaskRCNN类的工作原理。建立清晰的框架。方便抓住重点。

init方法初始化模型配置参数,比如说学习率等。调用的build方法。

build方法负责建立模型,并且返回。

此时如果不调用MaskRCNN中的train方法,那么模型是不会训练的。所以在coco.py中,先建立了MaskRCNN的实例,然后调用了train方法。

init接受了config而train接受了训练数据,

__init__方法

被coco.py调用

就是把一个类实体化,这样他才真实存在,有数据。c++,java都这样。可以去学一下类object class。

那么需要传入的参数。config我们之前在coco.py见过,是config.py的子类。

小提醒一下,在coco.py中:

#引入config.py
from mrcnn.config import Config
#CocoConfig继承config类,内容此处因为是提示所以就省略了。
class CocoConfig(Config):
#实例化CocoConfig成为对象,改变attribute
# Configurations
if args.command == "train":
    config = CocoConfig()
else:
    #看到这里又继承了,因为inference和train的参数不太一样
    class InferenceConfig(CocoConfig):
        # Set batch size to 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
        DETECTION_MIN_CONFIDENCE = 0
    #对应的,也会实例化InferenceConfig,而不是CocoConfig
    config = InferenceConfig()
config.display()
#将CocoConfig对象当做参数传入MaskRCNN类的实例化,也就是__init__方法
if args.command == "train":
    model = modellib.MaskRCNN(mode="training", config=config,
                                  model_dir=args.logs)
else:
    model = modellib.MaskRCNN(mode="inference", config=config,
                                  model_dir=args.logs)

下面可以看下inference里面的config具体内容

 

这下就清楚的知道MaskRCNN怎么被实例化的了。也知道实例化的参数都来源于哪里了。__init__方法除了接收参数之外,还调用了两个方法。其中build能够返回创建的Keras.Model方法创建的model实例。所以这个self.keras_model记住了,这是我们这个类当中最重要的属性。

 def __init__(self, mode, config, model_dir):
        """
        mode: Either "training" or "inference"
        config: A Sub-class of the Config class
        这里的model_dir就是训练过程中的日志以及参数储存的位置。
        model_dir: Directory to save training logs and trained weights
        """
#判断mode是不是合法的,如果输入的不是['training', 'inference']里面的值,会报错
        assert mode in ['training', 'inference']
#给类MaskRCNN的attribute赋值
        self.mode = mode
        self.config = config
        self.model_dir = model_dir
#调用了两个方法
        #名字起得很好,设置日志路径
        self.set_log_dir()
        #调用自己的build方法。build会建立MaskRCNN的模型结构,只传入了选项(训练还是validation)
        #以及config参数。
        self.keras_model = self.build(mode=mode, config=config)

下面就看一下build方法

build方法

被__init__方法调用,传入参数。

 def build(self, mode, config):
        """Build Mask R-CNN architecture.
            #这里作者说明一下,他所谓的input_shape什么意思。因为他下面会用到
            input_shape: The shape of the input image.
            #区分training还是validation主要是因为模型会有不同的输入输出
            mode: Either "training" or "inference". The inputs and
                outputs of the model differ accordingly.
        """
        assert mode in ['training', 'inference']

检测图片的尺寸是否符合网络的需求,必须至少能被64整除。

 # Image size must be dividable by 2 multiple times
        h, w = config.IMAGE_SHAPE[:2]
        if h / 2**6 != int(h / 2**6) or w / 2**6 != int(w / 2**6):
            raise Exception("Image size must be dividable by 2 at least 6 times "
                            "to avoid fractions when downscaling and upscaling."
                            "For example, use 256, 320, 384, 448, 512, ... etc. ")

输入数据的建立,这里用到了keras.layer的input,注意这里只知道了tensor的大小,还没有真实的数据,通俗来讲就是先占个楼,等以后数据来了,在更新。IMAGE_SHAPE[2]的值是3.根据config。config.IMAGE_META_SIZE是93,inference里面,估计训练也是这样的,因为inference语句里面没有单独声明这两个参数。

# Inputs
        input_image = KL.Input(
    
  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值