Shinobi/plugins/deepstack-object/shinobi-deepstack-object.js

172 lines
4.0 KiB
JavaScript

//
// Shinobi - Tensorflow Plugin
// Copyright (C) 2016-2025 Elad Bar, Moe Alam
//
// Base Init >>
var fs = require('fs');
var config = require('./conf.json')
const request = require("request")
var s
const {
workerData
} = require('worker_threads');
if(workerData && workerData.ok === true){
try{
s = require('../pluginWorkerBase.js')(__dirname,config)
}catch(err){
console.log(err)
try{
s = require('./pluginWorkerBase.js')(__dirname,config)
}catch(err){
console.log(err)
return console.log(config.plug,'WORKER : Plugin start has failed. pluginBase.js was not found.')
}
}
}else{
try{
s = require('../pluginBase.js')(__dirname,config)
}catch(err){
console.log(err)
try{
s = require('./pluginBase.js')(__dirname,config)
}catch(err){
console.log(err)
return console.log(config.plug,'Plugin start has failed. pluginBase.js was not found.')
}
}
const {
haltMessage,
checkStartTime,
setStartTime,
} = require('../pluginCheck.js')
if(!checkStartTime()){
console.log(haltMessage,new Date())
s.disconnectWebSocket()
return
}
setStartTime()
}
// Base Init />>
var deepStackHost = config.deepStack["host"]
var deepStackPort = config.deepStack["port"]
var deepStackIsSSL = config.deepStack["isSSL"]
var deepStackApiKey = config.deepStack["apiKey"]
var deepStackProtocol = deepStackIsSSL ? "https" : "http"
var baseUrl = `${deepStackProtocol}://${deepStackHost}:${deepStackPort}/v1`
var objectDetectionUrl = `${baseUrl}/vision/detection`
s.detectObject = function(buffer,d,tx,frameLocation,callback){
var timeStart = new Date()
var detectStuff = async function(frame){
try{
image_stream = fs.createReadStream(frame)
const form = {
"image":image_stream
}
if(deepStackApiKey) {
form["api_key"] = deepStackApiKey
}
request.post({url:objectDetectionUrl, formData:form}, function(err,res,body){
const responseDate = new Date()
const responseTime = (responseDate.getTime() - timeStart.getTime());
const response = JSON.parse(body)
const success = response["success"]
const predictions = response["predictions"]
const mats = []
const detected = []
if(success) {
predictions.forEach(function(v){
const label = v["label"]
const confidence = v["confidence"]
const y_min = v["y_min"]
const x_min = v["x_min"]
const y_max = v["y_max"]
const x_max = v["x_max"]
const width = x_max - x_min
const height = y_max - y_min
detected.push(`${label}: ${confidence}`)
mats.push({
x: x_min,
y: y_min,
width: width,
height: height,
tag: label,
confidence: confidence,
})
})
}
if(detected.length > 0) {
detectedStr = detected.join(",")
}
const isObjectDetectionSeparate = d.mon.detector_pam === '1' && d.mon.detector_use_detect_object === '1'
const width = parseFloat(isObjectDetectionSeparate && d.mon.detector_scale_y_object ? d.mon.detector_scale_y_object : d.mon.detector_scale_y)
const height = parseFloat(isObjectDetectionSeparate && d.mon.detector_scale_x_object ? d.mon.detector_scale_x_object : d.mon.detector_scale_x)
tx({
f:'trigger',
id:d.id,
ke:d.ke,
details:{
plug:config.plug,
name: `DeepStack-Object`,
reason:'object',
matrices:mats,
imgHeight:width,
imgWidth:height,
time: responseTime
}
})
})
}catch(err){
console.log(err)
}
callback()
}
if(frameLocation){
detectStuff(frameLocation)
}else{
d.tmpFile=s.gid(5)+'.jpg'
if(!fs.existsSync(s.dir.streams)){
fs.mkdirSync(s.dir.streams);
}
d.dir=s.dir.streams+d.ke+'/'
if(!fs.existsSync(d.dir)){
fs.mkdirSync(d.dir);
}
d.dir=s.dir.streams+d.ke+'/'+d.id+'/'
if(!fs.existsSync(d.dir)){
fs.mkdirSync(d.dir);
}
fs.writeFile(d.dir+d.tmpFile,buffer,function(err){
if(err) return s.systemLog(err);
try{
detectStuff(d.dir+d.tmpFile)
}catch(error){
console.error('Catch: ' + error);
}
})
}
}