mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
upscale graph built, no multidiffusion yet
This commit is contained in:
parent
5a1ed99ca1
commit
ea449f5a0a
@ -52,6 +52,7 @@ import { addWorkflowLoadRequestedListener } from 'app/store/middleware/listenerM
|
|||||||
import type { AppDispatch, RootState } from 'app/store/store';
|
import type { AppDispatch, RootState } from 'app/store/store';
|
||||||
|
|
||||||
import { addArchivedOrDeletedBoardListener } from './listeners/addArchivedOrDeletedBoardListener';
|
import { addArchivedOrDeletedBoardListener } from './listeners/addArchivedOrDeletedBoardListener';
|
||||||
|
import { addEnqueueRequestedUpscale } from './listeners/enqueueRequestedUpscale';
|
||||||
|
|
||||||
export const listenerMiddleware = createListenerMiddleware();
|
export const listenerMiddleware = createListenerMiddleware();
|
||||||
|
|
||||||
@ -85,6 +86,7 @@ addGalleryOffsetChangedListener(startAppListening);
|
|||||||
addEnqueueRequestedCanvasListener(startAppListening);
|
addEnqueueRequestedCanvasListener(startAppListening);
|
||||||
addEnqueueRequestedNodes(startAppListening);
|
addEnqueueRequestedNodes(startAppListening);
|
||||||
addEnqueueRequestedLinear(startAppListening);
|
addEnqueueRequestedLinear(startAppListening);
|
||||||
|
addEnqueueRequestedUpscale(startAppListening)
|
||||||
addAnyEnqueuedListener(startAppListening);
|
addAnyEnqueuedListener(startAppListening);
|
||||||
addBatchEnqueuedListener(startAppListening);
|
addBatchEnqueuedListener(startAppListening);
|
||||||
|
|
||||||
|
@ -0,0 +1,53 @@
|
|||||||
|
import { enqueueRequested } from 'app/store/actions';
|
||||||
|
import type { AppStartListening } from 'app/store/middleware/listenerMiddleware';
|
||||||
|
import { isImageViewerOpenChanged } from 'features/gallery/store/gallerySlice';
|
||||||
|
import { prepareLinearUIBatch } from 'features/nodes/util/graph/buildLinearBatchConfig';
|
||||||
|
import { queueApi } from 'services/api/endpoints/queue';
|
||||||
|
import { createIsAllowedToUpscaleSelector } from '../../../../../features/parameters/hooks/useIsAllowedToUpscale';
|
||||||
|
import { toast } from '../../../../../features/toast/toast';
|
||||||
|
import { t } from 'i18next';
|
||||||
|
import { logger } from '../../../../logging/logger';
|
||||||
|
import { useAppSelector } from '../../../storeHooks';
|
||||||
|
import { buildMultidiffusionUpscsaleGraph } from '../../../../../features/nodes/util/graph/buildMultidiffusionUpscaleGraph';
|
||||||
|
|
||||||
|
export const addEnqueueRequestedUpscale = (startAppListening: AppStartListening) => {
|
||||||
|
startAppListening({
|
||||||
|
predicate: (action): action is ReturnType<typeof enqueueRequested> =>
|
||||||
|
enqueueRequested.match(action) && action.payload.tabName === 'upscaling',
|
||||||
|
effect: async (action, { getState, dispatch }) => {
|
||||||
|
console.log("in listener")
|
||||||
|
const log = logger('session');
|
||||||
|
|
||||||
|
const state = getState();
|
||||||
|
const { shouldShowProgressInViewer } = state.ui;
|
||||||
|
const model = state.generation.model;
|
||||||
|
const { prepend } = action.payload;
|
||||||
|
|
||||||
|
|
||||||
|
const graph = await buildMultidiffusionUpscsaleGraph(state)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// const batchConfig = prepareLinearUIBatch(state, graph, prepend);
|
||||||
|
|
||||||
|
const req = dispatch(
|
||||||
|
queueApi.endpoints.enqueueBatch.initiate({
|
||||||
|
batch: {
|
||||||
|
graph,
|
||||||
|
runs: 1,
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
fixedCacheKey: 'enqueueBatch',
|
||||||
|
})
|
||||||
|
);
|
||||||
|
try {
|
||||||
|
await req.unwrap();
|
||||||
|
if (shouldShowProgressInViewer) {
|
||||||
|
dispatch(isImageViewerOpenChanged(true));
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
req.reset();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
@ -0,0 +1,135 @@
|
|||||||
|
import { Graph, GraphType } from 'features/nodes/util/graph/generation/Graph';
|
||||||
|
import { RootState } from '../../../../app/store/store';
|
||||||
|
import { assert } from 'tsafe';
|
||||||
|
import { ControlNetModelConfig, Invocation, NonNullableGraph } from '../../../../services/api/types';
|
||||||
|
import { ESRGAN, NEGATIVE_CONDITIONING, POSITIVE_CONDITIONING } from './constants';
|
||||||
|
import { isParamESRGANModelName } from '../../../parameters/store/postprocessingSlice';
|
||||||
|
import { ControlNetConfig } from '../../../controlAdapters/store/types';
|
||||||
|
import { MODEL_TYPES } from '../../types/constants';
|
||||||
|
|
||||||
|
|
||||||
|
export const buildMultidiffusionUpscsaleGraph = async (state: RootState): Promise<GraphType> => {
|
||||||
|
const {
|
||||||
|
model,
|
||||||
|
cfgScale: cfg_scale,
|
||||||
|
scheduler,
|
||||||
|
steps,
|
||||||
|
vaePrecision,
|
||||||
|
seed,
|
||||||
|
vae,
|
||||||
|
} = state.generation;
|
||||||
|
const { positivePrompt, negativePrompt } = state.controlLayers.present;
|
||||||
|
const { upscaleModel, upscaleInitialImage, sharpness, structure, creativity } = state.upscale;
|
||||||
|
|
||||||
|
assert(model, 'No model found in state');
|
||||||
|
assert(upscaleModel, 'No upscale model found in state');
|
||||||
|
assert(upscaleInitialImage, 'No initial image found in state');
|
||||||
|
|
||||||
|
if (!isParamESRGANModelName(upscaleModel.name)) {
|
||||||
|
throw new Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
const g = new Graph()
|
||||||
|
|
||||||
|
const unsharp_mask_1 = g.addNode({
|
||||||
|
id: 'unsharp_mask_1',
|
||||||
|
type: 'unsharp_mask',
|
||||||
|
image: upscaleInitialImage,
|
||||||
|
radius: 2,
|
||||||
|
strength: ((sharpness + 10) * 3.75) + 25
|
||||||
|
})
|
||||||
|
|
||||||
|
const esrgan = g.addNode({
|
||||||
|
id: ESRGAN,
|
||||||
|
type: 'esrgan',
|
||||||
|
model_name: upscaleModel.name,
|
||||||
|
tile_size: 500
|
||||||
|
})
|
||||||
|
|
||||||
|
g.addEdge(unsharp_mask_1, 'image', esrgan, 'image')
|
||||||
|
|
||||||
|
const unsharp_mask_2 = g.addNode({
|
||||||
|
id: 'unsharp_mask_2',
|
||||||
|
type: 'unsharp_mask',
|
||||||
|
radius: 2,
|
||||||
|
strength: 50
|
||||||
|
})
|
||||||
|
|
||||||
|
g.addEdge(esrgan, 'image', unsharp_mask_2, 'image',)
|
||||||
|
|
||||||
|
const SCALE = 2
|
||||||
|
|
||||||
|
const resizeNode = g.addNode({
|
||||||
|
id: 'img_resize',
|
||||||
|
type: 'img_resize',
|
||||||
|
width: upscaleInitialImage.width * SCALE, // TODO: handle floats
|
||||||
|
height: upscaleInitialImage.height * SCALE, // TODO: handle floats
|
||||||
|
resample_mode: "lanczos"
|
||||||
|
})
|
||||||
|
|
||||||
|
g.addEdge(unsharp_mask_2, 'image', resizeNode, "image")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const sharpnessNode: Invocation<'unsharp_mask'> = { //before and after esrgan
|
||||||
|
id: 'unsharp_mask',
|
||||||
|
type: 'unsharp_mask',
|
||||||
|
image: upscaleInitialImage,
|
||||||
|
radius: 2,
|
||||||
|
strength: ((sharpness + 10) * 3.75) + 25
|
||||||
|
};
|
||||||
|
|
||||||
|
const creativityNode: Invocation<'tiled_multi_diffusion_denoise_latents'> = { //before and after esrgan
|
||||||
|
id: 'tiled_multi_diffusion_denoise_latents',
|
||||||
|
type: 'tiled_multi_diffusion_denoise_latents',
|
||||||
|
tile_height: 1024,
|
||||||
|
tile_width: 1024,
|
||||||
|
tile_overlap: 128,
|
||||||
|
steps,
|
||||||
|
cfg_scale,
|
||||||
|
scheduler,
|
||||||
|
denoising_start: (((creativity * -1) + 10) * 4.99) / 100,
|
||||||
|
denoising_end: 1
|
||||||
|
};
|
||||||
|
|
||||||
|
const controlnetModel = {
|
||||||
|
key: "placeholder",
|
||||||
|
hash: "placeholder",
|
||||||
|
type: "controlnet" as any,
|
||||||
|
name: "tile",
|
||||||
|
base: model.base
|
||||||
|
}
|
||||||
|
|
||||||
|
const controlnet: Invocation<"controlnet"> = {
|
||||||
|
id: "controlnet",
|
||||||
|
type: "controlnet",
|
||||||
|
control_model: controlnetModel,
|
||||||
|
control_mode: "balanced",
|
||||||
|
resize_mode: "just_resize",
|
||||||
|
control_weight: ((((structure + 10) * 0.025) + 0.3) * 0.013) + 0.35
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const noiseNode: Invocation<'noise'> = {
|
||||||
|
id: "noise",
|
||||||
|
type: "noise",
|
||||||
|
seed,
|
||||||
|
// width: resized output width
|
||||||
|
// height: resized output height
|
||||||
|
}
|
||||||
|
|
||||||
|
const posPrompt: Invocation<"compel"> = {
|
||||||
|
type: 'compel',
|
||||||
|
id: POSITIVE_CONDITIONING,
|
||||||
|
prompt: positivePrompt,
|
||||||
|
}
|
||||||
|
|
||||||
|
const negPrompt: Invocation<"compel"> = {
|
||||||
|
type: 'compel',
|
||||||
|
id: NEGATIVE_CONDITIONING,
|
||||||
|
prompt: negativePrompt,
|
||||||
|
}
|
||||||
|
|
||||||
|
return g.getGraph();
|
||||||
|
|
||||||
|
}
|
@ -9,12 +9,19 @@ interface UpscaleState {
|
|||||||
_version: 1;
|
_version: 1;
|
||||||
upscaleModel: ParameterSpandrelImageToImageModel | null;
|
upscaleModel: ParameterSpandrelImageToImageModel | null;
|
||||||
upscaleInitialImage: ImageDTO | null;
|
upscaleInitialImage: ImageDTO | null;
|
||||||
|
sharpness: number;
|
||||||
|
structure: number;
|
||||||
|
creativity: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
const initialUpscaleState: UpscaleState = {
|
const initialUpscaleState: UpscaleState = {
|
||||||
_version: 1,
|
_version: 1,
|
||||||
upscaleModel: null,
|
upscaleModel: null,
|
||||||
upscaleInitialImage: null,
|
upscaleInitialImage: null,
|
||||||
|
sharpness: 0,
|
||||||
|
structure: 0,
|
||||||
|
creativity: 0
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export const upscaleSlice = createSlice({
|
export const upscaleSlice = createSlice({
|
||||||
|
Loading…
x
Reference in New Issue
Block a user