Ошибка в concat1D: ранг тензоров [23] должен совпадать с рангом остальных - PullRequest
0 голосов
/ 07 декабря 2018

Tensorflow 1.12.0

Я передал модель SSD_Mobilenet_V1_pnp (предварительно обученную COCO) с моим набором данных.

На фитоне работает - обнаружение объектов хорошо

Конвертировать в js.

В браузере работает с ошибкой:

tfjs@latest:2 Uncaught (in promise) Error: Error in concat1D: rank of tensors[23] must be the same as the rank of the rest (1)

    at assert (https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest:2:5660)

    at https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest:2:60833

    at Array.forEach (native)

    at assertParamsConsistent (https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest:2:60811)

    at concat_ (https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest:2:223560)

    at concat (https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest:2:68004)

    at executeOp$13 (https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest:2:800253)

    at executeOp$16 (https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest:2:804261)

    at p (https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest:2:811525)

    at e.processStack (https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest:2:811935)

Что я делаю не так?

1 Ответ

0 голосов
/ 19 декабря 2018

Я столкнулся с такой же проблемой в tfjs-node, и для этой ошибки может потребоваться, чтобы вы следовали https://github.com/tensorflow/tfjs-models/tree/master/coco-ssd#technical-details-for-advanced-users

Примечание: все примеры написаны на TypeScript, но их легко перевести на JavaScript.

Я подробно опишу 3 шага ниже

1.Удалите шаги постобработки

, которые вам понадобятся для удаления шагов постобработки из экспортированной модели

tensorflowjs_converter --input_format=tf_saved_model \
                   --output_node_names='Postprocessor/ExpandDims_1,Postprocessor/Slice' \
                   --saved_model_tags=serve \
                   ./saved_model \
                   ./web_model

Это должно устранить вашу ошибку rank of tensors[23] must be the same as the rank of the rest (1).

Но теперь вы этого не делаетеУ вас есть постобработка в вашей модели, поэтому вам нужно сделать это прямо в вашем коде JavaScript.

2.Используется один класс NonMaxSuppression

Идея состоит в том, чтобы оставить только «лучшие» ящики и выполнить эту фильтрацию в js

Во-первых, вам нужно найти maxScores, см. Пример кода здесь

Тогда вам нужно будет использовать NonMaxSuppression , чтобы удалить все не макс. Оценки.

См. пример кода и документация

3.Выполняет операции NonMaxSuppression на бэкэнде ЦП

Примеры вы найдете в здесь и здесь с использованием setBackend function

Примечание: вЧтобы освободить память, вам нужно будет tf.dispose и tf.Tensor.dispose тензоров перед сменой бэкэнда

...