这个作者代码长度差不多3000,666.jpg。我们先看下他的网络代码。
目录
类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(