调通 Fooocus 的 Gradio 放大图接口

上一期我们终于调通了 gradio client 的接口,这样我们文生图就不用依赖于界面了, 不过放大图还不行,今天我们来搞定这个。

前情提要

如果你还没调通 fooocust 的 gradio client 接口,那么不妨去看看这篇。 fooocus 的 gradio client 接口目前全部都是未命名的节点(unamed endpoint) 而且随时有可能会变,所以我们这边只讲方法,目前我这里 fooocus 的版本是 2.3.0, 如果版本对不上,那么参数可能需要按下面流程修正。

问题

之前我们已经推测了一版 fn_index=40 的各个参数的含义,那么其实对应到界面, 我们可以试着填一下参数看看效果,有用的参数似乎是这么几个:

True,	#'Input Image' Checkbox
"",		# 'parameter_91' Textbox? maybe: Upscale or Variation Prompt
"Vary (Subtle)",	# 'Upscale or Variation:' Radio
"path/to/pic.png",			# 'Upscale or Variation' Image

1 和 3 没什么争议,2 我们不知道是啥,先空着,4 的话,看说明是可以填写图片的路径, 但是按这个填法四个填下去,显然是不行的,不然我也不用写这个。图是可以生得出来, 但是似乎跟我们给出的图片完全没有关系。我觉得可能的原因有三个:

  1. 文件配置无效
  2. parameter_91 是什么还不清楚
  3. 调用画图接口 41 有误

这三个其实都挺难验证的,相对而言第一个简单一点,在尝试了路径字符串、文件、 base64 几种格式后,我觉得其实就应该传路径,因为其他几种都会报错, 而填写正确的路径是不会报错的。第三个原因是我接下来排除的,因为重新看了一遍接口, 感觉只有这个 41 最像是画图。那么问题很可能就是这个 parameter_91, 但是因为没有说明文档,那我们要怎么确定这个参数的含义呢?自然只能去看源码。

分析

我的水平有限,看懂大模型怎么画图是不太现实的,但是看懂参数怎么传递的,其实不难, 我们搜一个配置值就好了,比如 ADM Scale

在源码搜这段文字,很快我们可以找到值得怀疑的对象:

看上去就是把入参一个一个 pop 出来,那我们要找的参数在哪里呢,继续看就好了:

碰巧这段和我们参数的排列差不多,首先是一个勾选项,然后两个 string, 最后是一个文件。print 是我加上去的,因为我想看下这几个值是什么, 根据这段我们可以知道了 current_tab就是那个传说中的 parameter_91 。 所以加完 print,我们在 fooocus 的 web 页面画一次放大图, 就知道这个参数应该传什么了,注意改完代码要重启 fooocus 才能生效。关子就不卖了, 放大图是 “uov”,如果我们在代码中搜 current_tab, 会注意到它的另两个值 "ip""inpaint"

什么意思就留给大家验证了,我已经可以用代码做放大图了,以下是 anime 的全部配置:

from gradio_client import Client

client = Client("http://127.0.0.1:7865/")

# Textbox: string
# Checkbox: bool
# Radio: string
# Dropdown: string
# Slider: float | int
# Checkboxgroup: list[string]
# Image: filepath or URL to image

result = client.predict(
	False,	# 'Generate Image Grid for Each Batch' Checkbox
	"",	# 'Prompt' Textbox
	"",	# 'Negative Prompt' Textbox
    # 'Selected Styles' Checkboxgroup
	["Fooocus V2", "Fooocus Semi Realistic", "Fooocus Masterpiece"],
	"Speed",	# 'Performance' Radio
	"1280×768",	# 'Aspect Ratios' Radio
	1,		# 'Image Number' Slider [1,32]
	"png",	# 'Output Format' Radio
	"0",	# 'Seed' Textbox
    False,	# 'Read wildcards in order' Checkbox
	2,		# 'Image Sharpness' Slider [0.0,30.0]
	7,		#  'Guidance Scale' Slider [1.0,30.0]
	"animaPencilXL_v100.safetensors",	# 'Base Model (SDXL only)' Dropdown
	"None",	# 'Refiner (SDXL or SD 1.5)' Dropdown
	0.5,	# 'Refiner Switch At' Slider [0.1,1.0]
	True,	# 'LoRA 1 Enable' Checkbox
	"None",	# 'LoRA 1' Dropdown
	1,	# 'LoRA 1 Weight' Slider [-2,2]
	True,	# 'LoRA 2 Enable' Checkbox
	"None",	# 'LoRA 2' Dropdown
	1,		# 'LoRA 2 Weight' Slider [-2,2]
	True,	# 'LoRA 3 Enable' Checkbox
	"None",	# 'LoRA 3' Dropdown
	1,		# 'LoRA 3 Weight' Slider [-2,2]
	True,	# 'LoRA 4 Enable' Checkbox
	"None",	# 'LoRA 4' Dropdown
	1,		# 'LoRA 4 Weight' Slider [-2,2]
	True,	# 'LoRA 5 Enable' Checkbox
	"None",	# 'LoRA 5' Dropdown component
	1,		# 'LoRA 5 Weight' Slider [-2,2]
	True,	#'Input Image' Checkbox
	"uov",		# 'current tab' Textbox ["uov", "ip", "inpaint"]
	"Vary (Subtle)",	# 'Upscale or Variation:' Radio
	"20240322214141.jpg",			# 'Upscale or Variation' Image
	["Left"],	# 'Outpaint Direction' Checkboxgroup
	"",		# 'Inpaint or Outpaint' Image
	"",		# 'Inpaint Additional Prompt' Textbox
	"",		# 'Inpaint or Outpaint Mask Upload' Image
	True,	# 'Developer Debug Mode: Disable Preview' Checkbox
	True,	# 'Developer Debug Mode: Disable Intermediate Results' Checkbox
	True,	# 'Developer Debug Mode: Disable seed increment' Checkbox
	1.5,	# 'Developer Debug Mode: Positive ADM Guidance Scaler' Slider [0.1,3.0]
	0.8,	# 'Developer Debug Mode: Negative ADM Guidance Scaler' Slider [0.1,3.0]
	0.3,	# 'Developer Debug Mode: ADM Guidance End At Step' Slider [0.0,1.0]
	7,		# 'Developer Debug Mode: CFG Mimicking from TSNR' Slider [1.0,30.0]
	"dpmpp_2m_sde_gpu",	# 'Developer Debug Mode: Sampler' Dropdown
	"karras",	# 'Developer Debug Mode: Scheduler' Dropdown
	-1,	# 'Developer Debug Mode: Forced Overwrite of Sampling Step' Slider [-1,200]
	-1,	# 'Developer Debug Mode: Forced Overwrite of Refiner Switch Step' Slider [-1,200]
	-1,	# 'Developer Debug Mode: Forced Overwrite of Generating Width' Slider [-1,2048]
	-1,	# 'Developer Debug Mode: Forced Overwrite of Generating Height' Slider [-1,2048]
	-1,	# 'Developer Debug Mode: Forced Overwrite of Denoising Strength of "Vary"' Slider [-1,1.0]
	-1,	# 'Developer Debug Mode: Forced Overwrite of Denoising Strength of "Upscale"' Slider [-1,1.0]
	False,	# 'Developer Debug Mode: Mixing Image Prompt and Vary/Upscale' Checkbox
	False,	# 'Developer Debug Mode: Mixing Image Prompt and Inpaint' Checkbox
	False,	# 'Developer Debug Mode: Debug Preprocessors' Checkbox
	False,	# 'Developer Debug Mode: Skip Preprocessors' Checkbox
	64,		# 'Developer Debug Mode: Canny Low Threshold' Slider [1,255]
	128,	# 'Developer Debug Mode: Canny High Threshold' Slider [1,255]
	"joint",	# 'Developer Debug Mode: Refiner swap method' Dropdown
	0.25,	# 'Developer Debug Mode: Softness of ControlNet' Slider [0.0,1.0]
	False,	# 'Developer Debug Mode: FreeU Enabled' Checkbox
	1.01,	# 'Developer Debug Mode: FreeU B1' Slider [0,2]
	1.02,	# 'Developer Debug Mode: FreeU B2' Slider [0,2]
	0.99,	# 'Developer Debug Mode: FreeU S1' Slider [0,4]
	0.95,	# 'Developer Debug Mode: FreeU S2' Slider [0,4]
	False,	# 'Developer Debug Mode: Debug Inpaint Preprocessing' Checkbox
	False,	# 'Developer Debug Mode: Disable initial latent in inpaint' Checkbox
	"v2.6",	# 'Developer Debug Mode: Inpaint Engine' Dropdown
	1,		# 'Developer Debug Mode: Inpaint Denoising Strength' Slider [0.0,1.0]
	0.618,	# 'Developer Debug Mode: Inpaint Respective Field' Slider [0.0,1.0]
	False,	# 'Developer Debug Mode: Enable Mask Upload' Checkbox
	False,	# 'Developer Debug Mode: Invert Mask' Checkbox
	0,		# 'Developer Debug Mode: Mask Erode or Dilate' Slider [-64,64]
	False,	# 'Developer Debug Mode: Save Metadata to Images' Checkbox
	"fooocus",	# 'Metadata Scheme' Radio
	"",				# 'Image Prompt Image 1' Image component
	0,				# 'Image Prompt Image 1 Stop At' Slider [0.0-1.0]
	0,				# 'Image Prompt Image 1 Weight' Slider [0.0-2.0]
	"ImagePrompt",	# 'Image Prompt Image 1 Type' Radio
	"",				# 'Image Prompt Image 2' Image component
	0,				# 'Image Prompt Image 2 Stop At' Slider [0.0-1.0]
	0,				# 'Image Prompt Image 2 Weight' Slider [0.0-2.0]
	"ImagePrompt",	# 'Image Prompt Image 2 Type' Radio
	"",				# 'Image Prompt Image 3' Image component
	0,				# 'Image Prompt Image 3 Stop At' Slider [0.0-1.0]
	0,				# 'Image Prompt Image 3 Weight' Slider [0.0-2.0]
	"ImagePrompt",	# 'Image Prompt Image 3 Type' Radio
	"",				# 'Image Prompt Image 4' Image component
	0,				# 'Image Prompt Image 4 Stop At' Slider [0.0-1.0]
	0,				# 'Image Prompt Image 4 Weight' Slider [0.0-2.0]
	"ImagePrompt",	# 'Image Prompt Image 4 Type' Radio
	fn_index=40
)
print(result)
result= client.predict(fn_index=41)

总结

现在我想我离用代码去搞批量生图,只差一步了,就是忽略调用接口 41 的报错, 这个应该不会很难。