You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

126 lines
4.1 KiB
JavaScript

//get folders of images to use as classes
const glob = require('glob');
const library = require('image-classifier');
const fs = require('fs');
// const
const path = require('path')
const cliProgress = require('cli-progress');
const multer = require('multer');
const express = require('express');
const tesseract = require('node-tesseract');
const app = express();
const upload = multer({
dest: './temp',
})
app.post('/classify', upload.single("file"), (req, res) => {
const tempPath = req.file.path;
console.log(tempPath);
classifier.predict(tempPath).then(async (result) => {
const readable = ['VIN', 'Data Plates', 'Dash Number', 'Door Tag'];
if(readable.includes(result.label)){
tesseract.process(path.resolve(__dirname, tempPath),{}, async (err, text) => {
result.processedText = text;
if(err) {
console.error('Error:', err);
}
await fs.unlink(tempPath, (err) =>{ if(err) console.error('Unlink Error:', err)});
res.status(200).json(result);
})
} else {
console.log('Not readable, continuing');
await fs.unlink(tempPath, (err) =>{ if(err) console.error('Unlink Error:', err)});
res.status(200).json(result);
}
// tesseract.process(tempPath, function(err, text) => {
// console.log()
// })
})
// res.status(200).json({message: 'Success'})
})
app.listen(2666);
var shouldRebuildModel = false;
process.argv.forEach((val, index, array) => {
console.log(val)
if(val === '--rebuild'){
shouldRebuildModel = true;
}
})
function getClass(file) {
return path.dirname(file).split('/').pop();
}
function pGlob(pattern) {
return new Promise((resolve, reject) => {
glob(pattern, (error, matches) => {
if(error) return reject(error);
resolve(matches);
})
})
}
var classifier;
async function runAsync() {
if(shouldRebuildModel) {
classifier = await library.create();
const matches = await pGlob('training images/**/*');
const startTime = new Date().getTime();
console.log(`Building model with ${matches.length} training items...`)
const rebuildBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_grey);
rebuildBar.start(matches.length);
await Promise.all(matches.map(file => {
if(fs.lstatSync(file).isDirectory()) {
rebuildBar.increment();
return Promise.resolve();
}
const classA = getClass(file);
return classifier.addExample(classA, file).then(() => rebuildBar.increment())
})).catch(error => {
console.error(error);
});
rebuildBar.stop();
console.log('all examples loaded...');
console.log('saving dataset...')
await classifier.save('./export.json');
const now = new Date().getTime();
const elapsed = now - startTime;
console.log(`Time to build: ${elapsed / 1000}s`)
} else {
classifier = await library.load('./export.json');
}
// const matches = await pGlob('test images/**/*');
// const classifyBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_grey);
// classifyBar.start(matches.length);
// await Promise.all(matches.map(async file => {
// const baseFileName = path.parse(file).name;
// const extension = path.extname(file);
// const newClass= await classifier.predict(file);
// // console.log(newClass);
// return new Promise((resolve, reject) => {
// if(!fs.existsSync(path.resolve('sorted images', newClass.label))){
// fs.mkdirSync(path.resolve('sorted images', newClass.label));
// }
// fs.copyFile(file, path.resolve('sorted images', newClass.label, `${baseFileName}.${extension}`), () => {
// classifyBar.increment();
// resolve()
// });
// })
// }))
// classifyBar.stop();
}
runAsync();