Redes neurais no Android, Google ML Kit e nĂŁo apenas

EntĂŁo, vocĂȘ desenvolveu e treinou sua rede neural para executar algum tipo de tarefa (por exemplo, o mesmo reconhecimento de objeto atravĂ©s da cĂąmera) e deseja integrĂĄ-la ao seu aplicativo Android? EntĂŁo seja bem-vindo ao kat!

Para começar, deve-se entender que o androide no momento sabe apenas como trabalhar com redes no formato TensorFlowLite, o que significa que precisamos realizar algumas manipulaçÔes com a rede de origem. Suponha que vocĂȘ jĂĄ tenha uma rede treinada na estrutura Keras ou Tensorflow. VocĂȘ deve salvar a grade no formato pb.

Vamos começar com o caso quando vocĂȘ escreve no Tensorflow, entĂŁo tudo fica um pouco mais fĂĄcil.

saver = tf.train.Saver() tf.train.write_graph(session.graph_def, path_to_folder, "net.pb", False) tf.train.write_graph(session.graph_def, path_to_folder, "net.pbtxt", True) saver.save(session,path_to_folder+"model.ckpt") 

Se vocĂȘ escreve no Keras, precisa criar um novo objeto de sessĂŁo, salvar um link para ele no inĂ­cio do arquivo em que vocĂȘ treina a rede e passĂĄ-lo para a função set_session

 import keras.backend as K session = K.get_session() K.set_session(session) 

Bem, vocĂȘ salvou a rede, agora vocĂȘ precisa convertĂȘ-la para o formato tflite. Para fazer isso, precisamos executar dois pequenos scripts, o primeiro "congela" a rede, o segundo jĂĄ serĂĄ traduzido para o formato desejado. A essĂȘncia do “congelamento” Ă© que tf nĂŁo armazena o peso das camadas no arquivo pb salvo, mas as salva em pontos de verificação especiais. Para a conversĂŁo subsequente em tflite, vocĂȘ precisa de todas as informaçÔes sobre a rede neural em um arquivo.

 freeze_graph --input_binary=false --input_graph=net.pbtxt --output_node_names=result/Softmax --output_graph=frozen_graph.pb --input_checkpoint=model.ckpt 

Observe que vocĂȘ precisa saber o nome do tensor de saĂ­da. No tensorflow, vocĂȘ pode configurĂĄ-lo, no caso de usar o Keras - defina o nome no construtor de camadas

 model.add(Dense(10,activation="softmax",name="result")) 

Nesse caso, o nome do tensor geralmente se parece com "resultado / Softmax"

Caso contrĂĄrio, vocĂȘ pode encontrar o nome da seguinte maneira

 [print(n.name) for n in session.graph.as_graph_def().node] 

Resta executar o segundo script

 toco --graph_def_file=frozen-graph.pb --output_file=model.tflite --output_format=TFLITE --inference_type=FLOAT --input_arrays=input_input --output_arrays=result/Softmax --input_shapes=1,784 

Viva! Agora que vocĂȘ tem um modelo TensorFlowLite em sua pasta, cabe a vocĂȘ integrĂĄ-lo corretamente ao seu aplicativo Android. VocĂȘ pode fazer isso com o novo Firebase ML Kit, mas hĂĄ outra maneira, um pouco mais tarde. Adicione uma dependĂȘncia ao nosso arquivo gradle

 dependencies { // ... implementation 'com.google.firebase:firebase-ml-model-interpreter:16.2.0' } 

Agora vocĂȘ precisa decidir se manterĂĄ o modelo em algum lugar do seu servidor ou serĂĄ enviado com o aplicativo.

Considere o primeiro caso: um modelo no servidor. Primeiro de tudo, não se esqueça de adicionar ao manifesto

 <uses-permission android:name="android.permission.INTERNET" /> 

  //      ,   /  FirebaseModelDownloadConditions.Builder conditionsBuilder = new FirebaseModelDownloadConditions.Builder().requireWifi(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { conditionsBuilder = conditionsBuilder .requireCharging(); } FirebaseModelDownloadConditions conditions = conditionsBuilder.build(); //   FirebaseCloudModelSource ,   (    ,  //   Firebase) FirebaseCloudModelSource cloudSource = new FirebaseCloudModelSource.Builder("my_cloud_model") .enableModelUpdates(true) .setInitialDownloadConditions(conditions) .setUpdatesDownloadConditions(conditions) .build(); FirebaseModelManager.getInstance().registerCloudModelSource(cloudSource); 

Se vocĂȘ usar o modelo incluĂ­do no aplicativo localmente, nĂŁo se esqueça de incluir a seguinte entrada no arquivo build.gradle para que o arquivo do modelo nĂŁo seja compactado

 android { // ... aaptOptions { noCompress "tflite" } } 

Depois disso, por analogia com o modelo na nuvem, nosso neurĂŽnio local precisa ser registrado.

 FirebaseLocalModelSource localSource = new FirebaseLocalModelSource.Builder("my_local_model") .setAssetFilePath("mymodel.tflite") .build(); FirebaseModelManager.getInstance().registerLocalModelSource(localSource); 

O cĂłdigo acima assume que seu modelo estĂĄ na pasta de ativos, caso contrĂĄrio,

  .setAssetFilePath("mymodel.tflite") 

usar

  .seFilePath(filePath) 

Em seguida, criamos novos objetos FirebaseModelOptions e FirebaseModelInterpreter

 FirebaseModelOptions options = new FirebaseModelOptions.Builder() .setCloudModelName("my_cloud_model") .setLocalModelName("my_local_model") .build(); FirebaseModelInterpreter firebaseInterpreter = FirebaseModelInterpreter.getInstance(options); 

VocĂȘ pode usar os modelos local e baseado em servidor ao mesmo tempo. Nesse caso, a nuvem serĂĄ usada por padrĂŁo, se disponĂ­vel, caso contrĂĄrio, local.

Quase tudo, resta criar matrizes para dados de entrada / saĂ­da e executar!

 FirebaseModelInputOutputOptions inputOutputOptions = new FirebaseModelInputOutputOptions.Builder() .setInputFormat(0, FirebaseModelDataType.BYTE, new int[]{1, 640, 480, 3}) .setOutputFormat(0, FirebaseModelDataType.FLOAT32, new int[]{1, 784}) .build(); byte[][][][] input = new byte[1][640][480][3]; input = getYourInputData(); FirebaseModelInputs inputs = new FirebaseModelInputs.Builder() .add(input) // add() as many input arrays as your model requires .build(); Task<FirebaseModelOutputs> result = firebaseInterpreter.run(inputs, inputOutputOptions) .addOnSuccessListener( new OnSuccessListener<FirebaseModelOutputs>() { @Override public void onSuccess(FirebaseModelOutputs result) { // ... } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Task failed with an exception // ... } }); float[][] output = result.<float[][]>getOutput(0); float[] probabilities = output[0]; 

Se, por algum motivo, vocĂȘ nĂŁo quiser usar o Firebase, existe outra maneira, ligar para o intĂ©rprete tflite e alimentĂĄ-lo diretamente.

Adicione uma linha para criar / nivelar

  implementation 'org.tensorflow:tensorflow-lite:+' 

Crie um intérprete e matrizes

  Interpreter tflite = new Interpreter(loadModelFile(getContext(), "model.tflite")); //     inputs tflite.run(inputs,outputs) 

O cĂłdigo nesse caso Ă© muito menor, como vocĂȘ pode ver.

É tudo o que vocĂȘ precisa para usar sua rede neural no Android.

Links Ășteis:

Docas por ML Kit
Tensorflow Lite

Source: https://habr.com/ru/post/pt422041/


All Articles