Как использовать аугментацию в detectron2 с наборами данных, загруженными с помощью register_coco_instances

Я обучил модель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))
   ]))

Но я не использую собственный загрузчик данных, как лучше всего это сделать?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
28
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По моему опыту, то, как вы регистрируете свои наборы данных (т. е. сообщаете 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()

Другие вопросы по теме