从掩码 RCNN 结果中选择特定掩码,r。过滤字典以仅保留键 are['class_ids']==1



这是我现在遇到的最接近问题:掩码RCNN 1类仅

Mask RCNN返回一个字典r,看起来像:

{'rois': array([[ 17,   0, 371, 300],
[323, 107, 374, 153]]),
'class_ids': array([ 1, 28]),
'scores': array([0.9999876 , 0.77787864], dtype=float32),
'masks': array([[[False, False],
[False, False],
[False, False],
...,
[False, False],
[False, False],
[False, False]],

[[False, False],
[False, False],
[False, False],
...,
[False, False],
[False, False],
[False, False]],

[[False, False],
[False, False],
[False, False],
...,
[False, False],
[False, False],
[False, False]]])}

我只想保留person类(class_ids==1(的掩码

我试着用过滤字典

filtered = {k: v for k, v in r.items() if (r['class_ids'] == 1)}

这导致以下ValueError

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

当我再次尝试时

filtered = {k: v for k, v in r.items() if (r['class_ids'] == 1).any()}

这不会过滤掉任何内容。a.all((返回一个空字典。我很困惑该怎么做。

如有任何帮助,我们将不胜感激!非常感谢。

根据我的理解,r['mass']数组包含模型中每个可能类的数组。使用COCO作为基本模型。person类的索引为1。所以你可以通过获得个人口罩

person_mask = r['masks'][:][1]

然而,在我的用例中,它并没有起到多大帮助。因为我想把人物面具放在白色背景上。使用skimage.io.imread读取的原始图像具有形状(x,y,z(,person_mask具有形状(y,z。形状为(x,y,z(的r["面具"],其中z是图像中发现的面具数量——例如,它可以是一个人的面具(索引1(和一条领带的面具(指数28(。通常,可以安全地假设第一个掩模是一个人的掩模,这就是为什么我们可以通过使用将原始图像转换为只保留个人掩模的区域

temp[:,:,j] = temp[:,:,j] * r['masks'][:,:,0]

完整代码低于

temp = skimage.io.imread('05a.jpg')
for j in range(temp.shape[2]):
temp[:,:,j] = temp[:,:,j] * r['masks'][:,:,0]
background = np.zeros_like(temp)
background[:,:,:]  = (255, 255, 255)
rows,cols,channels = temp.shape
roi = background[0:rows, 0:cols]
temp = cv.cvtColor(temp,cv.COLOR_RGB2BGR)
img2gray = cv.cvtColor(temp,cv.COLOR_BGR2GRAY)
ret, mask = cv.threshold(img2gray, 0, 255, cv.THRESH_BINARY)
mask_inv = cv.bitwise_not(mask)
img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)
img2_fg = cv.bitwise_and(temp,temp,mask = mask)
dst = cv.add(img1_bg,img2_fg)
background[0:rows, 0:cols ] = dst
cv.imwrite('res.jpg', background)

最新更新