使用StableDiffusionInpaintPipeline遇输入格式错误问题求助
问题排查与解决方案
针对你使用StableDiffusionInpaintPipeline时遇到的格式错误,即使传入的是PIL.Image.Image仍报错,可按以下步骤逐一排查:
1. 确认输入的实际类型
你目前只打印了图像的尺寸和模式,未明确输出类型。在调用pipeline前添加类型打印代码,确认是否真的是PIL.Image.Image:
print(f"Image type: {type(image_pil)}, Mask type: {type(mask_pil)}")
如果输出不是<class 'PIL.Image.Image'>,说明图像/掩码转换过程中出现了隐式类型变更,需检查Image.fromarray的转换逻辑。
2. 检查尺寸合规性
大部分Stable Diffusion修复模型要求输入尺寸为8的倍数(如512×512、768×768),且掩码尺寸必须与原图完全一致。添加断言检查:
# 检查图像尺寸是否为8的倍数 assert image_pil.size[0] % 8 == 0 and image_pil.size[1] % 8 == 0, "图像宽高必须是8的倍数" # 检查掩码与图像尺寸匹配 assert mask_pil.size == image_pil.size, "掩码尺寸必须与原图完全一致"
3. 验证掩码的二值属性
修复任务要求掩码必须是纯二值图像(仅包含0和255两个值,0为保留区域,255为修复区域)。添加代码验证:
mask_np = np.array(mask_pil) print(f"掩码唯一值: {np.unique(mask_np)}") assert set(np.unique(mask_np)).issubset({0,255}), "掩码必须是纯二值图像(仅0和255)"
如果掩码存在其他数值,需检查cv2.resize或赋值逻辑是否引入了中间值。
4. 确认Pipeline实例正确性
确保你初始化的是专门的修复Pipeline,而非普通生成Pipeline:
from diffusers import StableDiffusionInpaintPipeline # 正确初始化修复Pipeline示例 pipeline = StableDiffusionInpaintPipeline.from_pretrained( "runwayml/stable-diffusion-inpainting", torch_dtype=torch.float16 ).to("cuda")
若误用普通的StableDiffusionPipeline,即使传入掩码也会触发格式错误。
5. 修复变量作用域隐患
你的代码中img = img.convert("RGB")位于if base64_img is not None代码块外,若base64_img为None会直接导致变量未定义错误。调整代码逻辑:
if base64_img is not None: img_data = base64.b64decode(base64_img) img = Image.open(io.BytesIO(img_data)) print("Recieved image of size: ", img.size) img = img.convert("RGB") # 将转换逻辑移入if块内 else: raise ValueError("base64_img 不能为空")
内容的提问来源于stack exchange,提问作者Ammar Ahmed
相关产品推荐
相关产品推荐

