Я обучил модельDetectron2 на пользовательских данных, которые я пометил и экспортировал в формате coco, но теперь я хочу применить дополнение и обучить, используя дополненные данные. Как я могу это сделать, если я использую не пользовательский 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
); это не имеет значения. Важно то, что вы хотите применить некоторые преобразования во время загрузки данных.
По сути, вы хотите настроить часть загрузки данных, что может быть достигнуто только с помощью пользовательского загрузчика данных (если вы не выполняете автономное увеличение, которое, вероятно, не то, что вам нужно).
Теперь вам не нужно определять и использовать собственный загрузчик данных непосредственно в коде верхнего уровня. Вы можете просто создать свой собственный тренер, основанный на 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)
Тогда в вашем коде верхнего уровня единственное изменение, которое требуется, — это использовать MyTrainer
вместо DefaultTrainer
.
trainer = MyTrainer(cfg)
trainer.resume_or_load(resume=False)
trainer.train()