先看现象。用 sam2-hiera-large 做商品抠图,点提示分割后边缘呈明显阶梯,缩到 512 反而更平滑,直接传 4K 原图时锯齿最重,掩码保存成 png 后肉眼可见。
这类报错背后常见的原因有几处,逐个排除就行。模型内部把长边缩到 1024,原图细节被一次插值抹掉。另一种情况是掩码上采样用了最近邻,边缘没有羽化。
另外,点提示落在边缘附近,模型在两种语义间反复。
少数情况下是掩码阈值取 0.5 过硬,中间灰度全被砍掉。
先确认模型内部实际输入尺寸
python -c "import torch;print(torch.__version__);from sam2.build_sam import build_sam2;print(build_sam2('configs/sam2.1/sam2.1_hiera_l.yaml','sam2.1_hiera_large.pt'))"
随后把掩码按双线性上采回原图尺寸
python -c "import torch,torch.nn.functional as F;m=F.interpolate(mask.float()[None,None],size=(h,w),mode='bilinear',align_corners=False)[0,0]"
然后对掩码做 1 像素高斯羽化再二值化
python -c "from scipy.ndimage import gaussian_filter;m=(gaussian_filter(m.astype(float),1.0)>0.45)"
剩下的就是换多点提示并比较 IoU 再决定阈值
python segment.py --points 3 --thr 0.45 --post smooth
怎么算真的好了,看的是同一批现象。导出掩码的边缘过渡自然,与人工精修掩码的 IoU 提升到 0.94 以上,放大到 200% 看不到阶梯。
提醒一点。SAM 类模型的高清感来自后处理而不是输入分辨率,原图再大也会被缩到 1024,把力气花在掩码上采样和阈值上更划算。这类问题最好一次改到位,反复小改反而容易把原因搅混。
