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" />
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)
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"));
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 KitTensorflow Lite