Я обучил маску r-cnn изображениям кукурузы (не могу показать примеры, поскольку они конфиденциальны), но по сути это изображения зерен кукурузы, разбросанных по плоской поверхности.
Есть разные виды кукурузных зерен, которые я хочу сегментировать и классифицировать. Я понимаю, что метрики AP — лучший способ измерения производительности алгоритма сегментации экземпляров, и знаю, что матрица путаницы для такого алгоритма обычно не имеет смысла.
Но для его конкретного случая, когда у меня есть 4 класса очень похожих объектов, я хотел бы иметь возможность установить фиксированное значение AP, например AP50/AP75, и построить для этого матрицу путаницы.
А возможно ли это? Как бы я это сделал?
Я использовал библиотеку детекторрон2 для обучения и получения прогнозов. Вот код, который я использую для загрузки обученной модели с диска, создания прогнозов в наборе проверки и визуализации результатов:
импортировать детектор2 изDetectron2.utils.logger импортируйте setup_logger setup_logger() импортировать numpy как np импортировать matplotlib.pyplot как plt импортировать операционную систему, json, cv2, случайный, gc из детектора 2 импорта model_zoo изDetectron2.data.datasets импортировать Register_coco_instances из importon2.checkpoint импорт DetectionCheckpointer, Checkpointer изDetectron2.data импорт MetadataCatalog, DatasetCatalog, build_detection_test_loader из детектора 2.engine импортировать DefaultTrainer, DefaultPredictor из детектора 2.config импортируйте get_cfg изDetectron2.utils.visualizer импортировать визуализатор, ColorMode из детектора 2.modeling импорт build_model изDetectron2.evaluation, импорт COCOEvaluator, inference_on_dataset 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" cfg = get_cfg() cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")) cfg.DATASETS.TRAIN = («поезд-кукуруза»,) cfg.DATASETS.TEST = («кукуруза проверки»,) cfg.DATALOADER.NUM_WORKERS = 2 cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml") # Разрешить инициализацию обучения из зоопарка модели 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 cfg.OUTPUT_DIR = "./выход" cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0,7 Register_coco_instances( «поезд-кукуруза», {}, train_annotations_path, train_images_path ) Register_coco_instances( "кукуруза проверки", {}, validation_annotations_path, validation_images_path ) Metadata_train = MetadataCatalog.get("поезд-кукуруза") dataset_dicts = DatasetCatalog.get("поезд-кукуруза") cfg.MODEL.WEIGHTS = os.path.join(cfg.OUTPUT_DIR, "model_final.pth") cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0,7 предиктор = DefaultPredictor(cfg) Predicted_images_path = os.path.abspath("./predicted/") dataset_dicts_validation = DatasetCatalog.get("проверка-кукуруза") для d в dataset_dicts_validation: im = cv2.imread(d["имя_файла"]) выходные данные = предиктор (im) v = Визуализатор(im[:, :, ::-1], метаданные = метаданные_поезд, масштаб=0,5, instance_mode=ColorMode.IMAGE_BW ) out = v.draw_instance_predictions(выходы["экземпляры"].to("процессор")) fig = plt.figure(frameon=False, dpi=1) fig.set_size_inches(1024,1024) ax = plt.Axes(рис, [0., 0., 1., 1.]) ax.set_axis_off() fig.add_axes(ax) ax.imshow(cv2.cvtColor(out.get_image()[:, :, ::-1], cv2.COLOR_BGR2RGB), аспект='авто') fig.savefig(f"{predicted_images_path}/{d['file_name'].split('/')[-1]}") Вот как выглядит мой вывод для данного изображения:

Это словарь с объектом Instances в качестве единственного значения. Объект Instances имеет четыре списка: pred_boxes, оценки, pred_classes и pred_masks. И можно визуализировать с помощью визуализатора детекторрон2, но я не могу показать визуализацию по соображениям конфиденциальности.
Вот метрики, которые у меня есть для модели на данный момент:

И для каждого класса:

И визуально я заметил, что некоторые ядра путаются с другими классами, особенно между классами ardido и Fermentado, поэтому я хочу как-то иметь возможность построить матрицу путаницы.
Я ожидаю, что матрица путаницы будет выглядеть примерно так:

РЕДАКТИРОВАТЬ: Я нашел этот репозиторий:
https://github.com/kaanakan/object_dete ... ion_matrix
И попробовал его использовать:
из запутанной_матрицы импортировать ConfusionMatrix см = ConfusionMatrix(4, CONF_THRESHOLD=0,3, IOU_THRESHOLD=0,3) для d в dataset_dicts_validation: img = cv2.imread(d["имя_файла"]) выходные данные = предиктор (img) метки = список() обнаружения = список() для Энн в d["аннотации"]: labels.append([ann["category_id"]] + ann["bbox"]) для координат, конф, cls в zip( outputs["instances"].get("pred_boxes").tensor.cpu().numpy(), выходы["экземпляры"].get("оценки").cpu().numpy(), выходы["экземпляры"].get("pred_classes").cpu().numpy() ): обнаружения.append(список(координаты) + [conf] + [cls]) cm.process_batch(np.array(обнаружения), np.array(метки)) Но матрица, которую я получил, явно неправильная, и мне трудно ее исправить.
