рддреЛ, рдЖрдкрдиреЗ рдЕрдкрдиреЗ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдп (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреИрдорд░реЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╣реА рд╡рд╕реНрддреБ рдХреА рдкрд╣рдЪрд╛рди) рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдлрд┐рд░ рдХреИрдЯ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдВрдбреНрд░реЙрдЗрдб рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ 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" />
рдпрджрд┐ рдЖрдк рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмрд┐рд▓реНрдб.рдЧреНрд░реЗрдб рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЬреЛрдбрд╝рдирд╛ рди рднреВрд▓реЗрдВ рддрд╛рдХрд┐ рдореЙрдбрд▓ рдлрд╝рд╛рдЗрд▓ рд╕рдВрдкреАрдбрд╝рд┐рдд рди рд╣реЛ
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)
рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЖрдк рдлрд╛рдпрд░рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ, рдЯреИрдлрд▓рд╛рдЗрдЯ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ рд╕реАрдзреЗ рдбреЗрдЯрд╛ рдЦрд┐рд▓рд╛рдирд╛ред
рдирд┐рд░реНрдорд╛рдг / рд╢реНрд░реЗрдгреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ
implementation 'org.tensorflow:tensorflow-lite:+'
рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рдФрд░ рд╕рд░рдгрд┐рдпрд╛рдБ рдмрдирд╛рдПрдБ
Interpreter tflite = new Interpreter(loadModelFile(getContext(), "model.tflite"));
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдб рдмрд╣реБрдд рдХрдо рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдмрд╕ рдЖрдкрдХреЛ Android рдореЗрдВ рдЕрдкрдиреЗ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ:
рдПрдордПрд▓ рдХрд┐рдЯ рджреНрд╡рд╛рд░рд╛ рдмрдВрдж рдбреЙрдХTensorflow Lite