Tensorflow: [Вопрос и ошибка] Существует ли модель обнаружения, подобная SSD-Mobile-net, в tensorflow-lite?

Созданный на 26 дек. 2017  ·  141Комментарии  ·  Источник: tensorflow/tensorflow

ПРИВЕТ.

Разработка приложения для Android с использованием tensorflow-lite.

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/g3doc/models.md
Не найдена модель обнаружения.

Кроме того, я пытаюсь конвертировать SSD-Inceptionv2 с помощью tensorflow-lite-API. Но, похоже, есть проблема.

Команда


bazel run --config=opt --copt=-msse4.1 --copt=-msse4.2 \
  //tensorflow/contrib/lite/toco:toco -- \
  --input_file=/home/danshin/tensorflow_lite/lite_model/fire_incpetion_v2.pb \
  --output_file=/home/danshin/tensorflow_lite/lite_model/fire_inception_v2.lite \
  --input_format=TENSORFLOW_GRAPHDEF \
  --output_format=TFLITE \
  --inference_type=FLOAT \
  --input_shape=1,300,300,3 \
  --input_array=image_tensor \
  --output_array={detection_boxes,detection_scores,detection_classes,num_detections}

Код ошибки


2017-12-26 14:59:25.159220: I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] Before general graph transformations: 2029 operators, 3459 arrays (0 quantized)
2017-12-26 14:59:25.251633: F tensorflow/contrib/lite/toco/graph_transformations/resolve_tensorflow_switch.cc:95] Check failed: other_op->type == OperatorType::kTensorFlowMerge 

Файл fire_inception_v2 создан, но его размер равен нулю.
Что такое проблема?

также,
пожалуйста, дайте мне знать, как лучше всего развернуть пользовательскую модель для обнаружения объектов?

Кто-нибудь, помогите мне, пожалуйста!

Спасибо.

lite feature

Самый полезный комментарий

Он уже доступен на tensorflow/contrib/lite/examples/android ! Это более полный порт оригинальной демонстрации TF для Android (отсутствует только пример Stylize), и в дальнейшем он заменит другую демонстрацию в tensorflow/contrib/lite/java/demo.

Преобразованный плоский буфер TF Lite можно найти в файле mobilenet_ssd_tflite_v1.zip , а реализацию логического вывода Java — в файле TFLiteObjectDetectionAPIModel.java . Обратите внимание, что это отличается от оригинальной реализации TF тем, что блоки должны быть вручную декодированы в Java, а текстовый файл перед блоком должен быть упакован в активы приложения (я думаю, что файл, включенный в ZIP-файл модели выше, должен быть действителен для большинства графики).

Во время преобразования TOCO используется другой входной узел (препроцессор/подчиненный), а также разные выходные узлы (concat, concat_1). Это пропускает некоторые части, которые являются проблематичными для tflite, до тех пор, пока либо график не будет реструктурирован, либо TF Lite не достигнет четности TF.

Вот быстрые шаги для преобразования модели SSD MobileNet в формат tflite и создания демо для его использования:

# Download and extract SSD MobileNet model
wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2017_11_17.tar.gz
tar -xvf ssd_mobilenet_v1_coco_2017_11_17.tar.gz 
DETECT_PB=$PWD/ssd_mobilenet_v1_coco_2017_11_17/frozen_inference_graph.pb
STRIPPED_PB=$PWD/frozen_inference_graph_stripped.pb
DETECT_FB=$PWD/tensorflow/contrib/lite/examples/android/assets/mobilenet_ssd.tflite

# Strip out problematic nodes before even letting TOCO see the graphdef
bazel run -c opt tensorflow/python/tools/optimize_for_inference -- \
--input=$DETECT_PB  --output=$STRIPPED_PB --frozen_graph=True \
--input_names=Preprocessor/sub --output_names=concat,concat_1 \
--alsologtostderr

# Run TOCO conversion.
bazel run tensorflow/contrib/lite/toco:toco -- \
--input_file=$STRIPPED_PB --output_file=$DETECT_FB \
--input_format=TENSORFLOW_GRAPHDEF --output_format=TFLITE \
--input_shapes=1,300,300,3 --input_arrays=Preprocessor/sub \
--output_arrays=concat,concat_1 --inference_type=FLOAT --logtostderr

# Build and install the demo
bazel build -c opt --cxxopt='--std=c++11' //tensorflow/contrib/lite/examples/android:tflite_demo
adb install -r -f bazel-bin/tensorflow/contrib/lite/examples/android/tflite_demo.apk

Все 141 Комментарий

@aselle , не могли бы вы взглянуть на эту проблему? Спасибо.

В настоящее время мы работаем над преобразованием SSD для мобильных сетей (а затем и первоначальных ssd), но он содержит операции, которые не поддерживаются полностью. Я обновлю этот вопрос, как только мы это сделаем.

Отлично, я задал аналогичный вопрос здесь: https://github.com/tensorflow/tensorflow/issues/14731

Как долго вы думаете, пока вы не добавите поддержку ssd-mobilenet?

Спасибо,
Мартин Пеньяк

Член организации TensorFlow ответил после того, как была применена метка stat: awaiting tensorflower.

?

Назойливый уполномоченный: Прошло 14 дней без активности, и у этой проблемы есть уполномоченный. Пожалуйста, обновите метку и/или статус соответствующим образом.

Любые обновления?
Я тоже сталкиваюсь с похожей проблемой. Заранее спасибо.

@yucheeling

Не могли бы вы предложить какой-либо набор данных, например " ssd_mobilenet_v1_coco_2017_11_17.tar ", который можно использовать в розничном магазине для идентификации различной одежды, такой как футболки, джинсы и т. д.

@ rana3579 , задайте такой вопрос в stackoverflow. Быстрое обновление мобильного ssd. Это прогрессирует, и мы надеемся, что скоро у нас будет пример.

@rana3579 посмотрите мое видео, оно работает на movidius, nvidia gpus, а также на процессорах arm. Я не могу поделиться набором данных, но если вы являетесь частью компании, мы могли бы обсудить потенциальное сотрудничество: https://www.youtube.com/watch?v=3MinI9cCJrc

@aselle спасибо за обновление! Где искать уведомления об этом? Я хотел бы быть уведомлен, как только он выйдет, если это возможно. Спасибо, я ценю вашу тяжелую работу над этим!

@andrewharp работает над этим и будет обновлять приложение Java TF Mobile для использования tflite. Так что следите за этими изменениями в репозитории. Я пока оставлю этот вопрос открытым.

Это функционально внутри; должно быть что-то в течение следующей недели или двух.

@andrewharp это круто !! Это также относится к примеру с камерой iOS?
И каков размер веса и производительность?
Мобильная сеть по классификации TFLite крошечная, а производительность на iOS безупречна, поэтому я очень рад TFLite.

Некоторые другие уже преобразовали существующий SSD Mobilenet pb в модель coreml и написали недостающие выходные слои в Swift:
https://github.com/vonholst/SSDMobileNet_CoreML

Но это всего лишь 8-12 кадров в секунду на iPhone 7.

Привет,
Есть новости по этому поводу?

мне тоже интересно :)

У меня есть фиксация переноса демоверсии Android TF на tflite, которая в настоящее время находится на рассмотрении, и, надеюсь, она появится на github на этой неделе.

@madhavajay Это только для Android, но вы сможете адаптировать его для iOS. Единственное, что часть предварительной обработки (изменение размера/нормализация изображения) и постобработка (немаксимальное подавление и настройка по априорным размерам) выполняется на Java, поскольку tflite не полностью поддерживает все операторы, используемые MobileNet SSD. .

@andrewharp Это потрясающе. Не могли бы вы вкратце объяснить, почему эти операции в настоящее время недоступны в TF lite? Похоже, то же самое относится и к инструменту преобразования tfcoreml на обычном SSD. Не жалуюсь, просто спрашиваю из технического интереса, делают ли они что-то, что особенно сложно реализовать в мобильном стеке, или это просто низкий приоритет?

С нетерпением жду ваших грандиозных усилий по коду Android!!! Большое спасибо. Я знаю, что я не единственный, кто с нетерпением ждет этого!

@andrewharp и @aselle Любые новости о получении демонстрации для использования примера локализации объектов на основе SSD для TFLite?

Он уже доступен на tensorflow/contrib/lite/examples/android ! Это более полный порт оригинальной демонстрации TF для Android (отсутствует только пример Stylize), и в дальнейшем он заменит другую демонстрацию в tensorflow/contrib/lite/java/demo.

Преобразованный плоский буфер TF Lite можно найти в файле mobilenet_ssd_tflite_v1.zip , а реализацию логического вывода Java — в файле TFLiteObjectDetectionAPIModel.java . Обратите внимание, что это отличается от оригинальной реализации TF тем, что блоки должны быть вручную декодированы в Java, а текстовый файл перед блоком должен быть упакован в активы приложения (я думаю, что файл, включенный в ZIP-файл модели выше, должен быть действителен для большинства графики).

Во время преобразования TOCO используется другой входной узел (препроцессор/подчиненный), а также разные выходные узлы (concat, concat_1). Это пропускает некоторые части, которые являются проблематичными для tflite, до тех пор, пока либо график не будет реструктурирован, либо TF Lite не достигнет четности TF.

Вот быстрые шаги для преобразования модели SSD MobileNet в формат tflite и создания демо для его использования:

# Download and extract SSD MobileNet model
wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2017_11_17.tar.gz
tar -xvf ssd_mobilenet_v1_coco_2017_11_17.tar.gz 
DETECT_PB=$PWD/ssd_mobilenet_v1_coco_2017_11_17/frozen_inference_graph.pb
STRIPPED_PB=$PWD/frozen_inference_graph_stripped.pb
DETECT_FB=$PWD/tensorflow/contrib/lite/examples/android/assets/mobilenet_ssd.tflite

# Strip out problematic nodes before even letting TOCO see the graphdef
bazel run -c opt tensorflow/python/tools/optimize_for_inference -- \
--input=$DETECT_PB  --output=$STRIPPED_PB --frozen_graph=True \
--input_names=Preprocessor/sub --output_names=concat,concat_1 \
--alsologtostderr

# Run TOCO conversion.
bazel run tensorflow/contrib/lite/toco:toco -- \
--input_file=$STRIPPED_PB --output_file=$DETECT_FB \
--input_format=TENSORFLOW_GRAPHDEF --output_format=TFLITE \
--input_shapes=1,300,300,3 --input_arrays=Preprocessor/sub \
--output_arrays=concat,concat_1 --inference_type=FLOAT --logtostderr

# Build and install the demo
bazel build -c opt --cxxopt='--std=c++11' //tensorflow/contrib/lite/examples/android:tflite_demo
adb install -r -f bazel-bin/tensorflow/contrib/lite/examples/android/tflite_demo.apk

@andrewharp С Пасхой 🥚🍫 ты ЛЕГЕНДА! :) Посмотрим, смогу ли я запустить это.

Привет, а есть какая-нибудь квантовая версия?

Я получил его работу с инструкциями выше, но необходимо:

  • Android SDK 15 из-за моей версии bazel
  • Я также не могу открыть проект в Android Studio

@andrewharp это новая вещь Android Studio, к которой вы, ребята, направляетесь, которая использует bazel для создания проектов вместо Gradle, или просто отсутствуют некоторые настройки проекта на данный момент из-за короткого периода времени, чтобы заставить его работать?

С удовольствием предоставлю PR, если пойму, в чем проблема.

Кроме того, что касается производительности, мой LG G6 на Android 7 работает медленно.
Это потому, что NN API есть только на Android 8?

Кто-нибудь может протестировать его на Android 8?

Понятно, я думал, что инструкции только для конвертации. Я перестал читать после первой части предложения, говоря, что вот как вы конвертируете модель, лол.

Да, у меня есть Pixel xl, я полагаю, что в вашем телефоне нет оборудования, которое может ускорить вывод, или это оборудование не поддерживается программным обеспечением.

Я постараюсь и дам вам знать. Я предполагал, что смогу построить это с помощью Android Studio doh...

отправлено из моего Айфона

31 марта 2018 г., в 20:05, Мадхава Джей [email protected] написал:

Я получил его работу с инструкциями выше, но необходимо:

Android SDK 15 из-за моей версии bazel
Я также не могу открыть проект в Android Studio
@andrewharp это новая вещь Android Studio, к которой вы, ребята, направляетесь, которая использует bazel для создания проектов вместо Gradle, или просто отсутствуют некоторые настройки проекта на данный момент из-за короткого периода времени, чтобы заставить его работать?

С удовольствием предоставлю PR, если пойму, в чем проблема.

Кроме того, что касается производительности, мой LG G6 на Android 7 работает медленно.
Это потому, что NN API есть только на Android 8?

Кто-нибудь может протестировать его на Android 8?


Вы получаете это, потому что вы прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub или закройте ветку.

Да, я сделал то же самое и пошел прямо в код и Android-студию. Затем, после того, как вы пропинговали сегодня утром, я собирался ответить, что у меня та же проблема, а затем снова запустил RTFM. 🤣

Из того, что я могу сказать, LG G6 должен иметь возможность поддерживать NN API, поскольку он имеет SoC Qualcomm 821, такой же, как Pixel 1. Но, к сожалению, LG не выпустила Android 8 или 8.1, а последние сборки LineageOS выглядят немного схематично. так что я воздержусь, пока не узнаю, что он лучше работает на Android 8.1. Если бы вы могли запустить его на Pixel, это было бы здорово! 👍

Мне удалось протестировать это, но демо работает очень медленно... даже медленнее, чем оригинальная версия.
Я использую Pixel XL (первая версия) и ранее скомпилировал старую демонстрацию для 64-битной архитектуры, благодаря чему она работала почти в два раза быстрее даже без tfLite... время вывода в этом случае составляет около 450 мс. Когда я пробую эту демонстрацию, она работает около 850 мс, а иногда даже больше секунды. Я сделал что-то неправильно или просто был слишком оптимистичен, чтобы ожидать приличного ускорения? Спасибо.

@mpeniak Я получил те же скорости на LG G6, с включенной или выключенной отладкой (сначала подумал, что это отладка). Я подозреваю, что NNAPI не используется. Возможно, нам нужно сделать что-то особенное со сборкой nnapi_lib?
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/СТРОЙКА

Зависимость указана, но может потребоваться сборка для конкретной архитектуры?
Возможно что-то в ./configure
(кстати, я включил XLA в моем ./configure на случай, если это было связано, но это не изменило скорость)

@andrewharp
Я хочу использовать NNAPI, но не знаю, как им пользоваться.
Согласно документу, Neural Networks API доступен в Android 8.1 >
Если он 8.1 или выше, он в принципе применяется? или мне нужна дополнительная работа NDK? Ссылка на документ
Хорошего дня XD

@andrewharp , я попытался включить NNAPI для tflite_demo и запустить apk, однако обнаружил, что apk разбился
при вызове AddOpsAndParams операция tflite::BuiltinOperator_SQUEEZE не поддерживается и
nn_op_type установлен в -1, что приведет к вызову FATAL и exit(-1) . Я думаю, что это
основная причина. Не могли бы вы сказать, будет ли он поддерживаться в будущей версии? Есть ли другой способ работать
вокруг, чтобы проверить путь NNAPI? Благодарю.

@andrehentz
bazel run -c opt tensorflow/python/tools/optimize_for_inference -- \
--input=$DETECT_PB --output=$STRIPPED_PB --frozen_graph=Истина \
--input_names=препроцессор/подпрограмма --output_names=concat,concat_1 \
--alsologtostderr

Почему input_names не image_tensor?
Я попробовал этот способ и столкнулся с ошибкой.

@нанамаре
Вы должны использовать Frozen_inference_graph_stripped.pb вместо Frozen_inference_graph.pb.
попробуйте "bazel-bin/tensorflow/tools/graph_transforms/summarize_graph --in_graph=frozen_inference_graph_stripped.pb"
и вы можете увидеть следующий вывод:
Найдено 1 возможных входных данных: (name=Preprocessor/sub, type=float(1), shape=None)
Никаких переменных не обнаружено.
Найдено 2 возможных выхода: (name=concat, op=ConcatV2) (name=concat_1, op=ConcatV2)

Имя входа — Preprocessor/sub abd, имя вывода — concat.

@нанамаре
Последний облегченный код tensorflow включает интерфейс Java для включения NNAPI.

Интерпретатор класса имеет функцию с именем: setUseNNAPI (true);
Вы можете напрямую вызвать такой интерфейс.

@zhangbo0325
Я уже пробовал вызывать setUserNNAPI(true);, но эффекта не было.
Это был почти аналогичный вывод без использования NNAPI.
Спецификация андроида: версия 8.1.

@nanamare , у тебя работает ssd-mobilenet? Для такой сети существует операция SQUEEZE, которая не поддерживается Android NNAPI. Я задал вопрос выше. Для mobilenet-v1 все в порядке.

<strong i="5">@andrewharp</strong>  Hi, andrewharp. i just followed your quick steps for converting an SSD MobileNet model to tflite format, and then i tried to  build the demo to use it. But something accurred in apk.
for the tflite from mobilenet_ssd_tflite_v1.zip, everything is ok! i can use mobile to detecter things.
And then i tried to use pet data to fine tune the model from the checkpoint in mobilenet_ssd_tflite_v1.zip. this process is also ok. i check the generated frozen_inference_graph.pb with the object_detection_tutorial.ipynb(https://github.com/tensorflow/models/blob/master/research/object_detection/object_detection_tutorial.ipynb). the result shown this pb can used to object detection. And then i followed the script to convert frozen pb to tflite. Then build demo with tflite, unfortunately something wrong ocurred. Then log is written below. 
It seems the Shape of output target [1, 1917, 4] does not match with the shape of the Tensor [1, 1917, 1, 4]. Because i am new to use object detection api, i donot know how to deal with the problem. 
Hope you can point out some solutions, Thx!

Мобильный журнал здесь:
04-04 19:46:36.099 28864-28882/org.tensorflow.lite.demo E/AndroidRuntime: НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: процесс вывода: org.tensorflow.lite.demo, PID: 28864 java.lang.IllegalArgumentException: форма цели вывода [1, 1917, 4] не совпадает с формой тензора [1, 1917, 1, 4]. в org.tensorflow.lite.Tensor.copyTo(Tensor.java:44) в org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:139) в org.tensorflow.demo.TFLiteObjectDetectionAPIModel.recognizeImage(TFLiteObjectDetectionAPIModel.java:226) ) в org.tensorflow.demo.DetectorActivity$3.run(DetectorActivity.java:248) в android.os.Handler.handleCallback(Handler.java:761) в android.os.Handler.dispatchMessage(Handler.java:98) в android.os.Looper.loop(Looper.java:156) в android.os.HandlerThread.run(HandlerThread.java:61)

Удивительно! Попытка заставить это работать на iOS. Как мне разобрать вывод Tensor?

interpreter->Invoke();
float* output = interpreter->typed_output_tensor<float>(0);

Интерфейс DetectorActivity застрял в моем проекте, вы существуете, как мне это решить?

@ zhangbo0325 Спасибо за подробности. Поскольку сжатие не поддерживается NNAPI, означает ли это, что NNAPI вообще не используется и вывод будет оставаться таким же медленным? Как я уже упоминал в предыдущем комментарии, у меня очень низкая производительность на Pixel XL. Я бы ожидал, что время вывода где-то около 80-120 мс. Спасибо!

@mpeniak , я задал тот же вопрос Эндрю Харпу. Я только что запустил ssd-mobilenet с помощью реализации процессора tensorflow-lite и также получил низкую производительность.

Выступление TensorFlow Lite на Dev Summit 2018 показало трехкратное увеличение производительности в MobileNet:
https://youtu.be/FAMfy7izB6A?t=530

Может это не для SSD?
Возможно, сначала требуется квантование веса?

Я пробовал mobilnet, и он намного быстрее, но это не относится к mobilnet-ssd...

Грустная панда ☹️🐼
@andrewharp Есть идеи, когда будет доступна производительная реализация SSD? Это вопрос квантования веса?

Я также получил низкую производительность для ssd-mobilenet на TensorFlowLite :(
Но у меня есть другой вопрос. Почему оценка результата больше 1? Разве это не вероятность?

@ a1103304122 a1103304122 насколько я понимаю, оценка выводится узлом "concat" перед softmax, так что это не вероятность.

Во время преобразования TOCO используется другой входной узел (препроцессор/подчиненный), а также разные выходные узлы (concat, concat_1). Это пропускает некоторые части, которые являются проблематичными для tflite, до тех пор, пока либо график не будет реструктурирован, либо TF Lite не достигнет четности TF.

Кто-нибудь знает, почему TFlite медленнее, чем TFmobile в этой модели?

@andrewharp , можно ли прокомментировать производительность SSD TF Lite? Также возможно ли/приближается квантование? Я знаю, что вы, ребята, усердно работаете, чтобы все это произошло, но было бы неплохо узнать, является ли это просто краткосрочной икотой или есть решение, которое мы можем применить. 😄

@andrewharp Спасибо за отличную публикацию. Однако у меня есть один вопрос к вашим действиям.

Удалите проблемные узлы еще до того, как TOCO увидит graphdef.

bazel run -c opt tensorflow/python/tools/optimize_for_inference -- \
--input=$DETECT_PB --output=$STRIPPED_PB --frozen_graph=Истина \
--input_names=препроцессор/подпрограмма --output_names=concat,concat_1 \
--alsologtostderr

Если я не ошибаюсь, здесь вы хотите создать STRIPPED_PB, верно? Если это так, то в настоящее время входным файлом нашего входного файла должен быть image_tensor. Итак, я не очень понимаю, почему мы используем Preprocessor/sub. Не могли бы вы объяснить более подробно?

Во-вторых, здесь мы используем optim_for_inference, можем ли мы использовать инструмент transform_graph? потому что новая документация по тензорному потоку рекомендует transform_graph вместо optimize_for_inference.

@mpeniak как ты это делаешь? Расскажите, пожалуйста, некоторые подробности.

org.tensorflow.lite.demo E/AndroidRuntime: НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: процесс вывода: org.tensorflow.lite.demo, PID: 28864 java.lang.IllegalArgumentException: форма цели вывода [1, 1917, 4] не соответствует форма тензора [1, 1917, 1, 4].

@Haijunlv Вы решили проблему? Можете ли вы поделиться решением?

После импорта новой демоверсии TF Lite для Android я получаю Error:Plugin with id 'com.android.application' not found. на OS X.

та же проблема, что и у @csmith105 ! Мне удалось собрать и установить демоверсию с помощью bazel, но я не могу скомпилировать или запустить проект в Android Studio... какое-нибудь решение этой проблемы?

@ Eddy-zheng Если вы увидели узел «concat» на замороженном графике, вы обнаружите, что операция сжатия выполняется после операции объединения. Я думаю, что именно поэтому форма несовместима. Я не тестировал скорость сжатия оп. Но я думаю, что есть два пути решения проблемы.

  1. изменить порядок сжатия и объединения op. В ssd_meta_arch.py ​​немного измените "box_encodings = tf.squeeze(tf.concat(prediction_dict['box_encodings'], axis=1), axis=2)"
  2. непосредственно убейте фигуру 1 на оси 2. В box_predictor.py немного измените " box_encodings =tf.reshape(
    box_encodings, tf.stack([combined_feature_map_shape[0],
    комбинированная_фигурная_карта_форма[1] *
    комбинированная_фигурная_карта_форма[2] *
    num_predictions_per_location,
    1, self._box_code_size]))"

На самом деле я не понимаю, почему нужно изменить форму тензора с дополнительной формой «1». Может быть, это лишнее
соч.
Я пробовал способ 1 и успешно запускал модель на мобильном телефоне. Но все же немного медленно. позже я попробую способ 2, чтобы увидеть, может ли он получить лучшую скорость

@Haijunlv Насколько хороши обнаружения? Облегченная модель из демонстрации @andrewharp просто удаляет все узлы предварительной и последующей обработки (их тысячи) из графа и заменяет их несколькими строками кода. Я не уверен, как это будет работать..

Я думаю, что есть решение проблемы Android Studio и Gradle. (пожалуйста, поправьте меня, если я ошибаюсь или есть лучшее решение):

  • Это не лучший подход, но есть плагин Bazel, который мы можем установить внутри Android Studio, чтобы «заменить» Gradle, и мы можем создавать и запускать наш проект с помощью Bazel через AS.

  • Я прочитал несколько статей о Bazel и наткнулся на этот вопрос в Quora.. и, согласно ответу, тензорный поток продолжит использовать Bazel, поскольку он лучше использует фреймворк и дает лучшие результаты.. поэтому я думаю, что разработчики в этом конкретном случае должны адаптироваться к нему и оставьте Gradle до тех пор, пока tensorflow не поддержит его полностью.

@davidfant
Удалось ли вам получить несколько выходных данных в TensorFlow Lite C++?

interpreter->Invoke();
???? output = interpreter->typed_output_tensor<?????>(0);

Я прогрессирую, но все еще не знаю, как получить результаты на С++. Есть ли документация по этому поводу? Это то, что у меня есть на данный момент. Как мне получить доступ к массиву данных, чтобы получить баллы?

(fill inputs)
.......
intepreter->Invoke();
const std::vector<int>& results = interpreter->outputs();
TfLiteTensor* outputLocations = interpreter->tensor(results[0]);
TfLiteTensor* outputClasses   = interpreter->tensor(results[1]);
float *data = tflite::GetTensorData<float>(outputClasses);
for(int i=0;i<NUM_RESULTS;i++)
{
   for(int j=1;j<NUM_CLASSES;j++)
   {
      float score = expit(data[i*NUM_CLASSES+j]); // ¿?
    }
}

@JaviBonilla Я сделал нечто подобное и обнаружил, что это не работает. Используя отсечку из демонстрационного приложения для Android, он просто выводит слишком много шума. Если вы используете tensorboard для чтения графика, вы обнаружите, что облегченная модель сокращает тысячи узлов постобработки. Не думаю, что нынешний способ сработает. Я надеюсь, что tensorflow lite будет поддерживать эти узлы постобработки в будущем, вместо того, чтобы просить людей делать такие неработающие хаки.

Спасибо @YijinLiu. Я видел ваш репозиторий tf-cpu, я посмотрю ваш код, чтобы убедиться, что моя реализация верна, и увижу результаты, даже если они не очень хорошие.

@JaviBonilla, пожалуйста, дайте нам знать, когда вы разберетесь, как работать с C++! 🙌

Привет @davidfant ,

Мне еще нужно это проверить, но @YijinLiu уже разобрался!

Посмотрите его репозиторий (https://github.com/YijinLiu/tf-cpu). В частности, вы можете найти, как получить выходные данные в файле AnnotateMat() tf-cpu/benchmark/obj_detect_lite.cc функция AnnotateMat(), которая выполняется после Interpreter->Invoke() .

@JaviBonilla Я не закончил obj_detect_lite.cc, специально для того, чтобы использовать априорные коды для декодирования полей обнаружения.
Я обнаружил, что оценки не имеют смысла во всех сценариях. В некоторых случаях это создает слишком много шума. В других случаях он может потерять некоторые хорошие обнаружения. Я посмотрел на эти узлы, чтобы преобразовать эти промежуточные оценки в окончательные оценки возможности. Есть тысячи узлов...

@YijinLiu спасибо, что разъяснили это. Тогда, я думаю, лучше подождать, пока в TensorFlow Lite не будут включены дополнительные улучшения для обнаружения объектов. В любом случае, я попытаюсь расшифровать блоки обнаружения на C++, если у меня будет время.

Привет @andrewharp ,

Спасибо за ваши усилия по созданию нового демонстрационного проекта Android, но не могли бы вы написать readme.md или какой-нибудь документ с описанием в tensorflow/contrib/lite/examples/android , чтобы мы все могли легко понять процесс создания tensorflow lite? спасибо~!

Здравствуйте, я успешно запустил демонстрацию ssd_mobilenet_v1_coco_2017_11_17, затем я получил точно настроенную модель. Когда я запускаю на ней процесс @andrehentz , возникла проблема:
bazel run tensorflow/contrib/lite/toco:toco -- --input_file=$STRIPPED_PB --output_file=$DETECT_FB --input_format=TENSORFLOW_GRAPHDEF --output_format=TFLITE --input_shapes=1,300,300,3 --input_arrays=Preprocessor/sub --output_arrays=concat,concat_1 --inference_type=FLOAT --logtostderr

До удаления неиспользуемых операций: 586 операторов, 871 массив (0 квантованных)
2018-06-12 15:29:54.273221: I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] Перед общими преобразованиями графа: 586 операторов, 871 массив (0 квантованных)
2018-06-12 15:29:54.300213: I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] После прохождения общих преобразований графа 1: 409 операторов, 688 массивов (0 квантованных)
2018-06-12 15:29:54.309735: I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] Преобразования графа до деквантования: 409 операторов, 688 массивов (0 квантованных)
2018-06-12 15:29:54.317395: I tensorflow/contrib/lite/toco/allocate_transient_arrays.cc:329] Общий размер выделенного временного массива: 2880256 байт, теоретическое оптимальное значение: 2880128 байт.
2018-06-12 15:29:54.319173: F tensorflow/contrib/lite/toco/tflite/export.cc:330] Некоторые операторы в модели не поддерживаются стандартной средой выполнения TensorFlow Lite. Если у вас есть специальная реализация для них, вы можете отключить эту ошибку с помощью --allow_custom_ops или установив allow_custom_ops=True при вызове tf.contrib.lite.toco_convert(). Вот список операторов, для которых вам понадобятся собственные реализации: RSQRT, SquaredDifference, Stack, TensorFlowShape.

Вот моя модель https://drive.google.com/open?id=1IxRSU4VSmVmhUtUpSQew_5anEfxTg3Ca

Может кто-нибудь помочь мне?
@andrehentz

@JaviBonilla и @YijinLiu У меня есть реализация Python , которую я тестировал с предварительно установленными моделями Google SSD MobileNet V{1,2} и SSDLIte MobileNet V2. См. простую документацию здесь .

@freedomtan какую версию tf ты используешь? тф 1.8?

Основная ветвь @hengshanji после привязки интерпретатора tflite к Python (29c129c6). Я не думаю, что 1.8 имеет привязку.

@freedomtan tf1.8 имеет привязку к интерпретатору Python, но я встречаю такую ​​​​проблему, как «ошибка nnapi: невозможно открыть библиотеку libneuralnetworks.so». где взять этот .so или как его сгенерировать? Спасибо.

Не обращайте внимания :) Это NNAPI для Android.

@freedomtan Вы тестировали пример на устройстве или на ПК? Когда я тестирую его на ПК, использую android-28/x86 libneuralnetworks.so, он показывает ошибку «Прервать, поскольку tflite вернул ошибку».

Как я уже сказал, пожалуйста, игнорируйте эту проблему с NNAPI. Вы не должны иметь рабочий libneuralnetwork.so . Я тестировал свои скрипты как на x86-системе с Ubuntu, так и на плате ARMv8 с Debian.

@freedomtan , спасибо, что поделились кодом и документацией.

На основе репозитория (https://github.com/YijinLiu/tf-cpu). Я обновил tf-cpu/benchmark/obj_detect_lite.cc, чтобы получить результаты. В функцию AnnotateMat() добавьте код decodeCenterSizeBoxes для обработки output_locations, затем выполните nms для этих результатов.
В то же время, используя https://github.com/tensorflow/tensorflow/issues/14688 для создания libtensorflow-lite.a, он может работать как на устройстве x86 под управлением Ubuntu, так и на устройстве Android с моделью tflite в ssdlite_mobilenet_v2_coco_2018_05_09. tar.gz.
Спасибо всем.

@WeiboXu Можете ли вы поделиться здесь кодом и моделью?

Вот обновленный код для obj_detect_lite.cc
obj_detect_lite.cc.zip

Модель http://download.tensorflow.org/models/object_detection/ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz .

@freedomtan В вашем коде реализации Python есть один файл «/tmp/box_priors.txt», знаете ли вы, как создать этот файл? Или как были рассчитаны данные в этом файле? Нет проблем сделать вывод для изображения размером 300X300, но точность вывода упадет, если сделать вывод для изображения размером 224X224.

@freedomtan , @andrewharp , предыдущая модель, следуя этим инструкциям , не может работать в последней демо-версии TFLite , независимо от того, является ли она количественной или плавающей, потому что модель tflite в последней демо-версии TFLite требует 4 выхода, а предыдущая модель имеет только 2 выхода ( конкат, конкат1).

Пожалуйста, помогите, Спасибо!

Эти инструкции обновляются в данный момент. Ссылка на обновленные инструкции будет предоставлена ​​на следующей неделе.

@frontword Что в /tmp/box_priors.txt — это ящики для постобработки. Если вы используете более новый, упомянутый @WenguoLi , он вам не нужен. Однако, насколько я могу судить, эти операции постобработки реализованы как пользовательские операции TF Lite. Это означает, что вы не можете ускорить их с помощью ускорителей NNAPI без дополнительных усилий.

Что касается проблем с размером изображения, да, я думаю, что передача изображений 224x224 на SSD300 (модели, выпущенные Google, были обучены изображениям 300x300) и ухудшение точности не являются неожиданными.

@WenguoLi Мне кажется, что обновленная модель, о которой вы упомянули, довольно проста в обращении. См. мой сценарий обновления . Следующий рисунок создан

python  tensorflow/contrib/lite/examples/python/object_detection.py --image /tmp/image2.jpg  --show_image True

image

Чтобы исправить результат вывода, превышающий 1, можно использовать метод Java TrackedObject.getCurrentCorrelation(), потому что он всегда возвращает что-то меньше 1 (хотя не уверен, что это правильно или нет). Пример TFLite для Android использует Recognition.getConfidence(), который всегда возвращает значение больше 1.

@mpeniak Вы запустили модель ssd mobilenet tflite на Movidius. Я тоже планирую сделать нечто подобное. Не могли бы вы немного рассказать о том, как вы это сделали?

@achowdhery Привет, я видел некоторые обновления инструкций по сборке для последней демо-версии Android здесь (https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite/examples/android/app), но это не указал, как мы можем на самом деле преобразовать замороженную модель pb в модель tflite (квантованный файл detect.tflite, который использовался в последней демонстрации). Любые дальнейшие инструкции по потоку преобразования квантованной модели? Кроме того, я думаю, что мы должны сначала запустить квантованное обучение с поддельными операциями квантования, как указано здесь (https://www.tensorflow.org/performance/quantization), а затем выполнить преобразование модели, верно? Кроме того, можно ли включить NNAPI в последней демо-версии Android? Я пытался использовать tfLite.setUseNNAPI(true) в TFLiteObjectDetectionAPIModel.java, но на моем Pixel 2 под управлением Android 8.1 произошел сбой (он может хорошо работать без NNAPI). Какие-либо предложения? Спасибо!

@tenoyart Краткий ответ на вопрос «Можно ли включить NNAPI в последней демоверсии Android?» должно быть НЕТ. Не такой короткий ответ: это возможно, если вы измените интерпретатор TF Lite, сделаете что-то вроде разделения модели или добавления соответствующих пользовательских операций в NNAPI.

@achowdhery Я видел вашу статью в блоге TensorFlow. Это та инструкция, которую вы упомянули, или появятся другие?

да. Это инструкции по обучению и обслуживанию модели обнаружения объектов на Android.

@freedomtan Спасибо, что поделились сценарием.
В вашем последнем скрипте с постобработкой какой файл модели вы используете?
Указывали ли вы аргумент optimize_for_inference.py, например
--input_names="Препроцессор/подпрограмма"
--output_names="detection_boxes,detection_scores,num_detections,detection_classes"

Вы видите разницу с/без постобработки?

Спасибо!

Есть ли способ преобразовать модели SqueezeNet с 4 выходами в tflite?

@chanchanzhang Пожалуйста, следуйте новым инструкциям в конце руководства на странице https://medium.com/tensorflow/training-and-serving-a-realtime-mobile-object-detector-in-30-minutes-with-cloud-tpus .
Обратите внимание, что здесь используется другой рабочий процесс, чем при использовании optimize_for_inference.py.

@ashwaniag Если вы хотите заменить Mobilenet классификатором SqueezeNet, сохранив после этого SSD для обнаружения, это нормально для текущего рабочего процесса.

@achowdhery Приятно видеть модель TF Lite на ssd mobilenet v1. TF Lite полностью поддерживает ssdlite mobilenet v2?

@tenoyart Да. Любой твердотельный накопитель Mobilenet будет работать через этот конвейер. Мы не выпускали соответствующие файлы tflite в открытом доступе. Если вы столкнулись с проблемами, сообщите об ошибке.

@chanchanzhang , как сказал @achowdhery , используйте object_detection/export_tflite_ssd_graph.py вместо optimized_for_inference.py . И файл модели tflite, который я использовал, взят из примера Android. Вы можете получить это здесь .

@achowdhery Я думаю, что в контрольных точках ssd_mobilenet_v1_quantized_coco и ssd_mobilenet_v1_0.75_depth_quantized_coco нет узлов и тензоров FakeQuant . Не могли бы вы их проверить?

@freedomtan Я вижу узлы weight_quant и act_quant в экспортированном графике после использования object_detection/export_tflite_ssd_graph.py.
Пожалуйста, предоставьте скриншот или точные инструкции о том, как вы проверили, что на нем нет узлов Fakequant.
Я также могу успешно конвертировать контрольные точки

@achowdhery Спасибо за проверку. Когда я запускал export_tflite_ssd_graph.py на этих двух, я не мог получить модели tflite, поэтому я проверил контрольные точки. Что я сделал, это что-то вроде

curl http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_quantized_300x300_coco14_sync_2018_07_03.tar.gz | tar xzvf -
cd ssd_mobilenet_v1_quantized_300x300_coco14_sync_2018_07_03
strings model.ckpt.index  |grep quant

Ничего не появляется.

@andrewharp Большое спасибо за ваш класс вывода cutosm TFLiteObjectDetectionAPIModel.java , я пробовал его с вашим ssd mobilenet v1 tflite mobilenet_ssd_tflite_v1.zip, но когда приложение запускается, кажется, что есть проблема в функции распознавать изображение (финальное растровое изображение), когда я звоню tfLite.runForMultipleInputsOutputs(inputArray, outputMap); он выдает это исключение

07-18 10:37:02.416 19957-19996/com.app.cerist.realtimeobjectdetectionapi E/AndroidRuntime: FATAL EXCEPTION: Camera
    Process: com.app.cerist.realtimeobjectdetectionapi, PID: 19957
    java.lang.IllegalArgumentException: Output error: Outputs do not match with model outputs.
        at org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:170)
        at com.app.cerist.realtimeobjectdetectionapi.ImageClassifierTFLiteAPI.recognizeImage(ImageClassifierTFLiteAPI.java:207)
        at com.app.cerist.realtimeobjectdetectionapi.MainActivity.classifyFrame(MainActivity.java:421)
        at com.app.cerist.realtimeobjectdetectionapi.MainActivity.access$1000(MainActivity.java:48)
        at com.app.cerist.realtimeobjectdetectionapi.MainActivity$4.run(MainActivity.java:455)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:159)
        at android.os.HandlerThread.run(HandlerThread.java:61)
07-18 10:37:02.436 19957-19996/com.app.cerist.realtimeobjectdetectionapi V/Process: killProcess [19957] Callers=com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException:99 java.lang.ThreadGroup.uncaughtException:693 java.lang.ThreadGroup.uncaughtException:690 <bottom of call stack> 
07-18 10:37:02.436 19957-19996/com.app.cerist.realtimeobjectdetectionapi I/Process: Sending signal. PID: 19957 SIG: 9

ошибка сказала, что длина массива выходов больше, чем длина массива входов
Вот условие в Interpreter.java

public void runForMultipleInputsOutputs(Object[] inputs, <strong i="7">@NonNull</strong> Map<Integer, Object> outputs) {
        if (this.wrapper == null) {
            throw new IllegalStateException("Internal error: The Interpreter has already been closed.");
        } else {
            Tensor[] tensors = this.wrapper.run(inputs);
            if (outputs != null && tensors != null && outputs.size() <= tensors.length) {
                int size = tensors.length;
                Iterator var5 = outputs.keySet().iterator();
            }
       }
}

и это мои входные и выходные массивы:

d.imgData = ByteBuffer.allocateDirect(1 * d.inputSize * d.inputSize * 3 * numBytesPerChannel);
d.imgData.order(ByteOrder.nativeOrder());
d.intValues = new int[d.inputSize * d.inputSize];
 imgData.rewind();
        for (int i = 0; i < inputSize; ++i) {
            for (int j = 0; j < inputSize; ++j) {
                int pixelValue = intValues[i * inputSize + j];
                if (isModelQuantized) {
                    // Quantized model
                    imgData.put((byte) ((pixelValue >> 16) & 0xFF));
                    imgData.put((byte) ((pixelValue >> 8) & 0xFF));
                    imgData.put((byte) (pixelValue & 0xFF));
                } else { // Float model
                    imgData.putFloat((((pixelValue >> 16) & 0xFF) - IMAGE_MEAN) / IMAGE_STD);
                    imgData.putFloat((((pixelValue >> 8) & 0xFF) - IMAGE_MEAN) / IMAGE_STD);
                    imgData.putFloat(((pixelValue & 0xFF) - IMAGE_MEAN) / IMAGE_STD);

Массив выходов:

// Copy the input data into TensorFlow.
        Trace.beginSection("feed");
        outputLocations = new float[1][NUM_DETECTIONS][4];
        outputClasses = new float[1][NUM_DETECTIONS];
        outputScores = new float[1][NUM_DETECTIONS];
        numDetections = new float[1];

        Object[] inputArray = {imgData};
        Map<Integer, Object> outputMap = new HashMap<>();
        outputMap.put(0, outputLocations);
        outputMap.put(1, outputScores);
        outputMap.put(2, numDetections);
        outputMap.put(3, outputClasses);
        Trace.endSection();

И вывод:

// Run the inference call.
        Trace.beginSection("run");
        Log.d("TAG_INPUT",""+String.valueOf(inputArray.length));
        Log.d("TAG_OUTPUT",""+String.valueOf(outputMap.size()));

        tfLite.runForMultipleInputsOutputs(inputArray, outputMap);
        Trace.endSection();

Я не понял значения этой ошибки, потому что я сделал то же самое, что и ваш класс TFLiteObjectDetectionAPIModel.java.
Спасибо за помощь

@achowdhery Привет, после вашего блога я преобразовал модель из ssd_mobilenet_v1_coco_2017_11_17. Однако, когда я использовал преобразованный mobilenet_ssd.tflite в tflite_demo.apk, я получил следующую ошибку:

    java.lang.IllegalArgumentException: Cannot copy between a TensorFlowLite tensor with shape [1, 1917, 4] and a Java object with shape [1, 10, 4].

Любые идеи, почему я получил это? Спасибо.

Это несоответствие формы, потому что ожидаемый выходной тензор имеет размер 1,10,4, а не 1,1917,4. Для файла старой модели вам потребуется вернуться к демо-версии приложения за май. В противном случае используйте для преобразования последние выпущенные модели.

@achowdhery Я преобразовал свою собственную модель в tflite и когда запускаю ее. Вызов интерпретатора->invoke() вызывает ошибку seg. Есть идеи, что может быть не так?

@ashwaniag Загрузите загруженные модели на https://medium.com/tensorflow/training-and-serving-a-realtime-mobile-object-detector-in-30-minutes-with-cloud-tpus-b78971cf1193 .
скомпилировать для вас?
Если да, то, пожалуйста, предоставьте новые инструкции, которые вы используете сейчас, когда у вас возникает ошибка seg?
Возможно несоответствие типа/размера ввода и т.д.

@achowdhery Это сработало. Я давал неправильные input_arrays. В любом случае спасибо!

обновленные ssd_mobilenet_v1_quantized_coco и ssd_mobilenet_v1_0.75_depth_quantized_coco работают, если вы следовали руководству. Спасибо @achowdhery.

Я смотрел на TFLiteObjectDetectionAPIModel.java в примере демо-приложения. Есть ли причина, по которой outputLocations , outputClasses , outputScores и numDetections выделяются здесь для каждого вызова recognizeImage ? Кажется, что они предназначены для предварительного распределения.
Я пробовал запускать код с предварительным выделением памяти, и, похоже, он работает нормально, но я просто хотел убедиться, что под обложкой не скрывается ничего, что позже может привести к проблемам.

Предварительное распределение, вероятно, более эффективно. Где вы заранее распределяете, что можете предвидеть проблемы?

спасибо за ответ @achowdhery. Я оставляю предварительное выделение в статическом методе create как есть. Меня беспокоило только то, что код, похоже, был написан с использованием предварительного выделения (статический метод предварительно выделяет массивы), но по какой-то причине массивы перераспределяются при каждом вызове.

привет @achowdhery , я протестировал новую демонстрацию приложения Android tflite. Он отлично работает для ssd_mobilenet_v1_coco, ssd_mobilenet_v1_0.75_depth_coco, ssd_mobilenet_v1_quantized_coco .
Но я получил это исключение для других моделей ssd-mobilenet:

07-25 07:41:25.292 31515-31532/org.tensorflow.lite.demo E/AndroidRuntime: FATAL EXCEPTION: inference
    Process: org.tensorflow.lite.demo, PID: 31515
    java.lang.ArrayIndexOutOfBoundsException: length=160; index=-2147483648
        at java.util.Vector.elementData(Vector.java:734)
        at java.util.Vector.get(Vector.java:750)
        at org.tensorflow.demo.TFLiteObjectDetectionAPIModel.recognizeImage(TFLiteObjectDetectionAPIModel.java:218)
        at org.tensorflow.demo.DetectorActivity$3.run(DetectorActivity.java:249)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.os.HandlerThread.run(HandlerThread.java:65)

Модель tflite выдала неверный индекс класса. Исключение приводит к сбою приложения после обнаружения в течение нескольких секунд.
ssd_mobilenet_v1_ppn_coco создает неправильную грязную ограничительную рамку, а также метку.

PPN — это модель с плавающей запятой: вы конвертируете модель TFLITE с помощью команд преобразования с плавающей запятой.
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_on_mobile_tensorflowlite.md
Затем вам также необходимо изменить следующее в DetectorActivity.java:
частный статический окончательный логический TF_OD_API_IS_QUANTIZED = true;

Я знал этот конфиг. На самом деле, когда эта конфигурация неверна, приложение вообще не может работать.
Не могли бы вы увидеть исключение ArrayIndexOutOfBoundsException? Я также пробовал докер вашего учебника, но он такой же.

Хорошо. пожалуйста, создайте новую проблему GitHub с точными инструкциями по воспроизведению. Модель PPN - это новый запрос функции для приложения Java. Мы ответим, когда сможем расставить приоритеты.

Спасибо. Исключение ArrayIndexOutOfBoundsException также происходит с ssd_mobilenet_v1_0.75_depth_quantized_coco, ssdlite_mobilenet_v2_coco. Отличие от PPN в том, что он выдает правильные результаты до того, как приложение вылетит из-за этого исключения.

@achowdhery Можно ли как-то обучить модель квантования с 4 выходами для tflite, используя legacy/train.py, поскольку в новом model_main.py есть ошибки?
https://github.com/tensorflow/models/issues/4798

@ashwaniag Вы можете сравнить два кода и добавить часть, которая добавляет квантование: обратите внимание, что функция graph_rewriter — это место, где добавляются операции квантования.

@achowdhery : https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_on_mobile_tensorflowlite.md
есть ли пример или пример кода того, как сделать то же самое в iOS. До сих пор самое близкое, что я нашел, это https://github.com/YijinLiu/tf-cpu/blob/master/benchmark/obj_detect_lite.cc , что не всегда работает.

текущее демо-приложение для iOS не работает с моделями ssd и float.

@achowdhery Я обучил свою модель с помощью tensorflow v1.9. Преобразовано в tflite, используя шаги в блоге. Я не получаю никаких обнаружений. У вас есть какие-нибудь идеи по этому поводу?

@ashwaniag COCO или домашние животные? Пожалуйста, откройте новую ошибку с точными инструкциями по воспроизведению. Другие пользователи GitHub подтвердили его работу с Tensorflow 1.10.

@achowdhery Это мой собственный набор данных. Я обучался архитектуре mobilenetv2. Когда я запускаю модель .pb (модель тензорного потока), я получаю
Не найдено: тип операции не зарегистрирован «NonMaxSuppressionV3» в двоичном коде, работающем на VAL5-04. Убедитесь, что Op и Kernel зарегистрированы в двоичном файле, работающем в этом процессе.

Как вы думаете, это связано?

@ashwaniag Пожалуйста, откройте новую ошибку и предоставьте точные воспроизводимые инструкции

@ashwaniag проверьте обе проблемы, у меня была похожая проблема: # 10254 и # 19854

@achraf-boussaada Спасибо! Я починил это. Это была проблема несоответствия версий.
@achowdhery Теперь проблема в том, что полная модель тензорного потока дает мне отличные результаты, но модель tflite дает очень плохие результаты.

@ashwaniag Пожалуйста, определите очень плохие результаты. У вас есть мелкие предметы? Прикрепите контрольную точку модели, конфигурацию конвейера и файл этикетки, а также образец изображения, чтобы помочь нам воспроизвести проблему. Спасибо

@oopsodd привет, я тоже получаю неправильный индекс класса. он жаловался "java.lang.ArrayIndexOutOfBoundsException: длина = 10; индекс = -739161663", вы можете мне помочь?

Примечание. Я создал минимальные рабочие примеры TensorFlow Lite SSD (обнаружение объектов) для iOS и Android; https://github.com/baxterai/tfliteSSDminimalWorkingExample. Версия для iOS основана на obj_detect_lite.cc от YijinLiu (с функцией nms от WeiboXu), а версия для Android основана на https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/examples/ Android tflDetect. Он устраняет все накладные расходы, такие как внутренняя камера, и изолирует основной код, необходимый для обнаружения объектов и отображения полей обнаружения.

@baxterai отличная работа! спасибо, буду тестить.

Спасибо всем за вашу потрясающую работу! У меня есть еще один вопрос относительно недавно добавленной операции постобработки.

Вывод предварительно обученного ssd_mobilenet_v1_quantized_coco
в настоящее время ограничен 10 лучшими обнаружениями в кадре, несмотря на то, что конфигурации по умолчанию в models/research/object_detection/samples/configs/, такие как
ssd_mobilenet_v1_quantized_300x300_coco14_sync.config указывает более высокий предел общего количества обнаружений.

post_processing { batch_non_max_suppression { score_threshold: 1e-8 iou_threshold: 0.6 max_detections_per_class: 100 max_total_detections: 100 } score_converter: SIGMOID }

это решается путем переобучения сети с этой конфигурацией конвейера или размерность
«TFLite_Detection_PostProcess» исправлен на 10 другими конфигурациями?

@Georg-W Вам также нужно будет изменить максимальное обнаружение в export_tflite_ssd_graph.py. Есть опция командной строки.

@achowdhery ах, спасибо! Это то, что я пропустил.

@andrewharp Большое спасибо за ваш класс вывода cutosm TFLiteObjectDetectionAPIModel.java , я пробовал его с вашим ssd mobilenet v1 tflite mobilenet_ssd_tflite_v1.zip, но когда приложение запускается, кажется, что есть проблема в функции распознавать изображение (финальное растровое изображение), когда я звоню tfLite.runForMultipleInputsOutputs(inputArray, outputMap); он выдает это исключение

07-18 10:37:02.416 19957-19996/com.app.cerist.realtimeobjectdetectionapi E/AndroidRuntime: FATAL EXCEPTION: Camera
    Process: com.app.cerist.realtimeobjectdetectionapi, PID: 19957
    java.lang.IllegalArgumentException: Output error: Outputs do not match with model outputs.
        at org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:170)
        at com.app.cerist.realtimeobjectdetectionapi.ImageClassifierTFLiteAPI.recognizeImage(ImageClassifierTFLiteAPI.java:207)
        at com.app.cerist.realtimeobjectdetectionapi.MainActivity.classifyFrame(MainActivity.java:421)
        at com.app.cerist.realtimeobjectdetectionapi.MainActivity.access$1000(MainActivity.java:48)
        at com.app.cerist.realtimeobjectdetectionapi.MainActivity$4.run(MainActivity.java:455)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:159)
        at android.os.HandlerThread.run(HandlerThread.java:61)
07-18 10:37:02.436 19957-19996/com.app.cerist.realtimeobjectdetectionapi V/Process: killProcess [19957] Callers=com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException:99 java.lang.ThreadGroup.uncaughtException:693 java.lang.ThreadGroup.uncaughtException:690 <bottom of call stack> 
07-18 10:37:02.436 19957-19996/com.app.cerist.realtimeobjectdetectionapi I/Process: Sending signal. PID: 19957 SIG: 9

ошибка сказала, что длина массива выходов больше, чем длина массива входов
Вот условие в Interpreter.java

public void runForMultipleInputsOutputs(Object[] inputs, <strong i="14">@NonNull</strong> Map<Integer, Object> outputs) {
        if (this.wrapper == null) {
            throw new IllegalStateException("Internal error: The Interpreter has already been closed.");
        } else {
            Tensor[] tensors = this.wrapper.run(inputs);
            if (outputs != null && tensors != null && outputs.size() <= tensors.length) {
                int size = tensors.length;
                Iterator var5 = outputs.keySet().iterator();
            }
       }
}

и это мои входные и выходные массивы:

d.imgData = ByteBuffer.allocateDirect(1 * d.inputSize * d.inputSize * 3 * numBytesPerChannel);
d.imgData.order(ByteOrder.nativeOrder());
d.intValues = new int[d.inputSize * d.inputSize];

```
imgData.rewind();
for (int i = 0; i < inputSize; ++ i) {
for (int j = 0; j < inputSize; ++j) {
int pixelValue = intValues[i * inputSize + j];
если (isModelQuantized) {
// Квантовая модель
imgData.put((byte) ((pixelValue >> 16) & 0xFF));
imgData.put((byte) ((pixelValue >> 8) & 0xFF));
imgData.put((byte) (pixelValue & 0xFF));
} else { // Плавающая модель
imgData.putFloat((((pixelValue >> 16) & 0xFF) - IMAGE_MEAN) / IMAGE_STD);
imgData.putFloat((((pixelValue >> 8) & 0xFF) - IMAGE_MEAN) / IMAGE_STD);
imgData.putFloat(((pixelValue & 0xFF) - IMAGE_MEAN) / IMAGE_STD);

The outputs array :

// Копируем входные данные в TensorFlow.
Trace.beginSection("лента");
outputLocations = новое число с плавающей запятой[1][NUM_DETECTIONS][4];
outputClasses = new float[1][NUM_DETECTIONS];
outputScores = новое число с плавающей запятой[1][NUM_DETECTIONS];
numDetections = новое число с плавающей запятой [1];

    Object[] inputArray = {imgData};
    Map<Integer, Object> outputMap = new HashMap<>();
    outputMap.put(0, outputLocations);
    outputMap.put(1, outputScores);
    outputMap.put(2, numDetections);
    outputMap.put(3, outputClasses);
    Trace.endSection();
And the Inference :

// Выполнить вызов логического вывода.
Trace.beginSection("выполнить");
Log.d("TAG_INPUT",""+String.valueOf(inputArray.length));
Log.d("TAG_OUTPUT",""+String.valueOf(outputMap.size()));

    tfLite.runForMultipleInputsOutputs(inputArray, outputMap);
    Trace.endSection();

```
Я не понял значения этой ошибки, потому что я сделал то же самое, что и ваш класс TFLiteObjectDetectionAPIModel.java.
Спасибо за помощь

у меня такая же проблема.. есть решение?
Спасибо..

@Georg-W Вам также нужно будет изменить максимальное обнаружение в export_tflite_ssd_graph.py. Есть опция командной строки.

Привет

Я пытаюсь обнаружить более 10 объектов на изображении (по умолчанию)
Я использую следующие команды:
bazel run -c opt tensorflow/contrib/lite/ toco:toco -- --input_file=$OUTPUT_DIR/tflite_graph.pb --output_file=$OUTPUT_DIR/mobile_net_500.tflite --input_shapes=1,300,300,3 --input_arrays=normalized_input_image_tensor -- output_arrays='TFLite_Detection_PostProcess','TFLite_Detection_Po stProcess:1 ','TFLite_Detection_Po stProcess:2 ','TFLite_Detection_Po stProcess:3 ' --inference_type=FLOAT --max_detections=500 --max_classes_per_detection=1 --allow_custom_ops

я тоже модифицировал
export_tflite_ssd_graph.py
flags.DEFINE_integer('max_detections', 500 <--- вместо 10,
«Максимальное количество обнаружений (полей) для отображения».)
flags.DEFINE_integer('max_classes_per_detection', 1,
'Количество классов для отображения в поле обнаружения.')

но все еще дает 10 объектов в качестве вывода в андроиде [1,10,4].

Есть идеи?

Я также был бы заинтересован в решении проблемы @KaviSanth .

Это решение @Stevelb должно работать. Вы можете визуализировать замороженный график, чтобы убедиться, что max_detections установлен правильно.

@achowdhery Спасибо за ваш ответ. Я пытался выполнить команды, написанные @andrewharp , но получаю следующую ошибку. Действительно, toco находится не в этом месте. Я использую основную версию и версию r1.95 из репозитория github.

bazel run tensorflow/contrib/lite/ toco:toco -- --input_file=$STRIPPED_PB --output_file=$DETECT_FB --input_format=TENSORFLOW_GRAPDEF --output_format=TFLITE --input_shapes=1,300,300,3 --input_arrays=препроцессор/sub - -output_arrays=concat,concat_1 --inference_type=FLOAT --logtostderr
ИНФОРМАЦИЯ: Идентификатор вызова: 0e58a5ef-9fee-4619-b760-aeb1c83c9661
ОШИБКА: пропуск «tensorflow/contrib/lite/ toco:toco »: нет такого пакета «tensorflow/contrib/lite/toco»: файл BUILD не найден в пути к пакету
ПРЕДУПРЕЖДЕНИЕ. Не удалось выполнить синтаксический анализ целевого шаблона.
ОШИБКА: нет такого пакета «tensorflow/contrib/lite/toco»: файл BUILD не найден в пути к пакету
ИНФОРМАЦИЯ: Прошедшее время: 0,179 с.
ИНФОРМАЦИЯ: 0 процессов.
FAILED: сборка НЕ ​​завершена успешно (загружено 0 пакетов)
FAILED: сборка НЕ ​​завершена успешно (загружено 0 пакетов)
Я должен исправить, что я выполняю эти команды из моей локальной папки tensorflow, которая была извлечена из git.

Я мог найти токо под tensorflow/lite/toco, и я просто проверяю, работает ли оно.
хорошо, похоже, что с этим токо работает, и кроме этого вам нужно изменить путь $DETECT_FB на $PWD/ssd_mobilenet.tflite, так как в папке contrib/lite находится только какой-то питон и ничего больше.

Появляется ошибка времени выполнения при добавлении файла .tflite в DetectorActivity из https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android (https://github.com/tensorflow/tensorflow/blob /master/tensorflow/examples/android/src/org/tensorflow/demo/DetectorActivity.java) со строкой

private static final String TF_OD_API_MODEL_FILE =
            "file:///android_asset/ssd_mobilenet_v1.tflite";

E/AndroidRuntime: НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: основной
Процесс: myProcess, PID: 32611
java.lang.RuntimeException: не удалось найти входной узел «image_tensor»
в myPackage.myClass.TensorFlowObjectDetectionAPIModel.create(TensorFlowObjectDetectionAPIModel.java:106)

Разве нельзя использовать модели .tflite в этом приложении?

@ defaultUser3214 вы используете модель классификатора в приложении для обнаружения. MobileNet v1 — модель классификации. Пожалуйста, используйте модель MobileNet SSD

@achowdhery Спасибо! Использование модели из wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2017_11_17.tar.gz привело к этой ошибке. а я думал что это версия ssd?

Но использование ssd_mobilenet_v1_android_export.pb, преобразованного в .tflite, который раньше работал как .pb, приводит к той же ошибке.

@ defaultUser3214 Это старая версия модели, которая не будет работать в последнем демонстрационном приложении, выпущенном в июле 2018 года. Пожалуйста, загрузите последние модели в июле 2018 года в зоопарке моделей обнаружения: они работают в приложении. Пожалуйста, откройте новую проблему, если она все еще заблокирована.

@SteveIb Вам также необходимо изменить NUM_DETECTIONS = 500 в TFLiteObjectDetectionAPIModel.java.

не удалось преобразовать ssdmobilenet v1 .pb в .tflite
pb, созданный с помощью API обнаружения объектов Tensorflow @aselle @achowdhery

Есть ли прогресс в этом? Пытаюсь преобразовать замороженный_inference_graph.pb в файл .TFLITE, но получаю сообщение об ошибке

java.lang.IllegalArgumentException: Cannot convert between a TensorFlowLite buffer with 49152 bytes and a ByteBuffer with 270000 bytes

Для обнаружения пользовательских объектов в Android. Любые идеи о различных методах преобразования? Перенесите изученный ssd_mobilenet_v1_pets в Windows 10, следуя инструкциям здесь: https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10 .

Есть ли прогресс в этом? Пытаюсь преобразовать замороженный_inference_graph.pb в файл .TFLITE, но получаю сообщение об ошибке

java.lang.IllegalArgumentException: Cannot convert between a TensorFlowLite buffer with 49152 bytes and a ByteBuffer with 270000 bytes

Для обнаружения пользовательских объектов в Android. Любые идеи о различных методах преобразования? Перенесите изученный ssd_mobilenet_v1_pets в Windows 10, следуя инструкциям здесь: https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10 .

Просто чтобы проследить за этим и помочь всем, у кого была такая же ошибка - это вызвано использованием неправильной контрольной точки модели для обучения. Для работы на Android с .tflite исходная модель должна быть MobileNet, а также должна быть квантована и иметь этот раздел кода или что-то подобное в файле .config:

graph_rewriter { quantization { delay: 48000 weight_bits: 8 activation_bits: 8 } }

Он уже доступен на tensorflow/contrib/lite/examples/android ! Это более полный порт оригинальной демонстрации TF для Android (отсутствует только пример Stylize), и в дальнейшем он заменит другую демонстрацию в tensorflow/contrib/lite/java/demo.

Преобразованный плоский буфер TF Lite можно найти в файле mobilenet_ssd_tflite_v1.zip , а реализацию логического вывода Java — в файле TFLiteObjectDetectionAPIModel.java . Обратите внимание, что это отличается от оригинальной реализации TF тем, что блоки должны быть вручную декодированы в Java, а текстовый файл перед блоком должен быть упакован в активы приложения (я думаю, что файл, включенный в ZIP-файл модели выше, должен быть действителен для большинства графики).

Во время преобразования TOCO используется другой входной узел (препроцессор/подчиненный), а также разные выходные узлы (concat, concat_1). Это пропускает некоторые части, которые являются проблематичными для tflite, до тех пор, пока либо график не будет реструктурирован, либо TF Lite не достигнет четности TF.

Вот быстрые шаги для преобразования модели SSD MobileNet в формат tflite и создания демо для его использования:

# Download and extract SSD MobileNet model
wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2017_11_17.tar.gz
tar -xvf ssd_mobilenet_v1_coco_2017_11_17.tar.gz 
DETECT_PB=$PWD/ssd_mobilenet_v1_coco_2017_11_17/frozen_inference_graph.pb
STRIPPED_PB=$PWD/frozen_inference_graph_stripped.pb
DETECT_FB=$PWD/tensorflow/contrib/lite/examples/android/assets/mobilenet_ssd.tflite

# Strip out problematic nodes before even letting TOCO see the graphdef
bazel run -c opt tensorflow/python/tools/optimize_for_inference -- \
--input=$DETECT_PB  --output=$STRIPPED_PB --frozen_graph=True \
--input_names=Preprocessor/sub --output_names=concat,concat_1 \
--alsologtostderr

# Run TOCO conversion.
bazel run tensorflow/contrib/lite/toco:toco -- \
--input_file=$STRIPPED_PB --output_file=$DETECT_FB \
--input_format=TENSORFLOW_GRAPHDEF --output_format=TFLITE \
--input_shapes=1,300,300,3 --input_arrays=Preprocessor/sub \
--output_arrays=concat,concat_1 --inference_type=FLOAT --logtostderr

# Build and install the demo
bazel build -c opt --cxxopt='--std=c++11' //tensorflow/contrib/lite/examples/android:tflite_demo
adb install -r -f bazel-bin/tensorflow/contrib/lite/examples/android/tflite_demo.apk

Это работает как шарм!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги