Detectron2 Mask-Rcnn 为相同的对象类保持相同的颜色分割

我在视频上使用 Mask-Rcnn 的 detectron2 实现,问题是在每一帧上,同一对象的分割颜色会发生变化。

是否有任何参数可以让我为对象类保留单一颜色。我已经尝试过detectron2.utils.visualizer.ColorMode(1) 但它不起作用

stack overflow Detectron2 Mask-Rcnn keep same color segmentation for same object class
原文答案
author avatar

接受的答案

ColorMode(1) 仅在传递给 Visualizer 的元数据已定义 thing_colors 时才有效。从 documentation for ColorMode

细分= 1

让同一类别的实例具有相似的颜色(来自 metadata.thing_colors),并以高不透明度覆盖它们。这提供了对分割质量的更多关注。

因此,您需要在元数据中添加一个预定义颜色列表(每个类别一个)。从 here

thing_colors (list [tuple(r, g, b)]): Pre-defined color (in [0, 255]) for each thing category. Used for visualization. If not given, random colors will be used.

Now, the actual colors used may not be the exact same ones as specified in thing_colors. In Visualizer.draw_instance_predictions() ,每个指定的颜色都是通过添加一个随机值来抖动的,所以叠加的颜色是稍微不同的。这种随机值的使用意味着你仍然会看到类颜色的变化帧之间。根据您指定的颜色,此更改可能会或可能不会在视觉上明显。

一个简单的解决方案可能是继承 Visualizer 并覆盖 _jitter() 方法,以便它按原样返回颜色。

class MyVisualizer(Visualizer):
    def _jitter(self, color):
        return color

但是, _jitter() 旨在成为一种内部方法,因此这是一个 hacky 解决方案,并且可能会在某个时候中断。

更好的解决方案可能是覆盖 draw_instance_predictions() 并根据您的需要自定义绘图。


答案:

作者头像

尝试添加以下行

from detectron2.utils.visualizer import Visualizer ,  GenericMask , ColorMode

MetadataCatalog.get(cfg.DATASETS.TRAIN[0]).thing_classes = clss
MetadataCatalog.get(cfg.DATASETS.TRAIN[0]).thing_colors = [(255,255,0),(0,0,255),(0,255,0),(255,0,255),(156,225,242)]
class MyVisualizer(Visualizer):
    def _jitter(self, color ):
        return color
v = Visualizer(im[:, :, ::-1], MetadataCatalog.get(cfg.DATASETS.TRAIN[0]), scale=1.2,instance_mode=ColorMode.SEGMENTATION)
v = v.draw_instance_predictions(outputs["instances"].to("cpu"))
img = cv2.resize(v.get_image()[:, :, ::-1], (1220, 780))