Сделать тензор потока быстрее на nodejs подаче? - PullRequest
0 голосов
/ 01 апреля 2020

Я создал код для обнаружения объектов на изображении с тензорным потоком js, но он действительно медленный. Для этого я установил npmjs пакетов:

@tensorflow/tfjs
@tensorflow-models/coco-ssd
@tensorflow-models/mobilenet
get-image-data

И это мой сценарий:

const tf = require('@tensorflow/tfjs')
// Load the binding (CPU computation)
const mobilenet = require('@tensorflow-models/mobilenet');
const cocoSsd = require("@tensorflow-models/coco-ssd");
const events = require('events');
const post_event = new events.EventEmitter();
const start = Date.now()
// for getting the data images
const image = require('get-image-data')

image('./img/cup.jpg',async(err, image)=>{
    const numChannels = 3;
    const numPixels = image.width * image.height;
    const values = new Int32Array(numPixels * numChannels);
    pixels = image.data
    for(let i = 0; i < numPixels; i++) {
        for (let channel = 0; channel < numChannels; ++channel) {
            values[i * numChannels + channel] = pixels[i * 4 + channel];
        }
    }
    const outShape = [image.height, image.width, numChannels];
    const input = tf.tensor3d(values, outShape, 'int32');
    await load(input)
});

const load=async img=>{
    console.log("IMG LOADED in ", (Date.now()-start)/1000,"s")
    let mobilenet_ = cocossd_ = false, post_predictions = []; 

    mobilenet.load().then(async model=>{
        console.log("mobilenet loaded in ",(Date.now()-start)/1000,"s")
        model.classify(img).then(async classify_predictions=>{
            for(i=0;i<classify_predictions.length;i++){
                const element = classify_predictions[i];
                const each_class = element["className"].split(", ")
                each_class.forEach(this_element=>{
                    post_predictions.push([this_element, (element.probability*100)]);
                })
            }
            post_event.emit("mobilenet")
        });        
    });

    cocoSsd.load().then(async model=>{
        console.log("cocossd loaded in ",(Date.now()-start)/1000,"s")
        model.detect(img).then(predictions=>{
            for(i=0;i<predictions.length;i++){
                const this_element = predictions[i];
                post_predictions.unshift([this_element.class, (this_element.score*100)]);
            }
            post_event.emit("cocossd")
        });
    })

    post_event.on("mobilenet", ()=>{
        console.log("mobilenet(longest) finished in ", (Date.now()-start)/1000,"s", post_predictions)
        mobilenet_=true
        if(mobilenet_ && cocossd_){
            post_event.emit("finish")
        }
    }).on("cocossd", ()=>{
        console.log("cocossd finished in ", (Date.now()-start)/1000,"s", post_predictions)
        cocossd_ = true
        if(mobilenet_ && cocossd_){
            post_event.emit("finish")
        }
    }).on("finish", ()=>{
        post_predictions.sort((a, b)=>{
            return b[1]-a[1];
        });
        console.log("Post in ", (Date.now()-start)/1000,"s", post_predictions)
    })
}

Это работает, но когда я его запускаю, это очень медленно, вот Результаты:

IMG LOADED in  0.486 s
cocossd loaded in  6.11 s
cocossd finished in  9.028 s [ [ 'cup', 95.68768739700317 ] ]
mobilenet loaded in  10.845 s
mobilenet(longest) finished in  12.795 s [
  [ 'cup', 95.68768739700317 ],
  [ 'cup', 69.30274367332458 ],
  [ 'espresso', 17.099112272262573 ],
  [ 'coffee mug', 13.384920358657837 ]
]
Post in  12.809 s [
  [ 'cup', 95.68768739700317 ],
  [ 'cup', 69.30274367332458 ],
  [ 'espresso', 17.099112272262573 ],
  [ 'coffee mug', 13.384920358657837 ]
]

Я смотрел несколько видео, и они говорят, что для версии nodejs mobil enet требуется 20 мс. Но в моем приложении это занимает 10 секунд. Может быть, я сделал что-то не так. Может кто-нибудь помочь мне решить эту проблему?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...