如何将 detectron2 的扩充与使用 register_coco_instances 加载的数据集一起使用
How to use detectron2's augmentation with datasets loaded using register_coco_instances
我已经在以 coco 格式标记和导出的自定义数据上训练了一个 detectron2 模型,但我现在想应用增强并使用增强数据进行训练。如果我不使用自定义 DataLoader,而是使用 register_coco_instances 函数,我该怎么做。
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")
predictor = DefaultPredictor(cfg)
outputs = predictor(im)
train_annotations_path = "./data/cvat-corn-train-coco-1.0/annotations/instances_default.json"
train_images_path = "./data/cvat-corn-train-coco-1.0/images"
validation_annotations_path = "./data/cvat-corn-validation-coco-1.0/annotations/instances_default.json"
validation_images_path = "./data/cvat-corn-validation-coco-1.0/images"
register_coco_instances(
"train-corn",
{},
train_annotations_path,
train_images_path
)
register_coco_instances(
"validation-corn",
{},
validation_annotations_path,
validation_images_path
)
metadata_train = MetadataCatalog.get("train-corn")
dataset_dicts = DatasetCatalog.get("train-corn")
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
cfg.DATASETS.TRAIN = ("train-corn",)
cfg.DATASETS.TEST = ("validation-corn",)
cfg.DATALOADER.NUM_WORKERS = 2
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml") # Let training initialize from model zoo
cfg.SOLVER.IMS_PER_BATCH = 2
cfg.SOLVER.BASE_LR = 0.00025
cfg.SOLVER.MAX_ITER = 10000
cfg.SOLVER.STEPS = []
cfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE = 128
cfg.MODEL.ROI_HEADS.NUM_CLASSES = 4
os.makedirs(cfg.OUTPUT_DIR, exist_ok=True)
trainer = DefaultTrainer(cfg)
trainer.resume_or_load(resume=False)
trainer.train()
我在文档中看到您可以像这样加载数据集并应用扩充:
dataloader = build_detection_train_loader(cfg,
mapper=DatasetMapper(cfg, is_train=True, augmentations=[
T.Resize((800, 800))
]))
但我没有使用自定义数据加载器,执行此操作的最佳方法是什么?
根据我的经验,您如何注册数据集(即告诉 Detectron2 如何获取名为 "my_dataset"
的数据集)与训练期间使用的数据加载器无关(即如何从注册数据集并处理成模型需要的格式)。
因此,您可以根据需要注册数据集 - 通过使用 register_coco_instances
函数或直接使用数据集 API(DatasetCatalog
、MetadataCatalog
);没关系。重要的是你想在数据加载部分应用一些转换。
基本上,您想要自定义数据加载部分,这只能通过使用自定义数据加载器来实现(除非您执行离线扩充,这可能不是您想要的)。
现在,您无需直接在 top-level 代码中定义和使用自定义数据加载器。您可以创建自己的从 DefaultTrainer
派生的训练器,并覆盖其 build_train_loader
方法。就这么简单。
class MyTrainer(DefaultTrainer):
@classmethod
def build_train_loader(cls, cfg):
mapper = DatasetMapper(cfg, is_train=True, augmentations=[T.Resize((800, 800))])
return build_detection_train_loader(cfg, mapper=mapper)
然后在您的 top-level 代码中,唯一需要的更改是使用 MyTrainer
而不是 DefaultTrainer
。
trainer = MyTrainer(cfg)
trainer.resume_or_load(resume=False)
trainer.train()
我已经在以 coco 格式标记和导出的自定义数据上训练了一个 detectron2 模型,但我现在想应用增强并使用增强数据进行训练。如果我不使用自定义 DataLoader,而是使用 register_coco_instances 函数,我该怎么做。
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")
predictor = DefaultPredictor(cfg)
outputs = predictor(im)
train_annotations_path = "./data/cvat-corn-train-coco-1.0/annotations/instances_default.json"
train_images_path = "./data/cvat-corn-train-coco-1.0/images"
validation_annotations_path = "./data/cvat-corn-validation-coco-1.0/annotations/instances_default.json"
validation_images_path = "./data/cvat-corn-validation-coco-1.0/images"
register_coco_instances(
"train-corn",
{},
train_annotations_path,
train_images_path
)
register_coco_instances(
"validation-corn",
{},
validation_annotations_path,
validation_images_path
)
metadata_train = MetadataCatalog.get("train-corn")
dataset_dicts = DatasetCatalog.get("train-corn")
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
cfg.DATASETS.TRAIN = ("train-corn",)
cfg.DATASETS.TEST = ("validation-corn",)
cfg.DATALOADER.NUM_WORKERS = 2
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml") # Let training initialize from model zoo
cfg.SOLVER.IMS_PER_BATCH = 2
cfg.SOLVER.BASE_LR = 0.00025
cfg.SOLVER.MAX_ITER = 10000
cfg.SOLVER.STEPS = []
cfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE = 128
cfg.MODEL.ROI_HEADS.NUM_CLASSES = 4
os.makedirs(cfg.OUTPUT_DIR, exist_ok=True)
trainer = DefaultTrainer(cfg)
trainer.resume_or_load(resume=False)
trainer.train()
我在文档中看到您可以像这样加载数据集并应用扩充:
dataloader = build_detection_train_loader(cfg,
mapper=DatasetMapper(cfg, is_train=True, augmentations=[
T.Resize((800, 800))
]))
但我没有使用自定义数据加载器,执行此操作的最佳方法是什么?
根据我的经验,您如何注册数据集(即告诉 Detectron2 如何获取名为 "my_dataset"
的数据集)与训练期间使用的数据加载器无关(即如何从注册数据集并处理成模型需要的格式)。
因此,您可以根据需要注册数据集 - 通过使用 register_coco_instances
函数或直接使用数据集 API(DatasetCatalog
、MetadataCatalog
);没关系。重要的是你想在数据加载部分应用一些转换。
基本上,您想要自定义数据加载部分,这只能通过使用自定义数据加载器来实现(除非您执行离线扩充,这可能不是您想要的)。
现在,您无需直接在 top-level 代码中定义和使用自定义数据加载器。您可以创建自己的从 DefaultTrainer
派生的训练器,并覆盖其 build_train_loader
方法。就这么简单。
class MyTrainer(DefaultTrainer):
@classmethod
def build_train_loader(cls, cfg):
mapper = DatasetMapper(cfg, is_train=True, augmentations=[T.Resize((800, 800))])
return build_detection_train_loader(cfg, mapper=mapper)
然后在您的 top-level 代码中,唯一需要的更改是使用 MyTrainer
而不是 DefaultTrainer
。
trainer = MyTrainer(cfg)
trainer.resume_or_load(resume=False)
trainer.train()