Ошибки Tensorflow JS при обнаружении объектов на изображении с помощью браузера

#tensorflow #tensorflow.js #object-detection-api

#tensorflow #tensorflow.js #object-detection-api

Вопрос:

Я пытаюсь обнаружить объекты на изображении с помощью tensorflow js.

Я следовал руководству по обнаружению объектов Tensorflow с помощью Tensorflow 2: создание пользовательской модели

Итак, в Google collab все работает нормально, и обнаружение объектов работает нормально.

Я получаю saved_model, который теперь я хотел бы использовать в браузере.

Поэтому я конвертирую модель с помощью

 tensorflowjs_converter  --input_format=tf_saved_model --output_format=tfjs_graph_model --signature_name=serving_default --saved_model_tags=serve /content/inference_graph/saved_model /mobilenet/web_model 
  

а затем я загружаю то же самое.

Сейчас я пытаюсь использовать это в браузере, используя следующий html

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"> </script>
    <style>
        .container {
            display: flex;
            flex-wrap: wrap;
        }
    </style>
</head>
<body>

    <div class="container">
        <div>
            <img id="test1" src="test/IMG_20181228_102636.jpg" width="300" height="300" />
            <div id="test1_pred">WORKING</div>        
        </div>
        
    </div>

    <script>
        async function predict() {
            const model = await tf.loadGraphModel('http://localhost:8000/mobilenet/web_model/model.json');
            const img = document.getElementById('test1');
            const tfImg = tf.browser.fromPixels(img);
            const smalImg = tf.image.resizeBilinear(tfImg, [300, 300]);
            const resized = tf.cast(smalImg, 'int32');
            const t4d = tf.tensor4d(Array.from(smalImg.dataSync()),[1,300,300,3]);
            let predictions = await model.executeAsync(tf.cast(t4d, "int32"));
            console.log(predictions);
        }

        setTimeout(function() {
            predict();
        }, 1000);
    </script>

</body>
</html>
  

Ошибка, которую я получаю на консоли

 tfjs:17 Uncaught (in promise) Error: Error in matMul: inputs must have the same rank of at least 2, got ranks 5 and 2.
    at xv (tfjs:17)
    at matMul_ (tfjs:17)
    at matMul__op (tfjs:17)
    at tfjs:17
    at tfjs:17
    at tfjs:17
    at t.e.scopedRun (tfjs:17)
    at t.e.tidy (tfjs:17)
    at $b (tfjs:17)
    at tfjs:17
  

Я не понимаю, в чем здесь ошибка. Похоже, что это связано с рангами в матрицах, но не уверен, что вызывает несоответствие.

Как мне изменить размер моих изображений, чтобы это было приемлемо для модели?

Я также публикую свою модель в gist здесь model.json

Любая помощь будет оценена

Комментарии:

1. Почему вы разыгрываете его, а затем преобразуете в тензор 4D? Какова размерность const smalImg и размерность входного слоя модели?

2. Не могли бы вы добавить резюме вашей модели к вопросу?