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

问题描述

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

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

解决方法

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

分段= 1

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

因此,您需要向元数据添加一个预定义颜色列表(每个类一个)。来自here

thing_colors (list[tuple(r,g,b)]):每个事物类别的预定义颜色(在 [0,255] 中)。用于可视化。如果没有给出,将使用随机颜色。

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

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

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

然而,_jitter() 旨在成为一种内部方法,因此这是一个笨拙的解决方案,有时可能会中断。

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