見出し画像

Fixed LayerStyle Advance

Pythonライブラリーの「何」でこうなったか不明ですが、何かの更新に伴うエラーです。

ComfyUI LayerStyle 修正レポート

概要

ComfyUI_LayerStyle_Advance の `person_mask_ultra` ノードで発生していた `pymatting` エラーを修正しました。

修正ファイル

d:\USERFILES\ComfyUI\ComfyUI\custom_nodes\ComfyUI_LayerStyle_Advance\py\imagefunc.py

問題の原因

`pymatting` ライブラリの `estimate_alpha_cf` 関数が、trimap(マスク画像)に背景値(≤0.1)が含まれていないため失敗していました。

修正前のコード

def mask_edge_detail(image:torch.Tensor, mask:torch.Tensor, detail_range:int=8, black_point:float=0.01, white_point:float=0.99) -> torch.Tensor:
    from pymatting import fix_trimap, estimate_alpha_cf
    d = detail_range * 5 + 1
    mask = pil2tensor(tensor2pil(mask).convert('RGB'))
    if not bool(d % 2):
        d += 1
    i_dup = copy.deepcopy(image.cpu().numpy().astype(np.float64))
    a_dup = copy.deepcopy(mask.cpu().numpy().astype(np.float64))
    for index, img in enumerate(i_dup):
        trimap = a_dup[index][:, :, 0]  # convert to single channel
        if detail_range > 0:
            trimap = cv2.GaussianBlur(trimap, (d, d), 0)
        trimap = fix_trimap(trimap, black_point, white_point)
        alpha = estimate_alpha_cf(img, trimap, laplacian_kwargs={"epsilon": 1e-6},
                                  cg_kwargs={"maxiter": 500})
        a_dup[index] = np.stack([alpha, alpha, alpha], axis=-1)  # convert back to rgb
    return torch.from_numpy(a_dup.astype(np.float32))

修正後のコード

def mask_edge_detail(image:torch.Tensor, mask:torch.Tensor, detail_range:int=8, black_point:float=0.01, white_point:float=0.99) -> torch.Tensor:
    from pymatting import fix_trimap, estimate_alpha_cf
    import numpy as np
    
    d = detail_range * 5 + 1
    mask = pil2tensor(tensor2pil(mask).convert('RGB'))
    if not bool(d % 2):
        d += 1
    i_dup = copy.deepcopy(image.cpu().numpy().astype(np.float64))
    a_dup = copy.deepcopy(mask.cpu().numpy().astype(np.float64))
    
    for index, img in enumerate(i_dup):
        trimap = a_dup[index][:, :, 0]  # convert to single channel
        if detail_range > 0:
            trimap = cv2.GaussianBlur(trimap, (d, d), 0)
        
        # Check if trimap has valid background values before processing
        bg_threshold = 0.1
        has_background = np.any(trimap <= bg_threshold)
        has_foreground = np.any(trimap >= (1.0 - bg_threshold))
        
        if not has_background or not has_foreground:
            # If trimap doesn't have proper background/foreground, return original mask
            alpha = trimap
        else:
            try:
                trimap = fix_trimap(trimap, black_point, white_point)
                alpha = estimate_alpha_cf(img, trimap, laplacian_kwargs={"epsilon": 1e-6},
                                          cg_kwargs={"maxiter": 500})
            except ValueError as e:
                # If pymatting fails, return original mask
                alpha = trimap
        
        a_dup[index] = np.stack([alpha, alpha, alpha], axis=-1)  # convert back to rgb
    return torch.from_numpy(a_dup.astype(np.float32))

修正のポイント

1. 事前チェックの追加

# Check if trimap has valid background values before processing
bg_threshold = 0.1
has_background = np.any(trimap <= bg_threshold)
has_foreground = np.any(trimap >= (1.0 - bg_threshold))
  • trimapに背景値(≤0.1)と前景値(≥0.9)が存在するかチェック

  • `pymatting` が正常に動作するために必要な条件を事前に検証

2. 条件分岐による安全な処理

if not has_background or not has_foreground:
    # If trimap doesn't have proper background/foreground, return original mask
    alpha = trimap
else:
    # 正常な処理
  • 適切な背景/前景がない場合は、pymatting処理をスキップ

  • 元のマスクをそのまま使用してエラーを回避

3. 例外処理の追加

try:
    trimap = fix_trimap(trimap, black_point, white_point)
    alpha = estimate_alpha_cf(img, trimap, laplacian_kwargs={"epsilon": 1e-6},
                              cg_kwargs={"maxiter": 500})
except ValueError as e:
    # If pymatting fails, return original mask
    alpha = trimap
  • `ValueError` をキャッチして、失敗時は元のマスクを返す

  • 処理が完全に停止することを防ぐ

エラーの詳細

修正前のエラー:

ValueError: Trimap did not contain background values (values <= 0.100000)

修正後の動作:

  • 背景値がない場合は警告なしで元のマスクを返す

  • 適切なtrimapの場合は従来通りの処理を実行

  • エラーが発生しても安全にフォールバック

結果

この修正により、`person_mask_ultra` ノードが様々な入力マスクに対して安定して動作するようになりました。

いいなと思ったら応援しよう!