|
import puppeteer from "puppeteer" |
|
|
|
import { sleep } from "./sleep.mts" |
|
import { ImageSegment } from "../types.mts" |
|
import { downloadImageAsBase64 } from "./downloadFileAsBase64.mts" |
|
import { resizeBase64Image } from "./resizeBase64Image.mts" |
|
|
|
|
|
const instances: string[] = [ |
|
`${process.env.VC_SEGMENTATION_MODULE_SPACE_API_URL_1 || ""}`, |
|
`${process.env.VC_SEGMENTATION_MODULE_SPACE_API_URL_2 || ""}`, |
|
|
|
] |
|
|
|
|
|
|
|
|
|
|
|
export async function segmentImage( |
|
inputImageFilePath: string, |
|
actionnables: string[], |
|
width: number, |
|
height: number, |
|
): Promise<{ |
|
pngInBase64: string |
|
segments: ImageSegment[] |
|
}> { |
|
|
|
console.log(`segmenting image..`) |
|
|
|
const instance = instances.shift() |
|
instances.push(instance) |
|
|
|
const browser = await puppeteer.launch({ |
|
headless: true, |
|
protocolTimeout: 40000, |
|
}) |
|
|
|
try { |
|
const page = await browser.newPage() |
|
await page.goto(instance, { waitUntil: 'networkidle2' }) |
|
|
|
await new Promise(r => setTimeout(r, 3000)) |
|
|
|
const fileField = await page.$('input[type="file"]') |
|
|
|
|
|
await fileField.uploadFile(inputImageFilePath) |
|
|
|
const firstTextarea = await page.$('textarea[data-testid="textbox"]') |
|
|
|
const conceptsToDetect = actionnables.join(" . ") |
|
await firstTextarea.type(conceptsToDetect) |
|
|
|
|
|
const submitButton = await page.$('button.lg') |
|
|
|
await sleep(300) |
|
|
|
|
|
await submitButton.click() |
|
|
|
await page.waitForSelector('img[data-testid="detailed-image"]', { |
|
timeout: 40000, |
|
}) |
|
|
|
const maskUrl = await page.$$eval('img[data-testid="detailed-image"]', el => el.map(x => x.getAttribute("src"))[0]) |
|
|
|
let segments: ImageSegment[] = [] |
|
|
|
try { |
|
segments = JSON.parse(await page.$$eval('textarea', el => el.map(x => x.value)[1])) |
|
} catch (err) { |
|
console.log(`failed to parse JSON: ${err}`) |
|
segments = [] |
|
} |
|
|
|
|
|
|
|
|
|
const rawPngInBase64 = await downloadImageAsBase64(maskUrl) |
|
|
|
const pngInBase64 = await resizeBase64Image(rawPngInBase64, width, height) |
|
|
|
return { |
|
pngInBase64, |
|
segments, |
|
} |
|
} catch (err) { |
|
throw err |
|
} finally { |
|
await browser.close() |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|