Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: support stable horde restore faces #157

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ interface ParamConfig {
textSteps?: number
imageSteps?: number
maxSteps?: number
restoreFaces?: boolean
restoreFaces?: 'CodeFormer' | 'GFPGAN' | boolean
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个设计有一个小问题。当用户使用 sd-webui 并设置为 true 后,再次切换成 stable-horde,此时配置就从类型上不兼容了。反过来也有类似的问题。

这个问题并没有太好的解决方案。或许可以在两侧都加一个 transform 不过我不确定可行。但至少在实际代码中,可能需要给 stable-horde 传入的 true 一个 fallback。

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个设计有一个小问题。当用户使用 sd-webui 并设置为 true 后,再次切换成 stable-horde,此时配置就从类型上不兼容了。反过来也有类似的问题。

Yeah, that is what I concerned about, either.
But I think it might be redundant to have restoreFaces and restoreFacesModels that can be covered by each other.
If you argue with the fallback method, I could change to this style.

这个问题并没有太好的解决方案。或许可以在两侧都加一个 transform 不过我不确定可行。

I think the transform is not a valid solution here.

但至少在实际代码中,可能需要给 stable-horde 传入的 true 一个 fallback。

Yep. So the GFPGAN is the primary face restoration model in the Stable Horde, I think it is better to treat true as GFPGAN if we were going to implement the fallback method.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As sd-webui and stable horde both supports codeformers and GFPGAN as face restoration model, I think it might be better to produce a PR to webui side to make the face restoration configurable from API.
What do you think?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As sd-webui and stable horde both supports codeformers and GFPGAN as face restoration model, I think it might be better to produce a PR to webui side to make the face restoration configurable from API. What do you think?

Sounds great. You can also edit directly here and change the subject of this PR to "enhancing restore faces support".

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

By the way, the Stable Horde called CodeFormer as "CodeFormers", so we're also need to handle this weird differences. Lol.

hiresFix?: boolean
}

Expand Down Expand Up @@ -248,6 +248,11 @@ export const Config = Schema.intersect([
type: Schema.const('stable-horde'),
sampler: sampler.createSchema(sampler.horde),
model: Schema.union(hordeModels),
restoreFaces: Schema.union([
Schema.const(false).description('禁用'),
Schema.const('CodeFormer').description('使用 CodeFormer'),
Schema.const('GFPGAN').description('使用 GFPGAN'),
]).description('是否启用人脸修复。').default(false),
}),
Schema.object({
type: Schema.const('naifu'),
Expand Down
8 changes: 6 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ export function apply(ctx: Context, config: Config) {
return {
sampler_index: sampler.sd[options.sampler],
init_images: image && [image.dataUrl], // sd-webui accepts data URLs with base64 encoded image
restore_faces: config.restoreFaces ?? false,
restore_faces: config.restoreFaces === true,
enable_hr: options.hiresFix ?? config.hiresFix ?? false,
...project(parameters, {
prompt: 'prompt',
Expand All @@ -286,6 +286,10 @@ export function apply(ctx: Context, config: Config) {
}
}
case 'stable-horde': {
const postProcessing = []
if (typeof config.restoreFaces === 'string') {
postProcessing.push(config.restoreFaces)
}
return {
prompt: parameters.prompt,
params: {
Expand All @@ -295,7 +299,7 @@ export function apply(ctx: Context, config: Config) {
seed: parameters.seed.toString(),
height: parameters.height,
width: parameters.width,
post_processing: [],
post_processing: postProcessing,
karras: options.sampler.includes('_ka'),
steps: parameters.steps,
n: 1,
Expand Down