我目前正在使用 Google ML 和 TensorFlow 开发 Android 应用程序(用 Java 编写)。该应用程序以使用设备相机的实时相机流期间的对象检测为中心,并使用 TensorFlow Lite 模型作为自定义库来获取源文件列表。 TensorFlow Lite 模型专门称为 mobilenet_v1_0.75_192_quantized_1_metadata_1.tflite
,我得到了 here。我的问题是我运行该应用程序以查看它是否会打印列表大小,并且该应用程序启动得很好;相机预览有效,应用程序不会崩溃。但是,我只会遇到这个错误;
Logcat:
2021-07-30 12:19:33.343 15790-15790/? E/objectdetectio: Unknown bits set in runtime_flags: 0x8000
2021-07-30 12:19:33.754 15790-15828/com.example.objectdetection E/Perf: Fail to get file list com.example.objectdetection
2021-07-30 12:19:33.754 15790-15828/com.example.objectdetection E/Perf: getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array
2021-07-30 12:19:33.754 15790-15828/com.example.objectdetection E/Perf: Fail to get file list com.example.objectdetection
2021-07-30 12:19:33.754 15790-15828/com.example.objectdetection E/Perf: getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array
2021-07-30 12:19:33.992 15790-15835/com.example.objectdetection E/libc: access denied finding property "persist.vendor.camera.privapp.list"
根据我的研究,一些结果表明文件路径或根目录在某些方面存在缺陷。但是,我将 .tflite
模型放置在我的资产文件夹中,这让我想知道为什么我会收到这些错误以及我如何解决这些错误。我下面代码中的 Log.d("TAG","onSuccess" + detectedObjects.size());
应该打印对象列表大小,但显然不是。
Mainactivity.java
public class Mainactivity extends AppCompatactivity {
private class YourAnalyzer implements ImageAnalysis.Analyzer {
@Override
@ExperimentalGetImage
public void analyze(ImageProxy imageProxy) {
Image mediaImage = imageProxy.getImage();
if (mediaImage != null) {
InputImage image =
InputImage.fromMediaImage(mediaImage,imageProxy.getImageInfo().getRotationDegrees());
//Pass image to an ML Kit Vision API
//...
LocalModel localModel =
new LocalModel.Builder()
.setassetfilePath("ClassifierModel.tflite")
.build();
CustomObjectDetectorOptions customObjectDetectorOptions =
new CustomObjectDetectorOptions.Builder(localModel)
.setDetectorMode(CustomObjectDetectorOptions.STREAM_MODE)
.enableclassification()
.setClassificationconfidenceThreshold(0.5f)
.setMaxPerObjectLabelCount(3)
.build();
ObjectDetector objectDetector =
ObjectDetection.getclient(customObjectDetectorOptions);
objectDetector.process(image)
.addOnSuccessListener(detectedObjects -> {
Log.d("TAG","onSuccess" + detectedObjects.size());
})
.addOnFailureListener(e -> Log.e("TAG",e.getLocalizedMessage()))
.addOnCompleteListener(result -> imageProxy.close());
}
}
}
private ListenableFuture<ProcessCameraProvider> cameraProviderFuture;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cameraProviderFuture = ProcessCameraProvider.getInstance(this);
cameraProviderFuture.addListener(() -> {
try {
ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
bindPreview(cameraProvider);
} catch (ExecutionException | InterruptedException e) {
}
},ContextCompat.getMainExecutor(this));
}
void bindPreview(@NonNull ProcessCameraProvider cameraProvider) {
PreviewView previewView = findViewById(R.id.previewView);
Preview preview = new Preview.Builder()
.build();
CameraSelector cameraSelector = new CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build();
preview.setSurfaceProvider(previewView.getSurfaceProvider());
Camera camera = cameraProvider.bindToLifecycle((Lifecycleowner)this,cameraSelector,preview);
}
}
另外,为了澄清起见,我的应用程序名称是 ObjectDetection,这将是 .tflite
模型如何放置在我的资产文件夹中的文件路径; ObjectDetection > app > src > main > assets > ClassifierModel.tflite