Skip to content

Drawing the bounding boxes on detection #46

Open
@hafidhhusna

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'}'),
],
),
);
}
}

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions