feat: Add SDXL Negative Aesthetic Score

This commit is contained in:
blessedcoolant 2023-08-14 04:02:36 +12:00
parent 90fa3eebb3
commit 499e89d6f6
9 changed files with 183 additions and 53 deletions

View File

@ -67,7 +67,10 @@ class CoreMetadata(BaseModelExcludeNull):
) )
refiner_steps: Union[int, None] = Field(default=None, description="The number of steps used for the refiner") refiner_steps: Union[int, None] = Field(default=None, description="The number of steps used for the refiner")
refiner_scheduler: Union[str, None] = Field(default=None, description="The scheduler used for the refiner") refiner_scheduler: Union[str, None] = Field(default=None, description="The scheduler used for the refiner")
refiner_aesthetic_store: Union[float, None] = Field( refiner_positive_aesthetic_store: Union[float, None] = Field(
default=None, description="The aesthetic score used for the refiner"
)
refiner_negative_aesthetic_store: Union[float, None] = Field(
default=None, description="The aesthetic score used for the refiner" default=None, description="The aesthetic score used for the refiner"
) )
refiner_start: Union[float, None] = Field(default=None, description="The start value used for refiner denoising") refiner_start: Union[float, None] = Field(default=None, description="The start value used for refiner denoising")
@ -136,7 +139,10 @@ class MetadataAccumulatorInvocation(BaseInvocation):
) )
refiner_steps: Union[int, None] = Field(default=None, description="The number of steps used for the refiner") refiner_steps: Union[int, None] = Field(default=None, description="The number of steps used for the refiner")
refiner_scheduler: Union[str, None] = Field(default=None, description="The scheduler used for the refiner") refiner_scheduler: Union[str, None] = Field(default=None, description="The scheduler used for the refiner")
refiner_aesthetic_store: Union[float, None] = Field( refiner_positive_aesthetic_score: Union[float, None] = Field(
default=None, description="The aesthetic score used for the refiner"
)
refiner_negative_aesthetic_score: Union[float, None] = Field(
default=None, description="The aesthetic score used for the refiner" default=None, description="The aesthetic score used for the refiner"
) )
refiner_start: Union[float, None] = Field(default=None, description="The start value used for refiner denoising") refiner_start: Union[float, None] = Field(default=None, description="The start value used for refiner denoising")

View File

@ -25,7 +25,8 @@ export const addSDXLRefinerToGraph = (
): void => { ): void => {
const { const {
refinerModel, refinerModel,
refinerAestheticScore, refinerPositiveAestheticScore,
refinerNegativeAestheticScore,
refinerSteps, refinerSteps,
refinerScheduler, refinerScheduler,
refinerCFGScale, refinerCFGScale,
@ -40,7 +41,10 @@ export const addSDXLRefinerToGraph = (
if (metadataAccumulator) { if (metadataAccumulator) {
metadataAccumulator.refiner_model = refinerModel; metadataAccumulator.refiner_model = refinerModel;
metadataAccumulator.refiner_aesthetic_store = refinerAestheticScore; metadataAccumulator.refiner_positive_aesthetic_score =
refinerPositiveAestheticScore;
metadataAccumulator.refiner_negative_aesthetic_score =
refinerNegativeAestheticScore;
metadataAccumulator.refiner_cfg_scale = refinerCFGScale; metadataAccumulator.refiner_cfg_scale = refinerCFGScale;
metadataAccumulator.refiner_scheduler = refinerScheduler; metadataAccumulator.refiner_scheduler = refinerScheduler;
metadataAccumulator.refiner_start = refinerStart; metadataAccumulator.refiner_start = refinerStart;
@ -74,13 +78,13 @@ export const addSDXLRefinerToGraph = (
type: 'sdxl_refiner_compel_prompt', type: 'sdxl_refiner_compel_prompt',
id: SDXL_REFINER_POSITIVE_CONDITIONING, id: SDXL_REFINER_POSITIVE_CONDITIONING,
style: craftedPositiveStylePrompt, style: craftedPositiveStylePrompt,
aesthetic_score: refinerAestheticScore, aesthetic_score: refinerPositiveAestheticScore,
}; };
graph.nodes[SDXL_REFINER_NEGATIVE_CONDITIONING] = { graph.nodes[SDXL_REFINER_NEGATIVE_CONDITIONING] = {
type: 'sdxl_refiner_compel_prompt', type: 'sdxl_refiner_compel_prompt',
id: SDXL_REFINER_NEGATIVE_CONDITIONING, id: SDXL_REFINER_NEGATIVE_CONDITIONING,
style: craftedNegativeStylePrompt, style: craftedNegativeStylePrompt,
aesthetic_score: refinerAestheticScore, aesthetic_score: refinerNegativeAestheticScore,
}; };
graph.nodes[SDXL_REFINER_DENOISE_LATENTS] = { graph.nodes[SDXL_REFINER_DENOISE_LATENTS] = {
type: 'denoise_latents', type: 'denoise_latents',

View File

@ -4,16 +4,16 @@ import {
refinerModelChanged, refinerModelChanged,
setNegativeStylePromptSDXL, setNegativeStylePromptSDXL,
setPositiveStylePromptSDXL, setPositiveStylePromptSDXL,
setRefinerAestheticScore,
setRefinerCFGScale, setRefinerCFGScale,
setRefinerNegativeAestheticScore,
setRefinerPositiveAestheticScore,
setRefinerScheduler, setRefinerScheduler,
setRefinerStart, setRefinerStart,
setRefinerSteps, setRefinerSteps,
} from 'features/sdxl/store/sdxlSlice'; } from 'features/sdxl/store/sdxlSlice';
import { useCallback } from 'react'; import { useCallback } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { UnsafeImageMetadata } from 'services/api/types'; import { ImageDTO, UnsafeImageMetadata } from 'services/api/types';
import { ImageDTO } from 'services/api/types';
import { initialImageSelected, modelSelected } from '../store/actions'; import { initialImageSelected, modelSelected } from '../store/actions';
import { import {
setCfgScale, setCfgScale,
@ -34,8 +34,9 @@ import {
isValidPositivePrompt, isValidPositivePrompt,
isValidSDXLNegativeStylePrompt, isValidSDXLNegativeStylePrompt,
isValidSDXLPositiveStylePrompt, isValidSDXLPositiveStylePrompt,
isValidSDXLRefinerAestheticScore,
isValidSDXLRefinerModel, isValidSDXLRefinerModel,
isValidSDXLRefinerNegativeAestheticScore,
isValidSDXLRefinerPositiveAestheticScore,
isValidSDXLRefinerStart, isValidSDXLRefinerStart,
isValidScheduler, isValidScheduler,
isValidSeed, isValidSeed,
@ -339,7 +340,8 @@ export const useRecallParameters = () => {
refiner_cfg_scale, refiner_cfg_scale,
refiner_steps, refiner_steps,
refiner_scheduler, refiner_scheduler,
refiner_aesthetic_store, refiner_positive_aesthetic_store,
refiner_negative_aesthetic_store,
refiner_start, refiner_start,
} = metadata; } = metadata;
@ -398,8 +400,24 @@ export const useRecallParameters = () => {
dispatch(setRefinerScheduler(refiner_scheduler)); dispatch(setRefinerScheduler(refiner_scheduler));
} }
if (isValidSDXLRefinerAestheticScore(refiner_aesthetic_store)) { if (
dispatch(setRefinerAestheticScore(refiner_aesthetic_store)); isValidSDXLRefinerPositiveAestheticScore(
refiner_positive_aesthetic_store
)
) {
dispatch(
setRefinerPositiveAestheticScore(refiner_positive_aesthetic_store)
);
}
if (
isValidSDXLRefinerNegativeAestheticScore(
refiner_negative_aesthetic_store
)
) {
dispatch(
setRefinerNegativeAestheticScore(refiner_negative_aesthetic_store)
);
} }
if (isValidSDXLRefinerStart(refiner_start)) { if (isValidSDXLRefinerStart(refiner_start)) {

View File

@ -353,22 +353,40 @@ export const isValidPrecision = (val: unknown): val is PrecisionParam =>
zPrecision.safeParse(val).success; zPrecision.safeParse(val).success;
/** /**
* Zod schema for SDXL refiner aesthetic score parameter * Zod schema for SDXL refiner positive aesthetic score parameter
*/ */
export const zSDXLRefinerAestheticScore = z.number().min(1).max(10); export const zSDXLRefinerPositiveAestheticScore = z.number().min(1).max(10);
/** /**
* Type alias for SDXL refiner aesthetic score parameter, inferred from its zod schema * Type alias for SDXL refiner aesthetic positive score parameter, inferred from its zod schema
*/ */
export type SDXLRefinerAestheticScoreParam = z.infer< export type SDXLRefinerPositiveAestheticScoreParam = z.infer<
typeof zSDXLRefinerAestheticScore typeof zSDXLRefinerPositiveAestheticScore
>; >;
/** /**
* Validates/type-guards a value as a SDXL refiner aesthetic score parameter * Validates/type-guards a value as a SDXL refiner positive aesthetic score parameter
*/ */
export const isValidSDXLRefinerAestheticScore = ( export const isValidSDXLRefinerPositiveAestheticScore = (
val: unknown val: unknown
): val is SDXLRefinerAestheticScoreParam => ): val is SDXLRefinerPositiveAestheticScoreParam =>
zSDXLRefinerAestheticScore.safeParse(val).success; zSDXLRefinerPositiveAestheticScore.safeParse(val).success;
/**
* Zod schema for SDXL refiner negative aesthetic score parameter
*/
export const zSDXLRefinerNegativeAestheticScore = z.number().min(1).max(10);
/**
* Type alias for SDXL refiner aesthetic negative score parameter, inferred from its zod schema
*/
export type SDXLRefinerNegativeAestheticScoreParam = z.infer<
typeof zSDXLRefinerNegativeAestheticScore
>;
/**
* Validates/type-guards a value as a SDXL refiner negative aesthetic score parameter
*/
export const isValidSDXLRefinerNegativeAestheticScore = (
val: unknown
): val is SDXLRefinerNegativeAestheticScoreParam =>
zSDXLRefinerNegativeAestheticScore.safeParse(val).success;
/** /**
* Zod schema for SDXL start parameter * Zod schema for SDXL start parameter

View File

@ -4,9 +4,10 @@ import { stateSelector } from 'app/store/store';
import { useAppSelector } from 'app/store/storeHooks'; import { useAppSelector } from 'app/store/storeHooks';
import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions';
import IAICollapse from 'common/components/IAICollapse'; import IAICollapse from 'common/components/IAICollapse';
import ParamSDXLRefinerAestheticScore from './SDXLRefiner/ParamSDXLRefinerAestheticScore';
import ParamSDXLRefinerCFGScale from './SDXLRefiner/ParamSDXLRefinerCFGScale'; import ParamSDXLRefinerCFGScale from './SDXLRefiner/ParamSDXLRefinerCFGScale';
import ParamSDXLRefinerModelSelect from './SDXLRefiner/ParamSDXLRefinerModelSelect'; import ParamSDXLRefinerModelSelect from './SDXLRefiner/ParamSDXLRefinerModelSelect';
import ParamSDXLRefinerNegativeAestheticScore from './SDXLRefiner/ParamSDXLRefinerNegativeAestheticScore';
import ParamSDXLRefinerPositiveAestheticScore from './SDXLRefiner/ParamSDXLRefinerPositiveAestheticScore';
import ParamSDXLRefinerScheduler from './SDXLRefiner/ParamSDXLRefinerScheduler'; import ParamSDXLRefinerScheduler from './SDXLRefiner/ParamSDXLRefinerScheduler';
import ParamSDXLRefinerStart from './SDXLRefiner/ParamSDXLRefinerStart'; import ParamSDXLRefinerStart from './SDXLRefiner/ParamSDXLRefinerStart';
import ParamSDXLRefinerSteps from './SDXLRefiner/ParamSDXLRefinerSteps'; import ParamSDXLRefinerSteps from './SDXLRefiner/ParamSDXLRefinerSteps';
@ -38,7 +39,8 @@ const ParamSDXLRefinerCollapse = () => {
<ParamSDXLRefinerCFGScale /> <ParamSDXLRefinerCFGScale />
</Flex> </Flex>
<ParamSDXLRefinerScheduler /> <ParamSDXLRefinerScheduler />
<ParamSDXLRefinerAestheticScore /> <ParamSDXLRefinerPositiveAestheticScore />
<ParamSDXLRefinerNegativeAestheticScore />
<ParamSDXLRefinerStart /> <ParamSDXLRefinerStart />
</Flex> </Flex>
</IAICollapse> </IAICollapse>

View File

@ -0,0 +1,60 @@
import { createSelector } from '@reduxjs/toolkit';
import { stateSelector } from 'app/store/store';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions';
import IAISlider from 'common/components/IAISlider';
import { setRefinerNegativeAestheticScore } from 'features/sdxl/store/sdxlSlice';
import { memo, useCallback } from 'react';
import { useIsRefinerAvailable } from 'services/api/hooks/useIsRefinerAvailable';
const selector = createSelector(
[stateSelector],
({ sdxl, hotkeys }) => {
const { refinerNegativeAestheticScore } = sdxl;
const { shift } = hotkeys;
return {
refinerNegativeAestheticScore,
shift,
};
},
defaultSelectorOptions
);
const ParamSDXLRefinerNegativeAestheticScore = () => {
const { refinerNegativeAestheticScore, shift } = useAppSelector(selector);
const isRefinerAvailable = useIsRefinerAvailable();
const dispatch = useAppDispatch();
const handleChange = useCallback(
(v: number) => dispatch(setRefinerNegativeAestheticScore(v)),
[dispatch]
);
const handleReset = useCallback(
() => dispatch(setRefinerNegativeAestheticScore(2.5)),
[dispatch]
);
return (
<IAISlider
label="Negative Aesthetic Score"
step={shift ? 0.1 : 0.5}
min={1}
max={10}
onChange={handleChange}
handleReset={handleReset}
value={refinerNegativeAestheticScore}
sliderNumberInputProps={{ max: 10 }}
withInput
withReset
withSliderMarks
isInteger={false}
isDisabled={!isRefinerAvailable}
/>
);
};
export default memo(ParamSDXLRefinerNegativeAestheticScore);

View File

@ -3,50 +3,50 @@ import { stateSelector } from 'app/store/store';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions';
import IAISlider from 'common/components/IAISlider'; import IAISlider from 'common/components/IAISlider';
import { setRefinerAestheticScore } from 'features/sdxl/store/sdxlSlice'; import { setRefinerPositiveAestheticScore } from 'features/sdxl/store/sdxlSlice';
import { memo, useCallback } from 'react'; import { memo, useCallback } from 'react';
import { useIsRefinerAvailable } from 'services/api/hooks/useIsRefinerAvailable'; import { useIsRefinerAvailable } from 'services/api/hooks/useIsRefinerAvailable';
const selector = createSelector( const selector = createSelector(
[stateSelector], [stateSelector],
({ sdxl, hotkeys }) => { ({ sdxl, hotkeys }) => {
const { refinerAestheticScore } = sdxl; const { refinerPositiveAestheticScore } = sdxl;
const { shift } = hotkeys; const { shift } = hotkeys;
return { return {
refinerAestheticScore, refinerPositiveAestheticScore,
shift, shift,
}; };
}, },
defaultSelectorOptions defaultSelectorOptions
); );
const ParamSDXLRefinerAestheticScore = () => { const ParamSDXLRefinerPositiveAestheticScore = () => {
const { refinerAestheticScore, shift } = useAppSelector(selector); const { refinerPositiveAestheticScore, shift } = useAppSelector(selector);
const isRefinerAvailable = useIsRefinerAvailable(); const isRefinerAvailable = useIsRefinerAvailable();
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const handleChange = useCallback( const handleChange = useCallback(
(v: number) => dispatch(setRefinerAestheticScore(v)), (v: number) => dispatch(setRefinerPositiveAestheticScore(v)),
[dispatch] [dispatch]
); );
const handleReset = useCallback( const handleReset = useCallback(
() => dispatch(setRefinerAestheticScore(6)), () => dispatch(setRefinerPositiveAestheticScore(6)),
[dispatch] [dispatch]
); );
return ( return (
<IAISlider <IAISlider
label="Aesthetic Score" label="Positive Aesthetic Score"
step={shift ? 0.1 : 0.5} step={shift ? 0.1 : 0.5}
min={1} min={1}
max={10} max={10}
onChange={handleChange} onChange={handleChange}
handleReset={handleReset} handleReset={handleReset}
value={refinerAestheticScore} value={refinerPositiveAestheticScore}
sliderNumberInputProps={{ max: 10 }} sliderNumberInputProps={{ max: 10 }}
withInput withInput
withReset withReset
@ -57,4 +57,4 @@ const ParamSDXLRefinerAestheticScore = () => {
); );
}; };
export default memo(ParamSDXLRefinerAestheticScore); export default memo(ParamSDXLRefinerPositiveAestheticScore);

View File

@ -16,7 +16,8 @@ type SDXLInitialState = {
refinerSteps: number; refinerSteps: number;
refinerCFGScale: number; refinerCFGScale: number;
refinerScheduler: SchedulerParam; refinerScheduler: SchedulerParam;
refinerAestheticScore: number; refinerPositiveAestheticScore: number;
refinerNegativeAestheticScore: number;
refinerStart: number; refinerStart: number;
}; };
@ -30,7 +31,8 @@ const sdxlInitialState: SDXLInitialState = {
refinerSteps: 20, refinerSteps: 20,
refinerCFGScale: 7.5, refinerCFGScale: 7.5,
refinerScheduler: 'euler', refinerScheduler: 'euler',
refinerAestheticScore: 6, refinerPositiveAestheticScore: 6,
refinerNegativeAestheticScore: 2.5,
refinerStart: 0.7, refinerStart: 0.7,
}; };
@ -68,8 +70,17 @@ const sdxlSlice = createSlice({
setRefinerScheduler: (state, action: PayloadAction<SchedulerParam>) => { setRefinerScheduler: (state, action: PayloadAction<SchedulerParam>) => {
state.refinerScheduler = action.payload; state.refinerScheduler = action.payload;
}, },
setRefinerAestheticScore: (state, action: PayloadAction<number>) => { setRefinerPositiveAestheticScore: (
state.refinerAestheticScore = action.payload; state,
action: PayloadAction<number>
) => {
state.refinerPositiveAestheticScore = action.payload;
},
setRefinerNegativeAestheticScore: (
state,
action: PayloadAction<number>
) => {
state.refinerNegativeAestheticScore = action.payload;
}, },
setRefinerStart: (state, action: PayloadAction<number>) => { setRefinerStart: (state, action: PayloadAction<number>) => {
state.refinerStart = action.payload; state.refinerStart = action.payload;
@ -87,7 +98,8 @@ export const {
setRefinerSteps, setRefinerSteps,
setRefinerCFGScale, setRefinerCFGScale,
setRefinerScheduler, setRefinerScheduler,
setRefinerAestheticScore, setRefinerPositiveAestheticScore,
setRefinerNegativeAestheticScore,
setRefinerStart, setRefinerStart,
} = sdxlSlice.actions; } = sdxlSlice.actions;

View File

@ -1209,10 +1209,15 @@ export type components = {
*/ */
refiner_scheduler?: string; refiner_scheduler?: string;
/** /**
* Refiner Aesthetic Store * Refiner Positive Aesthetic Store
* @description The aesthetic score used for the refiner * @description The aesthetic score used for the refiner
*/ */
refiner_aesthetic_store?: number; refiner_positive_aesthetic_store?: number;
/**
* Refiner Negative Aesthetic Store
* @description The aesthetic score used for the refiner
*/
refiner_negative_aesthetic_store?: number;
/** /**
* Refiner Start * Refiner Start
* @description The start value used for refiner denoising * @description The start value used for refiner denoising
@ -3599,10 +3604,15 @@ export type components = {
*/ */
refiner_scheduler?: string; refiner_scheduler?: string;
/** /**
* Refiner Aesthetic Store * Refiner Positive Aesthetic Score
* @description The aesthetic score used for the refiner * @description The aesthetic score used for the refiner
*/ */
refiner_aesthetic_store?: number; refiner_positive_aesthetic_score?: number;
/**
* Refiner Negative Aesthetic Score
* @description The aesthetic score used for the refiner
*/
refiner_negative_aesthetic_score?: number;
/** /**
* Refiner Start * Refiner Start
* @description The start value used for refiner denoising * @description The start value used for refiner denoising
@ -5781,11 +5791,11 @@ export type components = {
image?: components["schemas"]["ImageField"]; image?: components["schemas"]["ImageField"];
}; };
/** /**
* StableDiffusionOnnxModelFormat * ControlNetModelFormat
* @description An enumeration. * @description An enumeration.
* @enum {string} * @enum {string}
*/ */
StableDiffusionOnnxModelFormat: "olive" | "onnx"; ControlNetModelFormat: "checkpoint" | "diffusers";
/** /**
* StableDiffusion2ModelFormat * StableDiffusion2ModelFormat
* @description An enumeration. * @description An enumeration.
@ -5793,23 +5803,23 @@ export type components = {
*/ */
StableDiffusion2ModelFormat: "checkpoint" | "diffusers"; StableDiffusion2ModelFormat: "checkpoint" | "diffusers";
/** /**
* ControlNetModelFormat * StableDiffusionXLModelFormat
* @description An enumeration. * @description An enumeration.
* @enum {string} * @enum {string}
*/ */
ControlNetModelFormat: "checkpoint" | "diffusers"; StableDiffusionXLModelFormat: "checkpoint" | "diffusers";
/**
* StableDiffusionOnnxModelFormat
* @description An enumeration.
* @enum {string}
*/
StableDiffusionOnnxModelFormat: "olive" | "onnx";
/** /**
* StableDiffusion1ModelFormat * StableDiffusion1ModelFormat
* @description An enumeration. * @description An enumeration.
* @enum {string} * @enum {string}
*/ */
StableDiffusion1ModelFormat: "checkpoint" | "diffusers"; StableDiffusion1ModelFormat: "checkpoint" | "diffusers";
/**
* StableDiffusionXLModelFormat
* @description An enumeration.
* @enum {string}
*/
StableDiffusionXLModelFormat: "checkpoint" | "diffusers";
}; };
responses: never; responses: never;
parameters: never; parameters: never;