Flutter中flutter_tflite包获取目标检测宽高的方法咨询
如何用flutter_tflite获取目标检测的宽高信息?
你当前使用的是图像分类模型,这类模型仅输出类别和置信度,不会返回目标的位置/尺寸信息。要获取目标的宽高,必须切换到目标检测任务,使用对应的目标检测模型和flutter_tflite的目标检测API,具体步骤如下:
1. 替换为目标检测模型文件
准备目标检测专用的.tflite模型及对应的标签文件(例如常用的ssd_mobilenet_v1.tflite和ssd_mobilenet_v1.txt),将文件放入项目的assets目录,并在pubspec.yaml中配置资源:
flutter: assets: - assets/ssd_mobilenet_v1.tflite - assets/ssd_mobilenet_v1.txt
2. 初始化目标检测模型
替换原有的分类模型初始化代码,加载目标检测模型:
import 'package:flutter_tflite/flutter_tflite.dart'; // 初始化模型 Future<void> loadDetectionModel() async { await Tflite.loadModel( model: "assets/ssd_mobilenet_v1.tflite", labels: "assets/ssd_mobilenet_v1.txt", ); }
3. 调用目标检测推理API
使用detectObjectOnImage方法替代分类用的runModelOnImage,该方法会返回包含目标位置和尺寸的结果:
Future<void> detectObjects(String imagePath) async { var detectionResults = await Tflite.detectObjectOnImage( path: imagePath, // 待检测图像的本地路径 threshold: 0.3, // 过滤置信度低于0.3的结果 imageMean: 127.5, // 模型要求的图像均值,需匹配模型训练参数 imageStd: 127.5, // 模型要求的图像标准差,需匹配模型训练参数 model: "SSDMobileNet", // 对应加载的模型类型 ); }
4. 解析结果中的宽高信息
detectionResults中的每个元素包含rect字段,其中w和h就是目标的宽高,示例解析代码:
if (detectionResults != null) { for (var result in detectionResults) { Map rect = result['rect']; double targetWidth = rect['w']; double targetHeight = rect['h']; String label = result['detectedClass']; double confidence = result['confidenceInClass']; // 在这里使用目标宽高信息进行后续处理 print("检测到${label},宽:${targetWidth},高:${targetHeight}"); } }
注意事项
- 不同目标检测模型的
imageMean、imageStd等参数可能不同,需参考模型的官方说明调整; - 确保
pubspec.yaml中已正确声明assets资源,且路径与代码中的一致; - 推理完成后记得调用
Tflite.close()释放资源。
内容的提问来源于stack exchange,提问作者Banu prasath S
相关产品推荐
相关产品推荐

