Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
File size: 3,718 Bytes
ef22617 cd0e411 ef22617 cd0e411 ef22617 75aad1e 814f846 ef22617 814f846 ef22617 814f846 ef22617 6f310ff ef22617 6f310ff ef22617 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
import path from "node:path"
import { v4 as uuidv4 } from "uuid"
import tmpDir from "temp-dir"
import { ImageSegment, RenderedScene, RenderingJob, RenderRequest } from "../types.mts"
import { segmentImage } from "../utils/segmentImage.mts"
import { generateImageSDXLAsBase64 } from "../utils/generateImageSDXL.mts"
import { writeBase64ToFile } from "../utils/writeBase64ToFile.mts"
const pendingJobs: RenderingJob[] = []
export async function renderStaticScene(scene: RenderRequest): Promise<RenderedScene> {
let imageBase64 = ""
let error = ""
const width = 1024
const height = 512
const params = {
positivePrompt: scene.prompt,
seed: scene.seed || undefined,
nbSteps: scene.nbSteps || undefined,
width,
height
}
console.log(`calling generateImageSDXLAsBase64 with: `, JSON.stringify(params, null, 2))
try {
imageBase64 = await generateImageSDXLAsBase64(params)
console.log("successful generation!", imageBase64.slice(0, 30))
error = ""
if (!imageBase64?.length) {
throw new Error(`the generated image is empty`)
}
} catch (err) {
console.error(`failed to render.. but let's try again!`)
try {
imageBase64 = await generateImageSDXLAsBase64(params)
console.log("successful generation!", imageBase64.slice(0, 30))
error = ""
if (!imageBase64?.length) {
throw new Error(`the generated image is empty`)
}
} catch (err) {
console.error(`failed to generate the image, although ${err}`)
error = `failed to render scene: ${err}`
return {
assetUrl: imageBase64,
error,
maskBase64: "",
segments: []
} as RenderedScene
}
}
const actionnables = Array.isArray(scene.actionnables) ? scene.actionnables : []
let mask = ""
let segments: ImageSegment[] = []
if (actionnables.length > 0) {
console.log("we have some actionnables:", actionnables)
console.log("going to grab the first frame")
const tmpImageFilePath = path.join(tmpDir, `${uuidv4()}.png`)
// console.log("beginning:", imageBase64.slice(0, 100))
await writeBase64ToFile(imageBase64, tmpImageFilePath)
console.log("wrote the image to ", tmpImageFilePath)
if (!tmpImageFilePath) {
console.error("failed to get the image")
error = "failed to segment the image"
} else {
console.log("got the first frame! segmenting..")
try {
const result = await segmentImage(tmpImageFilePath, actionnables, width, height)
mask = result.pngInBase64
segments = result.segments
console.log(`it worked the first time! got ${segments.length} segments`)
} catch (err) {
console.log("this takes too long :/ trying another server..")
try {
const result = await segmentImage(tmpImageFilePath, actionnables, width, height)
mask = result.pngInBase64
segments = result.segments
console.log(`it worked the second time! got ${segments.length} segments`)
} catch (err) {
console.log("trying one last time, on a 3rd server..")
try {
const result = await segmentImage(tmpImageFilePath, actionnables, width, height)
mask = result.pngInBase64
segments = result.segments
console.log(`it worked the third time! got ${segments.length} segments`)
} catch (err) {
console.log("yeah, all servers are busy it seems.. aborting")
}
}
}
}
} else {
console.log("no actionnables: just returning the image, then")
}
error = ""
return {
assetUrl: imageBase64,
error,
maskBase64: mask,
segments
} as RenderedScene
}
|