in packages/cli/src/utils/post-predict.ts [25:60]
async function processObjectDetection(predictResult: DatasetPool.Types.ObjectDetection.PredictResult, opts: Options): Promise<void> {
if (predictResult.length !== opts.inputs.length) {
throw new TypeError('Size of predict result is not equal to inputs.');
}
for (let i = 0; i < opts.inputs.length; i++) {
let img: Jimp;
if (typeof opts.inputs[i] === 'string') {
img = await Jimp.read(opts.inputs[i] as string);
} else {
img = await Jimp.read(opts.inputs[i] as Buffer);
}
const font = await Jimp.loadFont(Jimp.FONT_SANS_16_BLACK);
predictResult[i].forEach((res: DatasetPool.Types.ObjectDetection.PredictObject) => {
const x = Math.round(res.box[0] < 0 ? 0 : res.box[0]);
const y = Math.round(res.box[1] < 0 ? 0 : res.box[1]);
const w = Math.round(res.box[0] < 0 ? res.box[2] - Math.abs(res.box[0]) : res.box[2]);
const h = Math.round(res.box[1] < 0 ? res.box[3] - Math.abs(res.box[1]) : res.box[3]);
// draw class name and score
img.print(font, x, y, `${res.category}:${res.score.toFixed(2)}`);
// draw box
for (let drawX = x; drawX <= x + w; ++drawX) {
img.setPixelColor(0xFF, drawX, y);
img.setPixelColor(0xFF, drawX, y + h);
}
for (let drawY = y; drawY <= y + h; ++drawY) {
img.setPixelColor(0xFF, x, drawY);
img.setPixelColor(0xFF, x + w, drawY);
}
});
await img.write(`${path.join(process.cwd(), `predict-result-${i}.png`)}`);
}
logger.success('Object detection result has been saved to:');
for (let i = 0; i < opts.inputs.length; ++i) {
logger.info(`predict-result-${i}.png`);
}
}