框架 | 特点 | 适用场景 |
---|---|---|
TensorFlow Lite | 轻量级TF模型部署 | 移动端推理加速 |
ML Kit | Google官方解决方案 | 快速集成基础功能 |
OpenCV + DNN | 传统图像处理+深度学习 | 自定义算法开发 |
MediaPipe | 多模态处理框架 | 复杂流水线集成 |
implementation 'org.tensorflow:tensorflow-lite:2.9.0' implementation 'org.tensorflow:tensorflow-lite-gpu:2.9.0' implementation 'org.tensorflow:tensorflow-lite-support:0.4.0'
<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" />
// CameraX初始化示例 val cameraProviderFuture = ProcessCameraProvider.getInstance(this) cameraProviderFuture.addListener({ val cameraProvider = cameraProviderFuture.get() val preview = Preview.Builder().build() val imageAnalysis = ImageAnalysis.Builder() .setBackpressureStrategy(STRATEGY_KEEP_ONLY_LATEST) .build() imageAnalysis.setAnalyzer(Executors.newSingleThreadExecutor(), { imageProxy -> // 图像处理逻辑 imageProxy.close() }) val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageAnalysis) }, ContextCompat.getMainExecutor(this))
// TensorFlow Lite推理示例 val interpreter = Interpreter(model) val input = Array(1) { Array(224) { Array(224) { FloatArray(3) } } } // 根据模型调整尺寸 val output = Array(1) { FloatArray(1001) } // 根据模型输出调整 fun analyzeImage(bitmap: Bitmap) { val resized = Bitmap.createScaledBitmap(bitmap, 224, 224, true) val inputData = convertBitmapToFloatArray(resized) interpreter.run(inputData, output) val result = output[0].indexOfFirst { it > 0.5 } // 阈值判断 }
// Canvas绘制识别框 val paint = Paint().apply { color = Color.RED strokeWidth = 5f } canvas.drawRect(rect, paint) // rect为模型输出坐标 canvas.drawText("Label: $label", x, y, paint)
优化方向 | 实施方案 |
---|---|
模型压缩 | 知识蒸馏、量化(FP16/INT8) |
硬件加速 | GPU delegate、NNAPI |
内存优化 | 输入数据复用、Bitmap重用 |
延迟控制 | 异步处理、帧率控制 |
解决方案:
Interpreter.Options
设置不同Delegate: val options = Interpreter.Options() options.addDelegate(GpuDelegate()) // 自动启用GPU加速
优化方案:
ExecutorService
)A:可采用以下策略:
A:推荐两种方案:
val aspectRatio = bitmap.width.toFloat() / bitmap.height val targetWidth = if (aspectRatio > 1) 224 else 112aspectRatio val targetHeight = if (aspectRatio < 1) 224 else 112/aspectRatio
TensorFlow Lite
的dynamic_dimension
参数配置: # 转换时设置动态维度 converter.set_dynamic_input_shapes({'input': [1, None, None, 3]})