Detectron2: No hay instancias en la predicción.
Estoy intentando entrenar Detectron2 en un conjunto de datos personalizado que anoté con coco-annotator. Después de entrenar, quería predecir Instancias de mi imagen, pero no obtengo ninguna mostrada.
Entrenamiento:
from detectron2.engine import DefaultTrainer
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
cfg.DATASETS.TRAIN = ("TrashTron_train",)
cfg.DATASETS.TEST = ("TrashTron_val",)
cfg.DATALOADER.NUM_WORKERS = 2
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml") # Deja que el entrenamiento inicialice desde el modelo zoologico
cfg.SOLVER.IMS_PER_BATCH = 2
cfg.SOLVER.BASE_LR = 0.00025 # Elija un LR bueno
cfg.SOLVER.MAX_ITER = 300 # 300 iteraciones parece ser suficiente para este conjunto de datos de juguete; necesitará entrenar más tiempo para un conjunto de datos práctico
cfg.SOLVER.STEPS = [] # no disminuir la tasa de aprendizaje
cfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE = 512 # más rápido, y lo suficientemente bueno para este conjunto de datos de juguete (predeterminado: 512)
cfg.MODEL.ROI_HEADS.NUM_CLASSES = 24 # solo tiene una clase (globo). (ver https://detectron2.readthedocs.io/tutorials/datasets.html#update-the-config-for-new-datasets)
NOTA: esta configuración significa el número de clases, pero unos pocos tutoriales no oficiales populares utilizan incorrectamente num_classes+1 aquí.
os.makedirs(cfg.OUTPUT_DIR, exist_ok=True)
trainer = DefaultTrainer(cfg)
trainer.resume_or_load(resume=False)
trainer.train()
Predicción:
test_data = [{'1191.jpg': '/content/datasets/val/1191.jpg',
'image_id': 1308}]
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.7 # set a custom testing threshold
cfg.MODEL.WEIGHTS = os.path.join(cfg.OUTPUT_DIR, "model_final.pth") # ruta al modelo que acabamos de entrenar
cfg.MODEL.ROI_HEADS.NUM_CLASSES = 24
predictor = DefaultPredictor(cfg)
outputs = predictor(im)
print(outputs["instances"].pred_densepose)
im = cv2.imread(test_data[0]["1191.jpg"])
v = Visualizer(im[:, :, ::-1],
metadata=MetadataCatalog.get(cfg.DATASETS.TRAIN[0]),
scale=0.5,
instance_mode=ColorMode.IMAGE_BW)
out = v.draw_instance_predictions(outputs["instances"].to("cpu"))
img = cv2.cvtColor(out.get_image()[:, :, ::-1], cv2.COLOR_RGBA2RGB)
plt.imshow(img)
Se muestra la imagen correspondiente, pero no hay instancias.
¿Algún consejo? Las puntuaciones de evaluación general no son muy buenas, pero elegí la mejor clase y allí tampoco obtengo ninguna predicción…
davy.ai
Parece que puede haber un problema con el modelo entrenado que no puede detectar ninguna instancia en la imagen proporcionada. Esto puede deberse a varias razones, tales como:
Para abordar estos problemas, puedes intentar lo siguiente:
Adicionalmente, puedes intentar visualizar los resultados del modelo en diversas imágenes para ver si hay un problema consistente con la detección de instancias, o si solo ocurre en ciertas imágenes. Esto puede ayudarte a comprender mejor el problema e identificar posibles soluciones.