burn/examples/image-classification-web/index.js

152 lines
4.3 KiB
JavaScript

/**
*
* This demo is part of Burn project: https://github.com/tracel-ai/burn
*
* Released under a dual license:
* https://github.com/tracel-ai/burn/blob/main/LICENSE-MIT
* https://github.com/tracel-ai/burn/blob/main/LICENSE-APACHE
*
*/
/**
* Looks up element by an id.
* @param {string} - Element id.
*/
function $(id) {
return document.getElementById(id);
}
/**
* Truncates number to a given decimal position
* @param {number} num - Number to truncate.
* @param {number} fixed - Decimal positions.
* src: https://stackoverflow.com/a/11818658
*/
function toFixed(num, fixed) {
const re = new RegExp('^-?\\d+(?:\.\\d{0,' + (fixed || -1) + '})?');
return num.toString().match(re)[0];
}
/**
* Helper function that builds a chart using Chart.js library.
* @param {object} chartEl - Chart canvas element.
*
* NOTE: Assumes chart.js is loaded into the global.
*/
function chartConfigBuilder(chartEl) {
Chart.register(ChartDataLabels);
return new Chart(chartEl, {
plugins: [ChartDataLabels],
type: "bar",
data: {
labels: ["", "", "", "", "",],
datasets: [
{
data: [0.0, 0.0, 0.0, 0.0, 0.0], // Added one more data point to make it 10
borderWidth: 0,
fill: true,
backgroundColor: "#247ABF",
axis: 'y',
},
],
},
options: {
responsive: false,
maintainAspectRatio: false,
animation: true,
plugins: {
legend: {
display: false,
},
tooltip: {
enabled: true,
},
datalabels: {
color: "white",
formatter: function (value, context) {
return toFixed(value, 2);
},
},
},
indexAxis: 'y',
scales: {
y: {
},
x: {
suggestedMin: 0.0,
suggestedMax: 1.0,
beginAtZero: true,
},
},
},
});
}
/** Helper function that extracts labels and probabilities from the data.
* @param {object} data - Data object.
* @returns {object} - Object with labels and probabilities.
*/
function extractLabelsAndProbabilities(data) {
const labels = [];
const probabilities = [];
for (let item of data) {
if (item.hasOwnProperty('label') && item.hasOwnProperty('probability')) {
labels.push(item.label);
probabilities.push(item.probability);
}
}
return {
labels,
probabilities
};
}
/**
* Helper function that extracts RGB values from a canvas.
* @param {object} canvas - Canvas element.
* @param {object} ctx - Canvas context.
* @returns {object} - Flattened array of RGB values.
*/
function extractRGBValuesFromCanvas(canvas, ctx) {
// Get image data from the canvas
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
// Get canvas dimensions
const height = canvas.height;
const width = canvas.width;
// Create a flattened array to hold the RGB values in channel-first order
const flattenedArray = new Float32Array(3 * height * width);
// Initialize indices for R, G, B channels in the flattened array
let kR = 0,
kG = height * width,
kB = 2 * height * width;
for (let y = 0; y < height; y++) {
for (let x = 0; x < width; x++) {
// Compute the index for the image data array
const index = (y * width + x) * 4;
// Fill in the R, G, B channels in the flattened array
flattenedArray[kR++] = imageData.data[index] / 255.0; // Red
flattenedArray[kG++] = imageData.data[index + 1] / 255.0; // Green
flattenedArray[kB++] = imageData.data[index + 2] / 255.0; // Blue
}
}
return flattenedArray;
}
/** Detect if browser is safari
* @returns {boolean} - True if browser is safari.
*/
function isSafari() {
// https://stackoverflow.com/questions/7944460/detect-safari-browser
let isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
return isSafari;
}