首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >边界框的语义分割

边界框的语义分割
EN

Stack Overflow用户
提问于 2018-11-18 19:42:10
回答 1查看 1.9K关注 0票数 1

假设您正在执行语义分割。为了简单起见,让我们假设这是一维分割,而不是二维分割(即我们只关心寻找具有宽度的对象)。

因此,我们模型的期望输出可能如下所示:

代码语言:javascript
复制
[
    [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
    #...
]

然而,我们训练的不完美的模型可能更像是

代码语言:javascript
复制
[
    [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获取标签(或边界框)边界的最佳方式是什么?

例如(零索引)

代码语言:javascript
复制
[
    [[4, 6]],        # "objects" of label 1
    [[0, 2], [5, 6]] # "objects" of label 2
    [[3, 5]],        # "objects" of label 3
]

如果它有帮助,也许将其转换为二进制掩码会更有用?

代码语言:javascript
复制
def binarize(arr, cutoff=0.5):
  return (arr > cutoff).astype(int)

使用二进制掩码,我们只需要找到非零值的索引的连续整数:

定义连续的(data,stepsize=1):返回np.split(data,np.where(np.diff(data) != stepsize)+1)

查找标签的“运行”:

代码语言:javascript
复制
def binary_boundaries(labels, cutoff=0.5):  
  return [consecutive(channel.nonzero()[0]) for channel in binarize(labels, cutoff)]

根据通道名称命名对象:

代码语言:javascript
复制
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)))
EN

回答 1

Stack Overflow用户

发布于 2018-11-23 00:48:14

您经过训练的模型返回的是float image,而不是您要查找的int image (如果小数让您感到困扰,这并不是“不完美”),是的!您确实需要对其执行threshold操作以获取binary image

一旦你有了二进制镜像,让我们用skimage做一些工作。

代码语言:javascript
复制
label_mask = measure.label(mask)
props = measure.regionprops(label_mask)

mask是你的二值图像,在这里你有props所有区域的属性,这些区域实际上是被检测到的物体。

在这些属性中,存在边界框!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53360471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档