FirebaseCustomRemoteModel не загружается на Android
Я написал код, сославшись на ссылку ниже, чтобы заставить ранее изученный файл tflite работать на Android, но возникает ошибка.
https://firebase.google.com/docs/ml/android/use-custom-models?hl=ko(это ссылка, на которую я ссылался.)
public class MainActivity extends AppCompatActivity {
public FirebaseCustomRemoteModel remoteModel;
public Interpreter interpreter;
public ByteBuffer modelOutput;
public Bitmap bitmapInput;
Button btn_gallery;
ImageView iv_img;
Uri uri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_gallery = findViewById(R.id.btn_gallery);
iv_img = findViewById(R.id.iv_img);
btn_gallery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//이미지를 선택
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "이미지를 선택하세요."), 0);
}
});
}
//결과 처리
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//request코드가 0이고 OK를 선택했고 data에 뭔가가 들어 있다면
if(requestCode == 0 && resultCode == RESULT_OK){
uri = data.getData();
Log.d("URI", "uri:" + String.valueOf(uri));
try {
//Uri 파일을 Bitmap으로 만들어서 ImageView에 집어 넣는다.
bitmapInput = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
iv_img.setImageBitmap(bitmapInput);
} catch (IOException e) {
e.printStackTrace();
}
Log.e("modelDownload()", "실행");
//modelDownload();
modelLocalDownload();
Log.e("initInterpreter()", "실행");
initInterpreter();
runInterpreter();
detection();
}
}
private void modelLocalDownload() {
remoteModel =
new FirebaseCustomRemoteModel.Builder("final_model2").build();
FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
.addOnCompleteListener(new OnCompleteListener<File>() {
@Override
public void onComplete(@NonNull Task<File> task) {
File modelFile = task.getResult();
Log.e("onComplete()", "실행");
if (modelFile != null) {
interpreter = new Interpreter(modelFile);
} else {
try {
InputStream inputStream = getAssets().open("final_model2.tflite");
byte[] model = new byte[inputStream.available()];
inputStream.read(model);
ByteBuffer buffer = ByteBuffer.allocateDirect(model.length)
.order(ByteOrder.nativeOrder());
buffer.put(model);
interpreter = new Interpreter(buffer);
} catch (IOException e) {
// File not found?
}
}
Log.e("localDownload", "성공");
}
});
}
private void detection() {
modelOutput.rewind();
FloatBuffer probabilities = modelOutput.asFloatBuffer();
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(getAssets().open("custom_labels.txt")));
for (int i = 0; i < probabilities.capacity(); i++) {
String label = reader.readLine();
float probability = probabilities.get(i);
Log.e("detection()", String.format("%s: %1.4f", label, probability));
}
} catch (IOException e) {
// File not found?
}
}
private void runInterpreter() {
Bitmap bitmap = Bitmap.createScaledBitmap(bitmapInput, 300, 300, true);
ByteBuffer input = ByteBuffer.allocateDirect(300 * 300 * 3 * 4).order(ByteOrder.nativeOrder());
for (int y = 0; y < 300; y++) {
for (int x = 0; x < 300; x++) {
int px = bitmap.getPixel(x, y);
// Get channel values from the pixel value.
int r = Color.red(px);
int g = Color.green(px);
int b = Color.blue(px);
// Normalize channel values to [-1.0, 1.0]. This requirement depends
// on the model. For example, some models might require values to be
// normalized to the range [0.0, 1.0] instead.
float rf = (r - 127) / 255.0f;
float gf = (g - 127) / 255.0f;
float bf = (b - 127) / 255.0f;
input.putFloat(rf);
input.putFloat(gf);
input.putFloat(bf);
}
}
int bufferSize = 10 * java.lang.Float.SIZE / java.lang.Byte.SIZE;
modelOutput = ByteBuffer.allocateDirect(bufferSize).order(ByteOrder.nativeOrder());
interpreter.run(input, modelOutput);
}
private void initInterpreter() {
FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
.addOnCompleteListener(new OnCompleteListener<File>() {
@Override
public void onComplete(@NonNull Task<File> task) {
File modelFile = task.getResult();
if (modelFile != null) {
interpreter = new Interpreter(modelFile);
}
}
});
}
private void modelDownload() {
remoteModel =
new FirebaseCustomRemoteModel.Builder("dog-cat-detector").build();
FirebaseModelDownloadConditions conditions = new FirebaseModelDownloadConditions.Builder()
.requireWifi()
.build();
FirebaseModelManager.getInstance().download(remoteModel, conditions)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void v) {
// Download complete. Depending on your app, you could enable
// the ML feature, or switch from the local model to the remote
// model, etc.
Log.e("모델다운로드", "성공");
}
});
FirebaseModelManager.getInstance().download(remoteModel, conditions)
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.e("모델다운로드", "실패");
}
});
}
}
java.lang.NullPointerException: попытка вызвать виртуальный метод void org.tensorflow.lite.Interpreter.run(java.lang.Object, java.lang.Object) для ссылки на нулевой объект
И это ошибка.
Ошибка говорит, что интерпретатор имеет значение Null, но даже если я открываю журнал с того места, где загружена модель, он не отображается в logcat, поэтому кажется, что модель не может быть загружена.