Tensorflow: [Pergunta e erro] Existe um modelo de detecção como um SSD-Mobile-net no tensorflow-lite?

Criado em 26 dez. 2017  ·  141Comentários  ·  Fonte: tensorflow/tensorflow

OI.

Desenvolvendo um aplicativo Android usando tensorflow-lite.

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/g3doc/models.md
Modelo de detecção não encontrado.

Além disso, tento converter SSD-Inceptionv2 usando tensorflow-lite-API. Mas parece haver um problema.

Comando


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}

Erro de código


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 

O arquivo fire_inception_v2 é criado, mas seu tamanho é zero bytes.
O que é um problema?

Além disso,
por favor, deixe-me saber qual é a melhor maneira de implantar o modelo personalizado para detecção de objetos?

Alguém me ajuda pf!.

obrigada.

lite feature

Comentários muito úteis

Está ao vivo agora em tensorflow/contrib/lite/examples/android ! Este é um porte mais completo da demonstração original do TF Android (só falta o exemplo Stylize), e substituirá a outra demonstração em tensorflow/contrib/lite/java/demo daqui para frente.

Um flatbuffer TF Lite convertido pode ser encontrado em mobilenet_ssd_tflite_v1.zip , e você pode encontrar a implementação de inferência Java em TFLiteObjectDetectionAPIModel.java . Observe que isso difere da implementação original do TF, pois as caixas devem ser decodificadas manualmente em Java e um arquivo txt anterior à caixa precisa ser empacotado nos ativos dos aplicativos (acho que o incluído no modelo zip acima deve ser válido para a maioria gráficos).

Durante a conversão de TOCO, um nó de entrada diferente (Pré-processador/sub) é usado, bem como diferentes nós de saída (concat,concat_1). Isso pula algumas partes que são problemáticas para o tflite, até que o gráfico seja reestruturado ou o TF Lite atinja a paridade do TF.

Aqui estão as etapas rápidas para converter um modelo SSD MobileNet para o formato tflite e criar a demonstração para usá-lo:

# 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

Todos 141 comentários

@aselle , você pode dar uma olhada neste problema? Obrigado.

No momento, estamos trabalhando para converter o SSD mobilenet (e depois o SSD inicial), mas ele contém operações que não são totalmente suportadas. Vou atualizar este problema assim que tivermos isso feito.

Ótimo, fiz uma pergunta semelhante aqui: https://github.com/tensorflow/tensorflow/issues/14731

Quanto tempo vocês calculam até vocês adicionarem suporte do ssd-mobilenet?

Obrigado,
Martin Peniak

Um membro da organização TensorFlow respondeu depois que o rótulo stat: waiting tensorflower foi aplicado.

?

Responsável irritante: Foram 14 dias sem atividade e este problema tem um responsável. Atualize o rótulo e/ou status de acordo.

Alguma atualização?
Também estou enfrentando um problema semelhante. Desde já, obrigado.

@yucheeling

Você poderia sugerir algum conjunto de dados como " ssd_mobilenet_v1_coco_2017_11_17.tar " que pode ser usado em uma loja de varejo para identificação de roupas diferentes, como camisetas, jeans etc.

@rana3579 , por favor, faça essa pergunta no stackoverflow. Uma atualização rápida no ssd mobilenet. Isso está progredindo e esperamos ter um exemplo em breve.

@rana3579 confira meu vídeo, consegui rodar no movidius, nvidia gpus e processadores de braço. Não posso compartilhar o conjunto de dados, mas se você faz parte de uma empresa, podemos falar sobre uma possível colaboração: https://www.youtube.com/watch?v=3MinI9cCJrc

@aselle obrigado pela atualização! Onde procurar as notificações sobre isso? Gostaria de ser avisado assim que sair, se for possível. Obrigado, eu aprecio seu trabalho duro sobre isso!

@andrewharp , está trabalhando nisso e atualizará o aplicativo Java TF Mobile para usar o tflite. Portanto, observe essas alterações no repositório. Vou deixar este assunto em aberto por enquanto.

Isso é funcional internamente; deve ter algo fora na próxima semana ou duas.

@andrewharp que incrível!! Isso também vale para o exemplo da câmera iOS?
Além disso, qual é o tamanho dos pesos e desempenho?
A mobilenet de classificação TFLite é pequena e o desempenho no iOS é suave, então estou muito animado para o TFLite.

Alguns outros já converteram o SSD Mobilenet pb existente em um modelo coreml e escreveram as camadas de saída ausentes no Swift:
https://github.com/vonholst/SSDMobileNet_CoreML

Mas isso é apenas como 8-12 fps em um iPhone 7.

Oi,
alguma atualização disso?

Também estou curioso :)

Eu tenho um commit portando a demonstração do Android TF para o tflite atualmente em revisão, deve aparecer no github esta semana, espero.

@madhavajay É apenas para Android, mas você deve poder adaptá-lo para iOS. A única coisa é que parte do pré-processamento (redimensionamento/normalização da imagem) e pós-processamento (supressão não máxima e ajuste por caixa anterior) é feito em Java, pois o tflite não suporta totalmente todos os operadores usados ​​pelo MobileNet SSD .

@andrewharp Isso é incrível. Você pode explicar brevemente por que essas operações não estão disponíveis atualmente no TF lite. Parece o mesmo caso para a ferramenta de conversão tfcoreml no SSD comum. Não reclamando apenas perguntando por interesse técnico, eles fazem algo que é particularmente difícil de implementar na pilha móvel ou é apenas de baixa prioridade?

Ansioso para ver seu esforço épico no código Android!!! Muito obrigado. Eu sei que não sou o único ansioso por isso!

@andrewharp e @aselle Alguma atualização sobre como obter a demonstração para usar o exemplo de localização de objeto baseado em SSD para TFLite?

Está ao vivo agora em tensorflow/contrib/lite/examples/android ! Este é um porte mais completo da demonstração original do TF Android (só falta o exemplo Stylize), e substituirá a outra demonstração em tensorflow/contrib/lite/java/demo daqui para frente.

Um flatbuffer TF Lite convertido pode ser encontrado em mobilenet_ssd_tflite_v1.zip , e você pode encontrar a implementação de inferência Java em TFLiteObjectDetectionAPIModel.java . Observe que isso difere da implementação original do TF, pois as caixas devem ser decodificadas manualmente em Java e um arquivo txt anterior à caixa precisa ser empacotado nos ativos dos aplicativos (acho que o incluído no modelo zip acima deve ser válido para a maioria gráficos).

Durante a conversão de TOCO, um nó de entrada diferente (Pré-processador/sub) é usado, bem como diferentes nós de saída (concat,concat_1). Isso pula algumas partes que são problemáticas para o tflite, até que o gráfico seja reestruturado ou o TF Lite atinja a paridade do TF.

Aqui estão as etapas rápidas para converter um modelo SSD MobileNet para o formato tflite e criar a demonstração para usá-lo:

# 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 Feliz Páscoa 🥚🍫 sua LENDA! :) Vou ver se consigo fazer isso funcionar.

Oi, existe alguma versão quantize?

Eu consegui trabalhar com as instruções acima, mas precisava:

  • Android SDK 15 por causa da minha versão do bazel
  • Também não consigo abrir o projeto no Android Studio

@andrewharp é uma nova coisa do Android Studio que vocês estão seguindo, que usa o bazel para criar projetos em vez do Gradle, ou apenas faltam algumas configurações do projeto por enquanto por causa do curto período de tempo para fazê-lo funcionar?

Feliz em fornecer um PR se eu entender qual é o problema.

Também em relação ao desempenho, parece ser lento no meu LG G6 no Android 7.
Isso é porque a API NN está apenas no Android 8?

Alguém conseguiu testar no Android 8?

Entendo, pensei que as instruções eram apenas para a conversão. Parei de ler depois da primeira parte da frase dizendo que é assim que se converte o modelo lol.

Sim, eu tenho o pixel xl, suponho que seu telefone não tenha hardware que possa acelerar a inferência ou que o hardware não seja suportado pelo software.

Vou tentar e te aviso. Eu estava assumindo que poderia construir isso com o android studio doh ...

Enviado do meu iPhone

Em 31 de março de 2018, às 20:05, Madhava Jay [email protected] escreveu:

Eu consegui trabalhar com as instruções acima, mas precisava:

Android SDK 15 por causa da minha versão do bazel
Também não consigo abrir o projeto no Android Studio
@andrewharp é uma nova coisa do Android Studio que vocês estão seguindo, que usa o bazel para criar projetos em vez do Gradle, ou apenas faltam algumas configurações do projeto por enquanto por causa do curto período de tempo para fazê-lo funcionar?

Feliz em fornecer um PR se eu entender qual é o problema.

Também em relação ao desempenho, parece ser lento no meu LG G6 no Android 7.
Isso é porque a API NN está apenas no Android 8?

Alguém conseguiu testar no Android 8?


Você está recebendo isso porque comentou.
Responda a este e-mail diretamente, visualize-o no GitHub ou silencie a conversa.

Sim, fiz a mesma coisa e fui direto para o código e o estúdio Android. Então, depois que você pingou esta manhã, eu estava prestes a responder que eu tinha o mesmo problema e, em seguida, fiz o RTFM novamente. 🤣

Pelo que posso dizer, o LG G6 deve ser capaz de suportar a API NN, pois possui o Qualcomm 821 SoC igual ao Pixel 1. Mas, infelizmente, a LG não lançou o Android 8 ou 8.1 e as versões mais recentes do LineageOS parecem um pouco incompletas então vou adiar a menos que eu saiba que funciona melhor no Android 8.1. Se você puder ativá-lo no Pixel, seria incrível! 👍

Eu consegui testar isso, mas o demo roda muito devagar... ainda mais lento que a versão original.
Estou usando o Pixel XL (primeira versão) e compilei anteriormente a demo antiga para o arco de 64 bits, o que o fez rodar quase duas vezes mais rápido mesmo sem tfLite... o tempo de inferência neste caso é de cerca de 450ms. Quando tento esta demonstração, ela roda em torno de 850ms e às vezes até mais de um segundo. Fiz algo de forma incorreta ou estava apenas sendo otimista demais para esperar uma aceleração decente? Obrigado.

@mpeniak Eu obtive as mesmas velocidades no LG G6, com depuração ativada ou desativada (pensei que era depuração no início). Eu suspeito que NNAPI não está sendo usado. Talvez precisemos fazer algo especial com a compilação nnapi_lib?
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/BUILD

A dependência está listada, mas pode precisar de construção para uma arquitetura específica?
Talvez algo em ./configure
(btw eu habilitei o XLA no meu ./configure no caso de estar relacionado, mas não mudou a velocidade)

@andrewharp
Eu quero usar o NNAPI, mas não sei como usá-lo.
De acordo com o documento, a API Neural Networks está disponível no Android 8.1 >
Se for 8.1 ou superior, é basicamente aplicado? ou Preciso de trabalho adicional do NDK? Link do documento
Tenha um bom dia XD

@andrewharp , tentei habilitar o NNAPI para tflite_demo e executar o apk, porém achei o apk travado
ao chamar AddOpsAndParams, a operação tflite::BuiltinOperator_SQUEEZE não é suportada e
nn_op_type é definido como -1, o que fará com que FATAL seja chamado e exit(-1) . acho que é isso
causa raiz. Você poderia por favor dizer se ele será suportado na versão futura? Existe alguma outra maneira de trabalhar
ao redor para testar o caminho NNAPI? obrigado.

@andrehentz
bazel run -c opt tensorflow/python/tools/optimize_for_inference -- \
--input=$DETECT_PB --output=$STRIPPED_PB --frozen_graph=Verdadeiro \
--input_names=Pré-processador/sub --output_names=concat,concat_1 \
--alsologtostderr

Por que input_names não é image_tensor?
Tentei desta forma e encontrei um erro.

@nanamare
Você deve usar frozen_inference_graph_stripped.pb em vez de frozen_inference_graph.pb.
tente "bazel-bin/tensorflow/tools/graph_transforms/summarize_graph --in_graph=frozen_inference_graph_stripped.pb"
e você pode ver a seguinte saída:
Encontrado 1 entradas possíveis: (name=Preprocessor/sub, type=float(1), shape=None)
Nenhuma variável detectada.
Encontrados 2 saídas possíveis: (name=concat, op=ConcatV2) (name=concat_1, op=ConcatV2)

O nome da entrada é Pré-processador/sub e o nome da saída é concat.

@nanamare
O código mais recente do tensorflow lite inclui uma interface java para habilitar o NNAPI.

class Interpreter tem função chamada: setUseNNAPI(true);
Você pode chamar diretamente essa interface.

@zhangbo0325
Já tentei chamar setUserNNAPI(true);, mas não teve efeito.
Foi quase inferência semelhante não usando NNAPI.
especificação android: versão 8.1.

@nanamare , você está executando o ssd-mobilenet? Para tal rede, existe uma operação SQUEEZE que não é suportada pelo Android NNAPI. Fiz a pergunta acima. Para mobilenet-v1, está tudo bem.

<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!

Registre-se no celular aqui:
04-04 19:46:36.099 28864-28882/org.tensorflow.lite.demo E/AndroidRuntime: FATAL EXCEPTION: inference Process: org.tensorflow.lite.demo, PID: 28864 java.lang.IllegalArgumentException: Shape of output target [1, 1917, 4] não combina com a forma do Tensor [1, 1917, 1, 4]. em org.tensorflow.lite.Tensor.copyTo(Tensor.java:44) em org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:139) em org.tensorflow.demo.TFLiteObjectDetectionAPIModel.recognizeImage(TFLiteObjectDetectionAPIModel.java:226 ) em org.tensorflow.demo.DetectorActivity$3.run(DetectorActivity.java:248) em android.os.Handler.handleCallback(Handler.java:761) em android.os.Handler.dispatchMessage(Handler.java:98) em android.os.Looper.loop(Looper.java:156) em android.os.HandlerThread.run(HandlerThread.java:61)

Incrível! Tentando fazer isso funcionar no iOS. Como faço para analisar a saída do Tensor?

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

A interface DetectorActivity está travada no meu projeto, você existe, como posso resolver?

@ zhangbo0325 Obrigado pelos detalhes. Como o squeeze não é suportado pelo NNAPI, isso significa que o NNAPI não é usado e a inferência permanecerá tão lenta quanto está? Como mencionei no comentário anterior, tenho um desempenho muito ruim no Pixel XL. Eu esperaria tempos de inferência em torno de 80-120ms. Obrigado!

@mpeniak , fiz a mesma pergunta para andrewharp. Acabei de executar o ssd-mobilenet com a ajuda da implementação de cpu tensorflow-lite e também obtive o desempenho ruim.

A palestra do TensorFlow Lite no Dev Summit 2018 mostrou desempenho 3x no MobileNet:
https://youtu.be/FAMfy7izB6A?t=530

Talvez isso não seja para SSD?
Possivelmente requer quantização de peso primeiro?

Eu tentei o mobilnet e é muito mais rápido, mas isso não se aplica ao mobilnet-ssd ...

Panda triste ☹️🐼
@andrewharp Alguma ideia de quando uma implementação de SSD de alto desempenho estará disponível? É uma questão de Quantização de Peso?

Também obtive o desempenho ruim do ssd-mobilenet no TensorFlowLite :(
Mas, tenho outra pergunta. Por que a pontuação do resultado excede 1? Não é a probabilidade?

@ a1103304122 pelo que entendi, a pontuação é a saída do nó "concat", antes do softmax, portanto, não é a probabilidade.

Durante a conversão de TOCO, um nó de entrada diferente (Pré-processador/sub) é usado, bem como diferentes nós de saída (concat,concat_1). Isso pula algumas partes que são problemáticas para o tflite, até que o gráfico seja reestruturado ou o TF Lite atinja a paridade do TF.

Alguém tem ideia de por que o TFlite é mais lento que o TFmobile neste modelo?

@andrewharp é possível comentar sobre o desempenho do SSD TF Lite? Também a quantização é possível / chegando? Eu sei que vocês estão trabalhando duro para que tudo isso aconteça, mas seria bom saber se isso é apenas um soluço de curto prazo ou se há uma solução que podemos aplicar. 😄

@andrewharp Obrigado por sua ótima postagem. No entanto, tenho uma pergunta para seus passos.

Remova os nós problemáticos antes mesmo de permitir que o TOCO veja o graphdef

bazel run -c opt tensorflow/python/tools/optimize_for_inference -- \
--input=$DETECT_PB --output=$STRIPPED_PB --frozen_graph=Verdadeiro \
--input_names=Pré-processador/sub --output_names=concat,concat_1 \
--alsologtostderr

Se não entendi errado, aqui você quer produzir STRIPPED_PB, certo? Se sim, atualmente, a entrada do nosso arquivo de entrada deve ser image_tensor. Então, eu não entendo muito por que usamos Preprocessor/sub. Poderia explicar mais detalhadamente?

Em segundo lugar, aqui usamos optimize_for_inference, podemos usar a ferramenta transform_graph? porque a nova documentação do tensorflow recomenda transform_graph em vez de optimize_for_inference.

@mpeniak como você faz isso? Por favor, diga alguns detalhes.

org.tensorflow.lite.demo E/AndroidRuntime: FATAL EXCEPTION: processo de inferência: org.tensorflow.lite.demo, PID: 28864 java.lang.IllegalArgumentException: formato do destino de saída [1, 1917, 4] não corresponde ao forma do Tensor [1, 1917, 1, 4].

@Haijunlv Você resolveu o problema? Você pode compartilhar a solução?

Ao importar a nova demonstração do Android do TF Lite, estou recebendo Error:Plugin with id 'com.android.application' not found. no OS X.

mesmo problema que @csmith105 ! Consegui compilar e instalar o demo com bazel mas não consigo compilar ou rodar o projeto no Android Studio... alguma solução para este problema?

@Eddy-zheng Se você viu o nó "concat" no gráfico congelado, verá que o squeeze op é executado após concat op. Acho que é por isso que a forma é incompatível. Eu não testei a velocidade do squeeze op. Mas acho que existem duas maneiras de resolver o problema.

  1. alterar a ordem de squeeze e concat op. No ssd_meta_arch.py, altere ligeiramente " box_encodings = tf.squeeze(tf.concat(prediction_dict['box_encodings'], axis=1), axis=2)"
  2. mate diretamente a forma 1 no eixo 2. No box_predictor.py, altere ligeiramente " box_encodings = tf.reshape(
    box_encodings, tf.stack([combined_feature_map_shape[0],
    Combined_feature_map_shape[1] *
    Combined_feature_map_shape[2] *
    num_predictions_per_location,
    1, self._box_code_size]))"

Na verdade, eu não entendo o motivo pelo qual remodelar o tensor com a forma extra "1". Pode ser redundante
op.
Eu tentei o caminho 1 e o sucesso para executar o modelo no celular. Mas ainda um pouco lento. mais tarde vou tentar a maneira 2 para ver se consegue uma velocidade melhor

@Haijunlv Quão boas são as detecções? O modelo lite da demonstração do @andrewharp simplesmente remove todos os nós de pré-processamento e pós-processamento (milhares deles) do gráfico e os substitui por várias linhas de código. não tenho certeza de como vai funcionar..

Acho que há uma solução para o problema do estúdio e do gradle do Android. (por favor, corrija-me se estiver errado ou se houver uma solução melhor):

  • Não é a melhor abordagem, mas existe um plugin Bazel que podemos instalar dentro do Android Studio para "substituir" o Gradle e podemos construir e executar nosso projeto usando o Bazel através do AS.

  • Eu li vários artigos sobre o Bazel e me deparei com essa pergunta no Quora.. e de acordo com a resposta, o tensorflow continuará usando o Bazel, pois explora melhor o framework e fornece melhores resultados.. então acho que como desenvolvedores neste caso específico devemos nos adaptar para ele e deixe o Gradle para trás até que o tensorflow o suporte completamente.

@davidfant
Você conseguiu acessar as várias saídas no TensorFlow Lite C++?

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

Estou progredindo, mas ainda não sei como obter as saídas em C++. Existe alguma documentação sobre isso? É o que tenho no momento. Como eu tenho que acessar a matriz de dados para obter as pontuações?

(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 Fiz algo semelhante e descobri que não funciona. Usando o corte do aplicativo de demonstração do Android, ele produz muito ruído. Se você usar o tensorboard para ler o gráfico, verá que o modelo lite remove milhares de nós de pós-processamento. Acho que a forma atual não funcionaria. Espero que o tensorflow lite suporte esses nós de pós-processamento no futuro, em vez de pedir às pessoas que façam esses hacks que não funcionam.

Obrigado @YijinLiu. Eu vi seu repositório tf-cpu, vou dar uma olhada no seu código para verificar se minha implementação está correta, e ver os resultados mesmo que não sejam bons.

@JaviBonilla , por favor, avise-nos quando descobrir como executar com C++! 🙌

Olá @davidfant ,

Ainda tenho que testar, mas @YijinLiu já descobriu!.

Dê uma olhada no repositório dele (https://github.com/YijinLiu/tf-cpu). Em particular, você pode descobrir como obter as saídas no arquivo $#$ tf-cpu/benchmark/obj_detect_lite.cc $#$, função AnnotateMat() , que é executada após o Interpreter->Invoke() .

@JaviBonilla Eu não terminei o obj_detect_lite.cc, especialmente, para usar os priors para decodificar as caixas de detecção.
O que descobri é que as pontuações não fazem sentido em todos os cenários. Em alguns casos, gera muito ruído. Para outros casos, pode perder algumas boas detecções. Eu olhei para esses nós para converter essas pontuações intermediárias nas pontuações de possibilidades finais. Existem milhares de nós...

@YijinLiu obrigado por esclarecer isso. Então, acho melhor esperar até que mais melhorias sejam incluídas no TensorFlow Lite para detecção de objetos. De qualquer forma, tentarei decodificar as caixas de detecção em C++ se tiver tempo.

Olá @andrewharp ,

Obrigado por seu esforço para fazer o novo projeto de demonstração do Android, mas você poderia escrever um readme.md ou algum documento de descrição em tensorflow/contrib/lite/examples/android para que todos pudéssemos entender facilmente o processo para tornar o tensorflow lite? obrigado~!

Olá, eu executei a demonstração ssd_mobilenet_v1_coco_2017_11_17 com sucesso, então recebo um modelo ajustado. Quando executo o processo do @andrehentz nele, ocorreu um problema:
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

Antes de remover operações não utilizadas: 586 operadores, 871 arrays (0 quantizados)
12/06/2018 15:29:54.273221: I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] Antes das transformações gerais do gráfico: 586 operadores, 871 arrays (0 quantizado)
2018-06-12 15:29:54.300213: I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] Após as transformações gerais do gráfico passar 1: 409 operadores, 688 arrays (0 quantizado)
2018-06-12 15:29:54.309735: I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] Antes das transformações do gráfico de desquantização: 409 operadores, 688 arrays (0 quantizado)
12/06/2018 15:29:54.317395: I tensorflow/contrib/lite/toco/allocate_transient_arrays.cc:329] Tamanho total alocado da matriz transitória: 2880256 bytes, valor ideal teórico: 2880128 bytes.
2018-06-12 15:29:54.319173: F tensorflow/contrib/lite/toco/tflite/export.cc:330] Alguns dos operadores no modelo não são compatíveis com o tempo de execução padrão do TensorFlow Lite. Se você tem uma implementação customizada para eles, você pode desabilitar este erro com --allow_custom_ops, ou configurando allow_custom_ops=True ao chamar tf.contrib.lite.toco_convert(). Aqui está uma lista de operadores para os quais você precisará de implementações personalizadas: RSQRT, SquaredDifference, Stack, TensorFlowShape.

Aqui está o meu modelo https://drive.google.com/open?id=1IxRSU4VSmVmhUtUpSQew_5anEfxTg3Ca

Alguém pode me ajudar?
@andrehentz

@JaviBonilla e @YijinLiu Tenho uma implementação do Python que testei com os modelos SSD MobileNet V{1,2} e SSDLIte MobileNet V2 do Google. Veja a documentação simples aqui .

@freedomtan qual versão do tf você usa? tf 1.8?

@hengshanji master branch após a ligação Python do interpretador tflite (29c129c6). Eu não acho que 1.8 tem a ligação.

@freedomtan tf1.8 tem a ligação do interpretador Python, mas encontro esse tipo de problema "erro nnapi: incapaz de abrir a biblioteca libneuralnetworks.so". onde obter este .so ou como gerá-lo? Obrigado.

Ignore :) É para Android NNAPI.

@freedomtan Você testou o exemplo no aparelho ou no pc? Quando testo no pc, uso o android-28/x86 libneuralnetworks.so, ele mostra o erro "Aborting since tflite return failure".

Como eu disse, ignore esse problema NNAPI. Não se espera que você tenha um libneuralnetwork.so funcionando. Testei meus scripts em um x86 rodando Ubuntu e em uma placa ARMv8 rodando Debian.

@freedomtan , obrigado por compartilhar o código e a documentação.

Baseado no repositório (https://github.com/YijinLiu/tf-cpu). Eu atualizei o tf-cpu/benchmark/obj_detect_lite.cc para obter as saídas. Na função AnnotateMat() adicione o código decodeCenterSizeBoxes para manipular os output_locations, então faça nms para esses resultados.
Ao mesmo tempo, usando o https://github.com/tensorflow/tensorflow/issues/14688 para gerar o libtensorflow-lite.a, ele pode ser executado em um x86 rodando Ubuntu e em um dispositivo Android com modelo tflite em ssdlite_mobilenet_v2_coco_2018_05_09. tar.gz.
Obrigado a todos.

@WeiboXu Você pode compartilhar o código e o modelo aqui?

@freedomtan No seu código de implementação do python, há um arquivo "/tmp/box_priors.txt", você sabe como gerar esse arquivo? Ou como os dados neste arquivo foram calculados? Não há problema em fazer inferência para a imagem com tamanho 300X300, mas a precisão da inferência cairá quando fizer inferência para a imagem com tamanho 224X224

@freedomtan , @andrewharp , O modelo anterior seguindo estas instruções não pode funcionar na última demonstração do TFLite , seja quantificado ou flutuante, porque o modelo tflite na demonstração mais recente do TFLite requer 4 saídas, mas o modelo anterior tem apenas 2 saídas ( concat, concat1).

Por favor ajude, obrigado!

Estas instruções estão sendo atualizadas no momento. Fornecerá link para instruções atualizadas na próxima semana.

@frontword O que em /tmp/box_priors.txt são caixas para pós-processamento. Se você usar o mais recente mencionado por @WenguoLi , não precisará dele. No entanto, até onde posso dizer, essas operações de pós-processamento são implementadas como operações personalizadas do TF Lite. O que significa que você não pode acelerá-los com aceleradores NNAPI sem mais esforços.

Para problemas de tamanho de imagem, sim, acho que alimentar imagens de 224x224 no SSD300 (os modelos lançados pelo Google foram treinados com imagens de 300x300) e ficar com pior precisão não é inesperado.

@WenguoLi Parece-me que o modelo atualizado que você mencionou é bastante fácil de manusear. Veja meu script de atualização . A figura a seguir é gerada por

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

image

Para corrigir a pontuação do resultado da inferência superior a 1 é possível usar o método Java TrackedObject.getCurrentCorrelation() porque isso sempre parece retornar algo menor que 1 (não tenho certeza se está correto ou não). O exemplo do TFLite Android usa Recognition.getConfidence() que sempre parece retornar algo maior que 1

@mpeniak Você executou o modelo tflite ssd mobilenet no Movidius. Também estou planejando fazer algo parecido. Você pode, por favor, orientar um pouco sobre como você fez isso?

@achowdhery Oi, eu vi algumas atualizações das instruções de construção para a demonstração do Android mais recente aqui (https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite/examples/android/app), mas não indicou como podemos realmente converter o modelo pb congelado para o modelo tflite (o detect.tflite quantizado que foi usado na demonstração mais recente). Alguma instrução adicional sobre o fluxo de conversão do modelo quantizado? Além disso, acho que devemos primeiro executar o treinamento quantizado com operações de quantização falsas conforme instruído aqui (https://www.tensorflow.org/performance/quantization) e, em seguida, realizar a conversão do modelo, correto? Além disso, é possível habilitar o NNAPI na demonstração mais recente do Android? Tentei usar tfLite.setUseNNAPI(true) em TFLiteObjectDetectionAPIModel.java mas travou no meu Pixel 2 rodando Android 8.1 (pode funcionar bem sem NNAPI). Alguma sugestão? Obrigado!

@tenoyart A resposta curta para "é possível habilitar o NNAPI na última demonstração do Android?" deve ser NÃO. A resposta não tão curta é que é meio possível se você modificar o interpretador do TF Lite fazer algo como dividir o modelo ou adicionar operações personalizadas correspondentes ao NNAPI.

@achowdhery Vi um artigo do blog TensorFlow seu. São estas as instruções que você mencionou ou mais estão vindo?

sim. Estas são as instruções para treinar e servir o modelo de detecção de objetos no Android.

@freedomtan Obrigado por compartilhar o roteiro.
Em seu script mais recente com pós-processamento , qual arquivo de modelo você está usando?
Você especificou o argumento de optimize_for_inference.py como
--input_names="Pré-processador/sub"
--output_names="detection_boxes,detection_scores,num_detections,detection_classes"

Você vê alguma diferença com/sem pós-processamento?

Obrigado!

Existe alguma maneira de converter modelos SqueezeNet com 4 saídas para tflite?

@chanchanzhang Siga as novas instruções no final do tutorial em https://medium.com/tensorflow/training-and-serving-a-realtime-mobile-object-detector-in-30-minutes-with-cloud-tpus -b78971cf1193
Observe que isso usa um fluxo de trabalho diferente do uso de optimize_for_inference.py

@ashwaniag Se você quiser substituir o Mobilenet pelo classificador SqueezeNet enquanto mantém o SSD depois disso para detecção, tudo bem para o fluxo de trabalho atual.

@achowdhery Ótimo ver o modelo TF Lite no ssd mobilenet v1. O TF Lite suporta totalmente o ssdlite mobilenet v2?

@tenoyart Sim. Qualquer SSD Mobilenet funcionará por meio desse pipeline. Nós não liberamos os arquivos tflite correspondentes em código aberto. Se você encontrar problemas, registre um bug.

@chanchanzhang como @achowdhery disse, por favor use object_detection/export_tflite_ssd_graph.py em vez de optimized_for_inference.py . E o arquivo de modelo tflite que usei é daquele usado pelo exemplo do Android. Você pode obtê-lo aqui .

@achowdhery Acho que não há nós e tensores FakeQuant nos pontos de verificação de ssd_mobilenet_v1_quantized_coco e ssd_mobilenet_v1_0.75_depth_quantized_coco . Você poderia verificá-los?

@freedomtan eu vejo os nós weight_quant e act_quant no gráfico exportado depois de usar object_detection/export_tflite_ssd_graph.py.
Por favor, dê uma captura de tela ou instruções exatas de como você verificou que não há nós Fakequant.
Eu também sou capaz de converter com sucesso os pontos de verificação

@achowdhery Obrigado por verificar. Quando lancei export_tflite_ssd_graph.py nesses dois, não consegui modelos tflite, então inspecionei os postos de controle. O que eu fiz é algo como

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

Nada aparece.

@andrewharp Muito obrigado pela sua classe de inferência cutosm TFLiteObjectDetectionAPIModel.java , eu tentei com seu ssd mobilenet v1 tflite mobilenet_ssd_tflite_v1.zip mas quando o aplicativo inicia parece que há problema na função reconheceImage(final Bitmap bitmap) quando eu chamo tfLite.runForMultipleInputsOutputs(inputArray, outputMap); ele lança essa exceção

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

o erro disse que o comprimento da matriz de saídas é maior que o comprimento da matriz de entradas
Aqui está a condição em 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();
            }
       }
}

e esta é minha matriz de entradas e saídas:

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);

A matriz de saídas:

// 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();

E a Inferência:

// 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();

Eu não entendi o significado deste erro porque eu fiz exatamente o mesmo que sua classe TFLiteObjectDetectionAPIModel.java.
obrigado pela ajuda

@achowdhery Oi, seguindo seu blog eu converti o modelo de ssd_mobilenet_v1_coco_2017_11_17. No entanto, quando usei o mobilenet_ssd.tflite convertido em tflite_demo.apk, recebi o seguinte erro:

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

Alguma idéia por que eu tenho isso? Obrigado.

Esta é uma incompatibilidade de forma porque o tensor de saída esperado é 1,10,4 de tamanho e não 1,1917,4. Para o arquivo de modelo antigo, você precisará regredir para a versão do aplicativo de demonstração de maio. Caso contrário, use os modelos mais recentes lançados para conversão.

@achowdhery Converti meu próprio modelo para tflite e quando o executo. A chamada interpreter->invoke() lança uma falha de seg. Alguma ideia do que pode estar errado?

@ashwaniag Faça os modelos baixados em https://medium.com/tensorflow/training-and-serving-a-realtime-mobile-object-detector-in-30-minutes-with-cloud-tpus-b78971cf1193
compilar para você?
Se sim, forneça novas instruções que você está usando agora quando tiver falha de seg?
Pode haver uma incompatibilidade no tipo/tamanho da entrada, etc.

@achowdhery Funcionou. Eu estava dando o input_arrays errado. Obrigado de qualquer forma!

atualizado ssd_mobilenet_v1_quantized_coco e ssd_mobilenet_v1_0.75_depth_quantized_coco funcionam, se você seguiu o tutorial. Obrigado @achowdhery.

Eu estava olhando TFLiteObjectDetectionAPIModel.java no aplicativo de demonstração de exemplo. Existe uma razão para que outputLocations , outputClasses , outputScores e numDetections sejam alocados em cada recognizeImage aqui ? Parece que eles devem ser pré-alocados.
Eu tentei executar o código com pré-alocação e parece funcionar bem, mas eu só queria ter certeza de que não há nada nos bastidores que introduziria problemas mais tarde.

A pré-alocação é provavelmente mais eficiente. Onde você está pré-alocando para prever problemas?

obrigado pela resposta @achowdhery. Estou deixando a pré-alocação no método estático create como está. Minha única preocupação era que o código parece ter sido escrito para usar pré-alocação (o método estático pré-aloca os arrays), mas por algum motivo os arrays são realocados em cada chamada.

oi @achowdhery , testei a nova demonstração do aplicativo tflite para Android. Funciona perfeitamente para ssd_mobilenet_v1_coco, ssd_mobilenet_v1_0.75_depth_coco, ssd_mobilenet_v1_quantized_coco .
Mas eu tenho essa exceção para os outros modelos 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)

O modelo tflite produziu um índice de classe errado. A exceção faz com que o aplicativo falhe após a detecção por alguns segundos.
ssd_mobilenet_v1_ppn_coco produz caixa delimitadora bagunçada errada, rótulo também.

PPN é um modelo float: você está convertendo o modelo TFLITE usando comandos de conversão float.
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_on_mobile_tensorflowlite.md
Então você também precisa alterar o seguinte em DetectorActivity.java:
private estático final booleano TF_OD_API_IS_QUANTIZED = true;

Eu conhecia essa configuração. Na verdade, quando essa configuração está errada, o aplicativo não pode ser executado.
Você pode ver o ArrayIndexOutOfBoundsException? Eu também tentei o docker do seu tutorial, mas é o mesmo.

OK. registre um novo problema no GitHub com instruções de reprodução exatas. O modelo PPN é uma nova solicitação de recurso para o aplicativo java - responderemos quando pudermos priorizá-lo

Obrigado. O ArrayIndexOutOfBoundsException também acontece com ssd_mobilenet_v1_0.75_depth_quantized_coco, ssdlite_mobilenet_v2_coco. A diferença do PPN é que produz resultados corretos antes do aplicativo travar por essa exceção.

@achowdhery Existe alguma maneira de treinar o modelo de quantização com 4 saídas para tflite usando legacy/train.py já que o novo model_main.py tem bugs?
https://github.com/tensorflow/models/issues/4798

@ashwaniag Você pode diferenciar os dois códigos e adicionar a parte que adiciona a quantização: Observe que a função graph_rewriter é onde as operações de quantização são adicionadas.

@achowdhery : https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_on_mobile_tensorflowlite.md
existe um exemplo ou código de exemplo de como fazer o mesmo no iOS. Até agora, a coisa mais próxima que encontrei foi esta https://github.com/YijinLiu/tf-cpu/blob/master/benchmark/obj_detect_lite.cc que nem sempre funciona.

o aplicativo de demonstração atual do iOS não funciona com o modelo ssd e float.

@achowdhery Treinei meu modelo usando tensorflow v1.9. Convertido para tflite usando as etapas do blog. Não recebo nenhuma detecção. voce tem alguma ideia sobre isso?

@ashwaniag COCO ou animais de estimação? Por favor, abra um novo bug com instruções de reprodução exatas. Outros usuários do GitHub confirmaram seu funcionamento com o Tensorflow 1.10

@achowdhery É meu próprio conjunto de dados. Eu treinei para arquitetura mobilenetv2. Quando executo o modelo .pb (modelo tensorflow), recebo
Não encontrado: Tipo de operação não registrado 'NonMaxSuppressionV3' em binário em execução em VAL5-04. Certifique-se de que o Op e o Kernel estejam registrados no binário em execução neste processo.

Você acha que está relacionado?

@ashwaniag Abra um novo bug e forneça instruções reproduzíveis exatas

@ashwaniag verifique esses dois problemas, eu tive um problema semelhante: # 10254 e # 19854

@achraf-boussaada Obrigado! Eu consertei isso. Foi um problema de incompatibilidade de versão.
@achowdhery Agora, o problema é que o modelo tensorflow completo me dá ótimos resultados, mas o modelo tflite dá resultados muito ruins.

@ashwaniag Por favor, defina resultados muito ruins. Você tem pequenos objetos? Anexe um ponto de verificação de modelo, configuração de pipeline e arquivo de rótulo, bem como uma imagem de amostra para nos ajudar a reproduzir o problema. Obrigado

@oopsodd Olá, também recebo um índice de classe errado. ele reclamou "java.lang.ArrayIndexOutOfBoundsException: length=10; index=-739161663", você pode me ajudar?

Observação Eu criei exemplos de trabalho mínimo do TensorFlow Lite SSD (Detecção de objetos) para iOS e Android; https://github.com/baxterai/tfliteSSDminimalWorkingExample. A versão iOS é baseada em obj_detect_lite.cc por YijinLiu (com função nms por WeiboXu), e a versão Android é baseada em https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/examples/ android tfl Detect. Ele remove toda a sobrecarga como a câmera interna e isola o código principal necessário para detectar objetos e exibir as caixas de detecção.

@baxterai ótimo trabalho! obrigado, vou testar.

Obrigado pelo trabalho incrível de todos! Eu tenho outra pergunta sobre a operação de pós-processamento adicionada recentemente.

A saída do ssd_mobilenet_v1_quantized_coco pré -treinado
está atualmente limitado às 10 principais detecções no quadro, mesmo que as configurações padrão em models/research/object_detection/samples/configs/ like
ssd_mobilenet_v1_quantized_300x300_coco14_sync.config todos especificam um limite mais alto de detecções totais.

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 }

isso é resolvido retreinando a rede com esta configuração de pipeline ou é a dimensionalidade de
'TFLite_Detection_PostProcess' fixado em 10 por outras configurações?

@Georg-W Você também precisará alterar a detecção máxima em export_tflite_ssd_graph.py. Existe uma opção de linha de comando.

@achowdhery ah obrigado! Isso é o que eu perdi.

@andrewharp Muito obrigado pela sua classe de inferência cutosm TFLiteObjectDetectionAPIModel.java , eu tentei com seu ssd mobilenet v1 tflite mobilenet_ssd_tflite_v1.zip mas quando o aplicativo inicia parece que há problema na função reconheceImage(final Bitmap bitmap) quando eu chamo tfLite.runForMultipleInputsOutputs(inputArray, outputMap); ele lança essa exceção

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

o erro disse que o comprimento da matriz de saídas é maior que o comprimento da matriz de entradas
Aqui está a condição em 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();
            }
       }
}

e esta é minha matriz de entradas e saídas:

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) {
// Modelo quantizado
imgData.put((byte) ((pixelValue >> 16) & 0xFF));
imgData.put((byte) ((pixelValue >> 8) & 0xFF));
imgData.put((byte) (pixelValue & 0xFF));
} else { // Modelo flutuante
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 :

// Copie os dados de entrada no TensorFlow.
Trace.beginSection("feed");
outputLocations = new float[1][NUM_DETECTIONS][4];
outputClasses = new float[1][NUM_DETECTIONS];
outputScores = new float[1][NUM_DETECTIONS];
numDetecções = 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();
And the Inference :

// Executa a chamada de inferência.
Trace.beginSection("executar");
Log.d("TAG_INPUT",""+String.valueOf(inputArray.length));
Log.d("TAG_OUTPUT",""+String.valueOf(outputMap.size()));

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

```
Eu não entendi o significado deste erro porque eu fiz exatamente o mesmo que sua classe TFLiteObjectDetectionAPIModel.java.
obrigado pela ajuda

estou com o mesmo problema.. tem solução?
obrigado..

@Georg-W Você também precisará alterar a detecção máxima em export_tflite_ssd_graph.py. Existe uma opção de linha de comando.

Oi

Estou tentando detectar mais de 10 objetos na imagem (que é o padrão)
Estou usando os seguintes comandos:
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

eu também modifiquei
export_tflite_ssd_graph.py
flags.DEFINE_integer('max_detections', 500 <--- em vez de 10,
'Número máximo de detecções (caixas) para mostrar.')
flags.DEFINE_integer('max_classes_per_detection', 1,
'Número de classes a serem exibidas por caixa de detecção.')

mas ainda dando 10 objetos como saída no android [1,10,4].

qualquer ideia?

Eu também estaria interessado na solução do problema @KaviSanth .

Esta solução do @Stevelb deve funcionar. Você pode querer visualizar o gráfico congelado para certificar-se de que max_detections está configurado corretamente.

@achowdhery Obrigado pela sua resposta. Tentei executar os comandos escritos por @andrewharp mas recebo o seguinte erro. Na verdade, toco não está localizado neste lugar. Estou usando a versão master e a versão r1.95 do repositório github.

bazel execute 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=Pré-processador/sub - -output_arrays=concat,concat_1 --inference_type=FLOAT --logtostderr
INFO: ID de invocação: 0e58a5ef-9fee-4619-b760-aeb1c83c9661
ERRO: Ignorando 'tensorflow/contrib/lite/ toco:toco ': nenhum pacote 'tensorflow/contrib/lite/toco': arquivo BUILD não encontrado no caminho do pacote
AVISO: Falha na análise do padrão de destino.
ERRO: nenhum pacote 'tensorflow/contrib/lite/toco': arquivo BUILD não encontrado no caminho do pacote
INFO: Tempo decorrido: 0,179s
INFORMAÇÕES: 0 processos.
FALHA: A compilação NÃO foi concluída com sucesso (0 pacotes carregados)
FALHA: A compilação NÃO foi concluída com sucesso (0 pacotes carregados)
Eu tenho que corrigir que estou executando esses comandos da minha pasta tensorflow local que foi extraída do git.

Eu poderia encontrar um toco em tensorflow/lite/toco e estou apenas testando se funciona.
ok, parece funcionar usando este toco e, além disso, você precisa alterar o caminho $ DETECT_FB para $ PWD/ssd_mobilenet.tflite, pois na pasta contrib/lite apenas algum python está localizado e nada mais.

Aparece um erro de tempo de execução ao adicionar o arquivo .tflite no DetectorActivity de 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) com a linha

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

E/AndroidRuntime: EXCEÇÃO FATAL: main
Processo: myProcess, PID: 32611
java.lang.RuntimeException: Falha ao localizar o nó de entrada 'image_tensor'
em myPackage.myClass.TensorFlowObjectDetectionAPIModel.create(TensorFlowObjectDetectionAPIModel.java:106)

Não é possível usar modelos .tflite nesse aplicativo?

@defaultUser3214 você está usando um modelo de classificador no aplicativo de detecção. MobileNet v1 é um modelo de classificação. Por favor, use o modelo MobileNet SSD

@achowdhery Obrigado! Usar o modelo de wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2017_11_17.tar.gz resultou nesse erro. Mas eu pensei que esta era a versão ssd?

Mas usar o ssd_mobilenet_v1_android_export.pb convertido para .tflite que funcionava como .pb antes produz o mesmo erro.

@defaultUser3214 Essa é uma versão antiga do modelo que não funcionará no aplicativo de demonstração mais recente lançado em julho de 2018. Faça o download dos modelos mais recentes em julho de 2018 no modelo de detecção zoo: eles funcionam no aplicativo. Abra um novo problema se ainda estiver bloqueado.

@SteveIb Você também precisa alterar NUM_DETECTIONS = 500 em TFLiteObjectDetectionAPIModel.java

não é possível converter ssdmobilenet v1 .pb para .tflite
pb gerado por meio da API de detecção de objetos do Tensorflow @aselle @achowdhery

Algum progresso nisso? Tentando converter frozen_inference_graph.pb para arquivo .TFLITE mas recebendo erro

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

Para detecção de objetos personalizados no Android. Alguma idéia sobre diferentes métodos de conversão? Transfira ssd_mobilenet_v1_pets aprendidos no Windows 10 seguindo o tutorial aqui: https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10

Algum progresso nisso? Tentando converter frozen_inference_graph.pb para arquivo .TFLITE mas recebendo erro

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

Para detecção de objetos personalizados no Android. Alguma idéia sobre diferentes métodos de conversão? Transfira ssd_mobilenet_v1_pets aprendidos no Windows 10 seguindo o tutorial aqui: https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10

Apenas para acompanhar isso e ajudar qualquer outra pessoa que estava tendo o mesmo erro - isso é causado pelo uso de um ponto de verificação de modelo incorreto para treinar. Para trabalhar no Android com .tflite, o modelo inicial deve ser MobileNet e também deve ser quantizado e terá esta seção de código ou algo similar no arquivo .config:

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

Está ao vivo agora em tensorflow/contrib/lite/examples/android ! Este é um porte mais completo da demonstração original do TF Android (só falta o exemplo Stylize), e substituirá a outra demonstração em tensorflow/contrib/lite/java/demo daqui para frente.

Um flatbuffer TF Lite convertido pode ser encontrado em mobilenet_ssd_tflite_v1.zip , e você pode encontrar a implementação de inferência Java em TFLiteObjectDetectionAPIModel.java . Observe que isso difere da implementação original do TF, pois as caixas devem ser decodificadas manualmente em Java e um arquivo txt anterior à caixa precisa ser empacotado nos ativos dos aplicativos (acho que o incluído no modelo zip acima deve ser válido para a maioria gráficos).

Durante a conversão de TOCO, um nó de entrada diferente (Pré-processador/sub) é usado, bem como diferentes nós de saída (concat,concat_1). Isso pula algumas partes que são problemáticas para o tflite, até que o gráfico seja reestruturado ou o TF Lite atinja a paridade do TF.

Aqui estão as etapas rápidas para converter um modelo SSD MobileNet para o formato tflite e criar a demonstração para usá-lo:

# 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

Isso funciona como um encanto!

Esta página foi útil?
0 / 5 - 0 avaliações