假设您正在执行语义分割。为了简单起见,让我们假设这是一维分割,而不是二维分割(即我们只关心寻找具有宽度的对象)。
因此,我们模型的期望输出可能如下所示:
[
[0, 0, 0, 0, 1, 1, 1], # label channel 1
[1, 1, 1, 0, 0, 1, 1], # label channel 2
[0, 0, 0, 1, 1, 1, 0], # label channel 3
#...
]然而,我们训练的不完美的模型可能更像是
[
[0.1, 0.1, 0.1, 0.4, 0.91, 0.81, 0.84], # label channel 1
[0.81, 0.79, 0.85, 0.1, 0.2, 0.61, 0.91], # label channel 2
[0.3, 0.1, 0.24, 0.87, 0.62, 1, 0 ], # label channel 3
#...
]使用python获取标签(或边界框)边界的最佳方式是什么?
例如(零索引)
[
[[4, 6]], # "objects" of label 1
[[0, 2], [5, 6]] # "objects" of label 2
[[3, 5]], # "objects" of label 3
]如果它有帮助,也许将其转换为二进制掩码会更有用?
def binarize(arr, cutoff=0.5):
return (arr > cutoff).astype(int)使用二进制掩码,我们只需要找到非零值的索引的连续整数:
定义连续的(data,stepsize=1):返回np.split(data,np.where(np.diff(data) != stepsize)+1)
查找标签的“运行”:
def binary_boundaries(labels, cutoff=0.5):
return [consecutive(channel.nonzero()[0]) for channel in binarize(labels, cutoff)]根据通道名称命名对象:
def binary_objects(labels, cutoff=0.5, channel_names=None):
if channel_names == None:
channel_names = ['channel {}'.format(i) for i in range(labels.shape[0])]
return dict(zip(channel_names, binary_boundaries(labels, cutoff)))发布于 2018-11-23 00:48:14
您经过训练的模型返回的是float image,而不是您要查找的int image (如果小数让您感到困扰,这并不是“不完美”),是的!您确实需要对其执行threshold操作以获取binary image。
一旦你有了二进制镜像,让我们用skimage做一些工作。
label_mask = measure.label(mask)
props = measure.regionprops(label_mask)mask是你的二值图像,在这里你有props所有区域的属性,这些区域实际上是被检测到的物体。
在这些属性中,存在边界框!
https://stackoverflow.com/questions/53360471
复制相似问题