Description
i have the problem on the bounding boxes not drawn when i tried to run the inference on my flutter app code
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:ultralytics_yolo/predict/detect/detect.dart';
import 'package:ultralytics_yolo/ultralytics_yolo.dart';
import 'package:ultralytics_yolo/yolo_model.dart';
class ScanController extends StatefulWidget {
const ScanController({super.key});
@OverRide
State createState() => _ScanControllerState();
}
class _ScanControllerState extends State {
final controller = UltralyticsYoloCameraController();
bool _cameraPermissionGranted = false;
ObjectDetector? predictor;
@OverRide
void initState() {
super.initState();
_checkCameraPermission();
}
Future _checkCameraPermission() async {
try {
final cameraStatus = await Permission.camera.status;
print('Initial Camera status: $cameraStatus');
if (!cameraStatus.isGranted) {
print('Requesting camera permission...');
final statuses = await [Permission.camera].request();
print('Permission statuses after request: $statuses');
setState(() {
_cameraPermissionGranted = statuses[Permission.camera] == PermissionStatus.granted;
});
} else {
setState(() {
_cameraPermissionGranted = true;
});
}
} catch (e) {
print('Error checking/requesting camera permission: $e');
setState(() {
_cameraPermissionGranted = false;
});
}
print('Final Camera Permission granted: $_cameraPermissionGranted');
}
@OverRide
Widget build(BuildContext context) {
return Scaffold(
body: !_cameraPermissionGranted
? Center(child: Text('Camera permission not granted'))
: FutureBuilder(
future: _initObjectDetector(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator());
} else if (snapshot.hasError) {
print('Error initializing detector: ${snapshot.error}');
return Center(child: Text('Error initializing detector: ${snapshot.error}'));
}
predictor = snapshot.data;
if (predictor == null) {
print('Predictor initialization failed');
return Center(child: Text('Predictor initialization failed'));
}
return Stack(
children: [
UltralyticsYoloCameraPreview(
predictor: predictor!,
controller: controller,
onCameraCreated: () async {
try {
print('Attempting to load model...');
await predictor!.loadModel(useGpu: false);
print('Model loaded successfully');
} catch (e) {
print('Error loading model: $e');
}
},
),
StreamBuilder<double?>(
stream: predictor!.inferenceTime,
builder: (context, snapshot) {
final inferenceTime = snapshot.data;
print('Inference Time StreamBuilder updated: ${inferenceTime?.toStringAsFixed(2) ?? 'N/A'} ms');
return StreamBuilder<double?>(
stream: predictor!.fpsRate,
builder: (context, snapshot) {
final fpsRate = snapshot.data;
print('FPS Rate StreamBuilder updated: ${fpsRate?.toStringAsFixed(2) ?? 'N/A'}');
return Times(
inferenceTime: inferenceTime,
fpsRate: fpsRate,
);
},
);
},
),
],
);
},
),
);
}
Future _initObjectDetector() async {
final model = LocalYoloModel(
id: '',
modelPath: 'assets/model/BILI.tflite',
task: Task.classify,
format: Format.tflite,
metadataPath: 'assets/metadata/metadata.yaml',
);
try {
final detector = ObjectDetector(model: model);
print('ObjectDetector initialized successfully');
return detector;
} catch (e) {
print('Error initializing ObjectDetector: $e');
rethrow;
}
}
}
class Times extends StatelessWidget {
final double? inferenceTime;
final double? fpsRate;
const Times({
Key? key,
required this.inferenceTime,
required this.fpsRate,
}) : super(key: key);
@OverRide
Widget build(BuildContext context) {
return Positioned(
bottom: 10,
left: 10,
child: Column(
children: [
Text('Inference Time: ${inferenceTime?.toStringAsFixed(2) ?? 'N/A'} ms'),
Text('FPS Rate: ${fpsRate?.toStringAsFixed(2) ?? 'N/A'}'),
],
),
);
}
}