Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

有些图片抠图时,会返回一张透明的,这种怎么处理 #131

Open
hjj-lmx opened this issue Nov 26, 2024 · 7 comments
Open

Comments

@hjj-lmx
Copy link

hjj-lmx commented Nov 26, 2024

QifWMKbZ9Sd

@ZhengPeng7
Copy link
Owner

截屏2024-11-26 18 31 01

你是指这个全白的预测结果吗? 这个是表示没有检测出结果, 因为BiRefNet用的数据集主要是针对主体进行自动分割的, 而这张图中没有前景/显著/...等各种类别的 主体, 因此没有检测出按理来说其实还是正确的哈.

@hjj-lmx
Copy link
Author

hjj-lmx commented Nov 26, 2024

没有检测出按理说其实还是对的哈。

如果我想加判断,去处理这种,应该怎么做,如果没有前景就抛一个异常。我是这么写的,是否合理
1732617413491

@ZhengPeng7
Copy link
Owner

嗯, 当然也是合理的. 就只是不推荐写在refine_foreground里😂, 毕竟它不太属于这里.

@hjj-lmx
Copy link
Author

hjj-lmx commented Nov 26, 2024

嗯, 当然也是合理的. 就只是不推荐写在refine_foreground里😂, 毕竟它不太属于这里.

那应该写在什么地方,我如果返回没有前景的,业务会报错。
在refine_foreground调用完后的逻辑中写吗?

@ZhengPeng7
Copy link
Owner

之前吧, 因为如果没有前景物体, 就不用经过refine啦, 逻辑上是这样的吧.

@hjj-lmx
Copy link
Author

hjj-lmx commented Nov 27, 2024

def has_foreground(pred_pil, threshold=0.5, min_foreground_ratio=0.01):
"""
判断分割图是否有前景
:param pred_pil: PIL.Image 对象 (二值分割图,像素范围 [0, 1])
:param threshold: 判定前景的像素值阈值 (默认 0.5)
:param min_foreground_ratio: 前景像素比例阈值 (默认 1%)
:return: 布尔值,True 表示有前景,False 表示无前景
"""
# 转为 NumPy 数组
pred_array = np.array(pred_pil)

# 如果范围是 [0, 255],归一化到 [0, 1]
if pred_array.max() > 1:
    pred_array = pred_array / 255.0

# 计算前景像素比例
foreground_ratio = (pred_array > threshold).mean()

# 判断是否有前景
return foreground_ratio > min_foreground_ratio
这么设置的比例可以吗?我是在这里调用的
    # Prediction
    with torch.no_grad():
        preds = self.birefnet(input_images)[-1].sigmoid().cpu()
    pred = preds[0].squeeze()
    pred_pil = transforms.ToPILImage()(pred)
    if not has_foreground(pred_pil):
        raise ValueError("未识别到可抠图的前景图像")
    # 取前景
    image_masked = refine_foreground(image, pred_pil)
    不知道设置的0.5和0.01是否合理

@ZhengPeng7
Copy link
Owner

大致是可以的. 当然0.01具体得看你的情况, 如果需要调整, 也可以设置像素数量绝对值作为阈值.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants