Я пытался внедрить модель TensorFlow Lite в приложение, над которым я работал на Java в Android Studio. Я добавил модель в приложение, но всякий раз, когда оно делает снимок и отправляет его через него, я получаю сообщение об ошибке, связанное с тем, что размер буфера недостаточно велик для пикселей.
Вот Ява:
@androidx.camera.core.ExperimentalGetImage
private void takeAndAnalyzeImage() {
if (imageCapture != null) {
imageCapture.takePicture(cameraExecutor, new ImageCapture.OnImageCapturedCallback() {
@Override
public void onCaptureSuccess(ImageProxy image) {
super.onCaptureSuccess(image);
Log.d("CameraXApp", "Image capture success. Processing image...");
Image mediaImage = image.getImage();
if (mediaImage != null) {
Log.d("CameraXApp", "Captured image received. Dimensions: " + mediaImage.getWidth() + "x" + mediaImage.getHeight());
try {
Log.d("CameraXApp", "Converting to Bitmap...");
Bitmap bitmap = toBitmap(mediaImage);
if (bitmap != null) { // Check if bitmap is not null
Log.d("CameraXApp", "Bitmap conversion successful. Resizing...");
// Resize the bitmap to fit the model input size (224x224)
Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, 224, 224, true);
TensorImage tensorImage = TensorImage.fromBitmap(resizedBitmap);
runInference(tensorImage);
} else {
Log.e("CameraXApp", "Bitmap is null. Cannot resize image.");
}
} catch (Exception e) {
Log.e("CameraXApp", "Error converting image to Bitmap: " + e.getMessage());
}
}
image.close();
}
@Override
public void onError(ImageCaptureException exception) {
Log.e("CameraXApp", "Photo capture failed: " + exception.getMessage());
}
});
} else {
Log.e("CameraXApp", "imageCapture is null. Cannot capture image.");
}
}
private Bitmap toBitmap(Image image) {
try {
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
int width = image.getWidth();
int height = image.getHeight();
int pixelStride = image.getPlanes()[0].getPixelStride();
int rowStride = image.getPlanes()[0].getRowStride();
int pixelFormat = image.getFormat();
// Calculate the expected size based on image dimensions and pixel format
int expectedSize;
switch (pixelFormat) {
case ImageFormat.YUV_420_888:
expectedSize = width * height * 3 / 2; // YUV_420_888 format
break;
case ImageFormat.JPEG:
expectedSize = buffer.capacity(); // JPEG format
break;
default:
expectedSize = width * height * 4; // Default to ARGB_8888 format
break;
}
Log.d("CameraXApp", "Buffer size: " + buffer.capacity() + ", Expected size: " + expectedSize);
// Ensure the buffer size is large enough for the pixels
if (buffer.capacity() < expectedSize) {
Log.e("CameraXApp", "Buffer not large enough for pixels");
return null;
}
// Check if pixelStride is zero to avoid divide by zero error
int adjustedWidth = pixelStride != 0 ? width + (rowStride / pixelStride - 1) : width;
Bitmap bitmap = Bitmap.createBitmap(adjustedWidth, height, Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(buffer);
return bitmap;
} catch (Exception e) {
Log.e("CameraXApp", "Error converting image to Bitmap: " + e.getMessage());
return null;
}
}
private void runInference(TensorImage tensorImage) {
try {
FinalModel.Outputs outputs = model.process(tensorImage.getTensorBuffer());
TensorBuffer outputFeature0 = outputs.getOutputFeature0AsTensorBuffer();
// Process the output as needed
// Add a log message to indicate successful analysis
Log.d("ImageAnalysis", "Image analysis completed successfully");
} catch (Exception e) {
Log.e("Error", "Error running inference: " + e.getMessage());
}
}
Я пытался конвертировать фотографии в JPEG после того, как они были сделаны, меняя способ расчета размера буфера, меняя способ расчета пикселей и строк, перематывая растровое изображение и вычисляя больший размер, а также изменение способа расчета и использования rowPadding. Все это привело к одной и той же ошибке: размер буфера был недостаточно велик для пикселей и остановка обработки при попытке преобразовать изображение в растровое изображение.
Я пытался внедрить модель TensorFlow Lite в приложение, над которым я работал на Java в Android Studio. Я добавил модель в приложение, но всякий раз, когда оно делает снимок и отправляет его через него, я получаю сообщение об ошибке, связанное с тем, что размер буфера недостаточно велик для пикселей. Вот Ява: [code]@androidx.camera.core.ExperimentalGetImage private void takeAndAnalyzeImage() { if (imageCapture != null) { imageCapture.takePicture(cameraExecutor, new ImageCapture.OnImageCapturedCallback() { @Override public void onCaptureSuccess(ImageProxy image) { super.onCaptureSuccess(image); Log.d("CameraXApp", "Image capture success. Processing image..."); Image mediaImage = image.getImage(); if (mediaImage != null) { Log.d("CameraXApp", "Captured image received. Dimensions: " + mediaImage.getWidth() + "x" + mediaImage.getHeight()); try { Log.d("CameraXApp", "Converting to Bitmap..."); Bitmap bitmap = toBitmap(mediaImage); if (bitmap != null) { // Check if bitmap is not null Log.d("CameraXApp", "Bitmap conversion successful. Resizing..."); // Resize the bitmap to fit the model input size (224x224) Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, 224, 224, true); TensorImage tensorImage = TensorImage.fromBitmap(resizedBitmap); runInference(tensorImage); } else { Log.e("CameraXApp", "Bitmap is null. Cannot resize image."); } } catch (Exception e) { Log.e("CameraXApp", "Error converting image to Bitmap: " + e.getMessage()); } } image.close(); }
private Bitmap toBitmap(Image image) { try { ByteBuffer buffer = image.getPlanes()[0].getBuffer(); int width = image.getWidth(); int height = image.getHeight(); int pixelStride = image.getPlanes()[0].getPixelStride(); int rowStride = image.getPlanes()[0].getRowStride(); int pixelFormat = image.getFormat();
// Calculate the expected size based on image dimensions and pixel format int expectedSize; switch (pixelFormat) { case ImageFormat.YUV_420_888: expectedSize = width * height * 3 / 2; // YUV_420_888 format break; case ImageFormat.JPEG: expectedSize = buffer.capacity(); // JPEG format break; default: expectedSize = width * height * 4; // Default to ARGB_8888 format break; }
// Ensure the buffer size is large enough for the pixels if (buffer.capacity() < expectedSize) { Log.e("CameraXApp", "Buffer not large enough for pixels"); return null; }
// Check if pixelStride is zero to avoid divide by zero error int adjustedWidth = pixelStride != 0 ? width + (rowStride / pixelStride - 1) : width; Bitmap bitmap = Bitmap.createBitmap(adjustedWidth, height, Bitmap.Config.ARGB_8888); bitmap.copyPixelsFromBuffer(buffer); return bitmap; } catch (Exception e) { Log.e("CameraXApp", "Error converting image to Bitmap: " + e.getMessage()); return null; } }
private void runInference(TensorImage tensorImage) { try { FinalModel.Outputs outputs = model.process(tensorImage.getTensorBuffer()); TensorBuffer outputFeature0 = outputs.getOutputFeature0AsTensorBuffer(); // Process the output as needed
// Add a log message to indicate successful analysis Log.d("ImageAnalysis", "Image analysis completed successfully");
} catch (Exception e) { Log.e("Error", "Error running inference: " + e.getMessage()); } } [/code] Я пытался конвертировать фотографии в JPEG после того, как они были сделаны, меняя способ расчета размера буфера, меняя способ расчета пикселей и строк, перематывая растровое изображение и вычисляя больший размер, а также изменение способа расчета и использования rowPadding. Все это привело к одной и той же ошибке: размер буфера был недостаточно велик для пикселей и остановка обработки при попытке преобразовать изображение в растровое изображение.