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