Запуск обнаружения объектов с использованием Tensorflow. js - PullRequest
1 голос
/ 13 января 2020

Я работаю над обнаружением объектов с помощью Tensorflow. js. Я пытаюсь запустить пользовательскую модель тензор потока обнаружения js в браузере. Я смог преобразовать модель тензор потока в модель тензор потока. js модель (в Google Colab) с помощью следующей команды:

!tensorflowjs_converter \
--input_format=tf_frozen_model \
--output_node_names='detection_boxes,detection_scores,detection_classes,num_detections' \
/content/frozen_inference_graph.pb \
/content/web_model

Я делюсь фрагментом кода inference.html файл [Обновлено] :

image

Фрагмент кода индекса. js Файл выглядит следующим образом [Обновлено] :

let model;
let isPredicting = false;

async function init(){
        try {
            model = await tf.loadGraphModel('http://127.0.0.1:8887/uno_model/model.json');
        } catch (err) {
            console.log(err);
        }
}

async function predict() {
        console.log("executing model");
        const img = document.getElementById('img');

        tf_img = tf.browser.fromPixels(img);
        tf.print(tf_img)

        tf_img = tf_img.expandDims(0);

        console.log(tf_img.shape)  // Image dimension is  [1, 300, 300, 3]

         let output = await model.executeAsync(
        { 'image_tensor' : tf_img},
        [ 'detection_boxes','detection_scores','detection_classes','num_detections']);


        for (let i = 0; i < output.length; i++){
            console.log(output[i].dataSync())
        }

 }

init()


function startPredicting(){
    isPredicting = true;
    predict();
}

function stopPredicting(){
    isPredicting = false;
    predict();
}

Производит следующий вывод [Обновлено] : Output console view of browser

Я посмотрел на вышеприведенный вывод, но не смог получить ярлыки классов и т. Д. c. Как извлечь извещатели_объектов обнаружения, обнаружения и обнаружения? Эта модель корректно работает с кодом python.

[Обновлено] : Похоже, я получаю вывод после предоставления [1300,300,3] изображения в качестве входных данных для модели.

Не могли бы вы вести меня? Я что-то упустил?

Ответы [ 2 ]

1 голос
/ 14 января 2020

Хотя модель python не добавляется к вопросу, но извлеченные узлы модели, размер тензора и их тип обеспечивают понимание для определения Ивент_классы, детектирование_скоры и детектирование_объекты.

Первый тензор имеет размер 400 и соответствует detection_boxes. Оператор dataSyn c возвращает полностью выровненный массив. Размер 400 скорее всего соответствует форме [100, 4]. Это подтверждается формой других тензоров, которая обсуждается ниже. [100, 4] означает, что на входе есть 100 ограничивающих рамок - скорее всего, изображение. Конкретно, это означает, что первые четыре элемента соответствуют первому ограничивающему прямоугольнику, и так далее ...

Второй тензор соответствует detections_scores. Есть 100 баллов обнаружения для 100 ограничивающих рамок. Первый элемент этого массива соответствует первым четырем элементам первого массива (detection_boxes массив)

Третий массив соответствует detection_classes. Это массив из 100 целых чисел, где каждое значение является индексом совпадающей метки.

Четвертый массив соответствует num_detections. Он содержит сколько обнаружений: 100

Я посмотрел на вышеприведенный вывод, но не смог получить метки классов

Чтобы получить метку (строку) индекс, взятый из detection_classes, должен использоваться против json (словарь в python) или массива, который содержит все метки и их индексы.

Следует отметить, что для * Модель 1031 * возвращает тот же вывод, что и модель python, вся обработка, выполненная для изображения в python до подачи модели, должна быть скопирована в js.

0 голосов
/ 15 января 2020

Наконец, я смог выяснить проблему, и она была связана с размером входного кадра.

Модель SSD нуждается в форме [1,300,300,3] изображения / кадра в качестве входных данных. Я добавил это в свой код и получил решение. Используя следующую строку (в inference.html), мы можем подать (300,300,3) форму изображения в качестве входных данных для модели:

 <img id="img" src="257.jpg" width="300" height="300"/>

Используя следующие строки в index.js:

 tf_img = tf_img.expandDims(0);
 console.log(tf_img.shape)  // Image dimension is  [1, 300, 300, 3]

Мы получаем форму изображения [1,300,300,3], необходимую для SSD.

...