Android рдореЗрдВ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ, Google рдПрдордПрд▓ рдХрд┐рдЯ рдФрд░ рди рдХреЗрд╡рд▓

рддреЛ, рдЖрдкрдиреЗ рдЕрдкрдиреЗ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдп (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреИрдорд░реЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╣реА рд╡рд╕реНрддреБ рдХреА рдкрд╣рдЪрд╛рди) рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдлрд┐рд░ рдХреИрдЯ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдВрдбреНрд░реЙрдЗрдб рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ TensorFlowLite- рдкреНрд░рд╛рд░реВрдк рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рдирддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╕реНрд░реЛрдд рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЗрд░рд╕ рдпрд╛ рдЯреЗрдиреНрд╕рд░рдлреНрд▓реЛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдиреЗрдЯрд╡рд░реНрдХ рд╣реИред рдЖрдкрдХреЛ рдЧреНрд░рд┐рдб рдХреЛ pb рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ рд╕реЗрд╡ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЪрд▓реЛ рдорд╛рдорд▓реЗ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рдЖрдк рдЯреЗрдВрд╕рд░рдлрд╝реНрд▓реЛ рдкрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИред

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

рдпрджрд┐ рдЖрдк рдХреЗрд░рд╕ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рд╕рддреНрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдк рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕ рдлрд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рд▓рд┐рдВрдХ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдЗрд╕реЗ set_session рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВ

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

рдареАрдХ рд╣реИ, рдЖрдкрдиреЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рд╕рд╣реЗрдЬ рд▓рд┐рдпрд╛ рд╣реИ, рдЕрдм рдЖрдкрдХреЛ рдЗрд╕реЗ tflite рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рджреЛ рдЫреЛрдЯреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдкрд╣рд▓рд╛ "рдлреНрд░реАрдЬрд╝" рдиреЗрдЯрд╡рд░реНрдХ, рджреВрд╕рд░рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рд╣реЛрдЧрд╛ред "рдлреНрд░реАрдЬ" рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ tf рд╕рд╣реЗрдЬреА рдЧрдИ pb рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рддреЛрдВ рдХреЗ рд╡рдЬрди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╢реЗрд╖ рдЪреМрдХрд┐рдпреЛрдВ рдореЗрдВ рдмрдЪрд╛рддрд╛ рд╣реИред Tflite рдореЗрдВ рдмрд╛рдж рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдЪрд╛рд╣рд┐рдПред

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

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдЯреЗрдВрд╕рд░ рдХрд╛ рдирд╛рдо рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЯреЗрдирд╕рдлрд╝реНрд▓реЛ рдореЗрдВ рдЖрдк рдХреЗрд░рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЦреБрдж рдХреЛ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд▓реЗрдпрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдирд╛рдо рд╕реЗрдЯ рдХрд░реЗрдВ

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

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЯреЗрдВрд╕рд░ рдХрд╛ рдирд╛рдо рдЖрдорддреМрд░ рдкрд░ "рдкрд░рд┐рдгрд╛рдо / рд╕реЙрдлреНрдЯрдореИрдХреНрд╕" рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ

рдпрджрд┐ рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдирд╛рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ

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

рдпрд╣ рджреВрд╕рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ

 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 

рд╣реБрд░реНрд░реЗ! рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ TensorFlowLite рдореЙрдбрд▓ рд╣реИ, рдпрд╣ рдЖрдкрдХреЗ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдКрдкрд░ рд╣реИред рдЖрдк рдЗрд╕реЗ newfangled Firebase ML Kit рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдмрд╛рдж рдореЗрдВред рд╣рдорд╛рд░реА рд╢реНрд░реЗрдгреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВ

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

рдЕрдм рдЖрдкрдХреЛ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдореЙрдбрд▓ рдХреЛ рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдХрд╣реАрдВ рд░рдЦреЗрдВрдЧреЗ, рдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рд╢рд┐рдк рдХрд░реЗрдВрдЧреЗред

рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рдореЙрдбрд▓ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░рдХрдЯ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рди рднреВрд▓реЗрдВ

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

рдпрджрд┐ рдЖрдк рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмрд┐рд▓реНрдб.рдЧреНрд░реЗрдб рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЬреЛрдбрд╝рдирд╛ рди рднреВрд▓реЗрдВ рддрд╛рдХрд┐ рдореЙрдбрд▓ рдлрд╝рд╛рдЗрд▓ рд╕рдВрдкреАрдбрд╝рд┐рдд рди рд╣реЛ

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

рдЬрд┐рд╕рдХреЗ рдмрд╛рдж, рдХреНрд▓рд╛рдЙрдб рдореЗрдВ рдореЙрдбрд▓ рдХреЗ рдЕрдиреБрд░реВрдк, рд╣рдорд╛рд░реЗ рд╕реНрдерд╛рдиреАрдп рдиреНрдпреВрд░реЙрди рдХреЛ рдкрдВрдЬреАрдХреГрдд рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

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

рдЖрдкрдХреЗ рдореЙрдбрд▓ рдХреЗ рдКрдкрд░ рдХреЛрдб рдорд╛рди рд╕рдВрдкрддреНрддрд┐ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣реИ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп

  .setAssetFilePath("mymodel.tflite") 

рдЙрдкрдпреЛрдЧ

  .seFilePath(filePath) 

рдлрд┐рд░ рд╣рдо рдирдП рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ FirebaseModelOptions рдФрд░ FirebaseModelInterpreter

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

рдЖрдк рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдФрд░ рд╕рд░реНрд╡рд░-рдЖрдзрд╛рд░рд┐рдд рджреЛрдиреЛрдВ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреНрд▓рд╛рдЙрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрджрд┐ рдЙрдкрд▓рдмреНрдз рд╣реЛ, рдЕрдиреНрдпрдерд╛ рд╕реНрдерд╛рдиреАрдпред

рд▓рдЧрднрдЧ рд╕рдм рдХреБрдЫ, рдпрд╣ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд╕рд░рдгрд┐рдпрд╛рдБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ, рдФрд░ рдЪрд▓рддрд╛ рд╣реИ!

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

рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЖрдк рдлрд╛рдпрд░рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ, рдЯреИрдлрд▓рд╛рдЗрдЯ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ рд╕реАрдзреЗ рдбреЗрдЯрд╛ рдЦрд┐рд▓рд╛рдирд╛ред

рдирд┐рд░реНрдорд╛рдг / рд╢реНрд░реЗрдгреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ

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

рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рдФрд░ рд╕рд░рдгрд┐рдпрд╛рдБ рдмрдирд╛рдПрдБ

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

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдб рдмрд╣реБрдд рдХрдо рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдмрд╕ рдЖрдкрдХреЛ Android рдореЗрдВ рдЕрдкрдиреЗ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ:

рдПрдордПрд▓ рдХрд┐рдЯ рджреНрд╡рд╛рд░рд╛ рдмрдВрдж рдбреЙрдХ
Tensorflow Lite

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


All Articles