继续收到此错误 "Failed to initialize detector"。我没有正确加载 tflite 模型吗?
Keep receiving this error "Failed to initialize detector". Am I not loading the tflite model correctly?
我正在尝试使用我的 Android 应用设置 ImageAnalyzer,以便我可以使用 Google 的 ML 套件 API 运行 object 分类。正如标题所暗示的,我目前面临的问题是不断看到错误“无法初始化检测器”。
我已经重新阅读 this tutorial about three times now and followed 关于面临相同错误的人(尽管出于不同的原因)无济于事。我还确保 CameraX API 的所有内容(我稍后将展示的 ImageAnalyzer 代码除外)都按预期工作。
如 ML Kit 文档中所述,这是我关于设置 LocalModel
、CustomObjectDetectorOptions
和 ObjectDetector
的代码:
LocalModel localModel = new LocalModel.Builder()
.setAssetFilePath("mobilenet_v1_1.0_224_quantized_1_metadata_1.tflite")
.build();
CustomObjectDetectorOptions customObjectDetectorOptions =
new CustomObjectDetectorOptions.Builder(localModel)
.setDetectorMode(CustomObjectDetectorOptions.STREAM_MODE)
.enableClassification()
.setClassificationConfidenceThreshold(0.5f)
.setMaxPerObjectLabelCount(3)
.build();
ObjectDetector objectDetector = ObjectDetection.getClient(customObjectDetectorOptions);
这是我的 ImageAnalyzer 代码,它基本上通过 processImage
辅助方法调用 ML Kit API:
// Creates an ImageAnalysis for analyzing the camera preview feed
ImageAnalysis imageAnalysis = new ImageAnalysis.Builder()
.setTargetResolution(new Size(224, 224))
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build();
imageAnalysis.setAnalyzer(ContextCompat.getMainExecutor(this),
new ImageAnalysis.Analyzer() {
@Override
public void analyze(@NonNull ImageProxy imageProxy) {
@SuppressLint("UnsafeExperimentalUsageError") Image mediaImage =
imageProxy.getImage();
if (mediaImage != null) {
Log.i(TAG, "Obtained ImageProxy object");
processImage(mediaImage, imageProxy)
.addOnCompleteListener(new OnCompleteListener<List<DetectedObject>>() {
@Override
public void onComplete(@NonNull Task<List<DetectedObject>> task) {
imageProxy.close();
}
});
}
}
});
这是 processImage
辅助方法,我实际上在其中调用了 objectDetector.process(...)
,实际上 运行 是 tflite 模型的代码行。
private Task<List<DetectedObject>> processImage(Image mediaImage, ImageProxy imageProxy) {
InputImage image =
InputImage.fromMediaImage(mediaImage,
imageProxy.getImageInfo().getRotationDegrees());
return objectDetector.process(image)
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
String error = "Failed to process. Error: " + e.getMessage();
Log.i(TAG, error);
}
})
.addOnSuccessListener(new OnSuccessListener<List<DetectedObject>>() {
@Override
public void onSuccess(List<DetectedObject> results) {
String success = "Object(s) detected successfully!";
Log.i(TAG, success);
for (DetectedObject detectedObject : results) {
Rect boundingBox = detectedObject.getBoundingBox();
Integer trackingId = detectedObject.getTrackingId();
for (DetectedObject.Label label : detectedObject.getLabels()) {
String text = label.getText();
int index = label.getIndex();
float confidence = label.getConfidence();
Log.i(TAG, "Object detected: " + text + "; "
+ "Confidence: " + confidence);
}
}
}
});
}
基本上,一旦我 运行 应用程序,logcat 就会重复记录这两行。我知道这意味着 ImageAnalyzer 不断尝试分析图像输入,但由于某种原因 LocalModel
无法处理输入
2021-01-21 22:02:24.020 9328-9328/com.example.camerax I/MainActivity: Obtained ImageProxy object
2021-01-21 22:02:24.036 9328-9328/com.example.camerax I/MainActivity: Failed to process. Error: Failed to initialize detector.
我才刚刚开始使用 Android,尤其是 Android 中的 ML,因此我们将不胜感激!
我设法在有人回答之前解决了我的问题,但如果有人像我一样刚开始学习Android,我会把我的解决方案留在这里。
基本上,记得在 /src/main 目录 而不是 /src/androidTest 目录中创建资产文件夹:P
一旦我这样做了,模型就正确加载了,现在我只需要弄清楚如何在我的应用程序中显示结果。
// Do NOT compress tflite model files (need to call out to developers!)
aaptOptions {
noCompress "tflite"
}
在构建 gradle 中为应用添加此行 android 标签
我正在尝试使用我的 Android 应用设置 ImageAnalyzer,以便我可以使用 Google 的 ML 套件 API 运行 object 分类。正如标题所暗示的,我目前面临的问题是不断看到错误“无法初始化检测器”。
我已经重新阅读 this tutorial about three times now and followed
如 ML Kit 文档中所述,这是我关于设置 LocalModel
、CustomObjectDetectorOptions
和 ObjectDetector
的代码:
LocalModel localModel = new LocalModel.Builder()
.setAssetFilePath("mobilenet_v1_1.0_224_quantized_1_metadata_1.tflite")
.build();
CustomObjectDetectorOptions customObjectDetectorOptions =
new CustomObjectDetectorOptions.Builder(localModel)
.setDetectorMode(CustomObjectDetectorOptions.STREAM_MODE)
.enableClassification()
.setClassificationConfidenceThreshold(0.5f)
.setMaxPerObjectLabelCount(3)
.build();
ObjectDetector objectDetector = ObjectDetection.getClient(customObjectDetectorOptions);
这是我的 ImageAnalyzer 代码,它基本上通过 processImage
辅助方法调用 ML Kit API:
// Creates an ImageAnalysis for analyzing the camera preview feed
ImageAnalysis imageAnalysis = new ImageAnalysis.Builder()
.setTargetResolution(new Size(224, 224))
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build();
imageAnalysis.setAnalyzer(ContextCompat.getMainExecutor(this),
new ImageAnalysis.Analyzer() {
@Override
public void analyze(@NonNull ImageProxy imageProxy) {
@SuppressLint("UnsafeExperimentalUsageError") Image mediaImage =
imageProxy.getImage();
if (mediaImage != null) {
Log.i(TAG, "Obtained ImageProxy object");
processImage(mediaImage, imageProxy)
.addOnCompleteListener(new OnCompleteListener<List<DetectedObject>>() {
@Override
public void onComplete(@NonNull Task<List<DetectedObject>> task) {
imageProxy.close();
}
});
}
}
});
这是 processImage
辅助方法,我实际上在其中调用了 objectDetector.process(...)
,实际上 运行 是 tflite 模型的代码行。
private Task<List<DetectedObject>> processImage(Image mediaImage, ImageProxy imageProxy) {
InputImage image =
InputImage.fromMediaImage(mediaImage,
imageProxy.getImageInfo().getRotationDegrees());
return objectDetector.process(image)
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
String error = "Failed to process. Error: " + e.getMessage();
Log.i(TAG, error);
}
})
.addOnSuccessListener(new OnSuccessListener<List<DetectedObject>>() {
@Override
public void onSuccess(List<DetectedObject> results) {
String success = "Object(s) detected successfully!";
Log.i(TAG, success);
for (DetectedObject detectedObject : results) {
Rect boundingBox = detectedObject.getBoundingBox();
Integer trackingId = detectedObject.getTrackingId();
for (DetectedObject.Label label : detectedObject.getLabels()) {
String text = label.getText();
int index = label.getIndex();
float confidence = label.getConfidence();
Log.i(TAG, "Object detected: " + text + "; "
+ "Confidence: " + confidence);
}
}
}
});
}
基本上,一旦我 运行 应用程序,logcat 就会重复记录这两行。我知道这意味着 ImageAnalyzer 不断尝试分析图像输入,但由于某种原因 LocalModel
无法处理输入
2021-01-21 22:02:24.020 9328-9328/com.example.camerax I/MainActivity: Obtained ImageProxy object
2021-01-21 22:02:24.036 9328-9328/com.example.camerax I/MainActivity: Failed to process. Error: Failed to initialize detector.
我才刚刚开始使用 Android,尤其是 Android 中的 ML,因此我们将不胜感激!
我设法在有人回答之前解决了我的问题,但如果有人像我一样刚开始学习Android,我会把我的解决方案留在这里。
基本上,记得在 /src/main 目录 而不是 /src/androidTest 目录中创建资产文件夹:P
一旦我这样做了,模型就正确加载了,现在我只需要弄清楚如何在我的应用程序中显示结果。
// Do NOT compress tflite model files (need to call out to developers!)
aaptOptions {
noCompress "tflite"
}
在构建 gradle 中为应用添加此行 android 标签