Detectron2 Mask-Rcnn 对同一对象保持相同的颜色分割class

Detectron2 Mask-Rcnn keep same color segmentation for same object class

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

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

ColorMode(1) 只有在传递给 Visualizer 的元数据定义了 thing_colors 时才有效。来自documentation for ColorMode,

SEGMENTATION= 1

Let instances of the same category have similar colors (from metadata.thing_colors), and overlay them with high opacity. This provides more attention on the quality of segmentation.

因此,您需要将预定义颜色列表(每个 class 一个)添加到您的元数据。来自 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.

现在,实际使用的颜色可能与 thing_colors 中指定的颜色不完全相同。在 Visualizer.draw_instance_predictions() 中,每个指定的颜色都通过添加一个随机值来抖动,因此叠加的颜色略有不同。这种随机值的使用意味着您仍然会看到 class 帧之间的颜色变化。根据您指定的颜色,此更改在视觉上可能很明显,也可能不明显。

一个简单的解决方案可能是 subclass Visualizer 并覆盖 _jitter() 方法,使其 returns 颜色保持原样。

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

但是,_jitter() 旨在成为一个内部方法,因此这是一个 hacky 解决方案,有时可能会失败。

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