メインコンテンツへスキップ
見出し画像

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` ノードが様々な入力マスクに対して安定して動作するようになりました。

     
     

    GJL

     
     
    Road bike&Cycling Road Race, Respecting Mr.Greg LeMond, & Anti Doping, Football, Rock&Pops, History.

    あなたへのおすすめ