Source code for dronebuddylib.atoms.objectdetection.mp_object_detection_impl
import pkg_resources
from mediapipe.tasks.python.vision import ObjectDetectorOptions
from dronebuddylib.atoms.objectdetection.i_object_detection import IObjectDetection
import mediapipe as mp
from dronebuddylib.models.enums import Configurations
from dronebuddylib.models.object_detected import ObjectDetected, BoundingBox, ObjectDetectionResult
from dronebuddylib.utils.utils import config_validity_check
from mediapipe.tasks.python import vision, BaseOptions
from dronebuddylib.models.engine_configurations import EngineConfigurations
VisionRunningMode = mp.tasks.vision.RunningMode
[docs]
class MPObjectDetectionImpl(IObjectDetection):
[docs]
def get_class_name(self) -> str:
"""
Returns the class name.
Returns:
str: The class name.
"""
return 'OBJECT_DETECTION_MP'
[docs]
def get_algorithm_name(self) -> str:
"""
Returns the algorithm name.
Returns:
str: The algorithm name.
"""
return 'Mediapipe Object Detection'
def __init__(self, engine_configurations: EngineConfigurations):
"""
Initializes the object detection engine with the given configurations.
Args:
engine_configurations (EngineConfigurations): The engine configurations.
"""
super().__init__(engine_configurations)
config_validity_check(self.get_required_params(),
engine_configurations.get_configurations_for_engine(self.get_class_name()),
self.get_algorithm_name())
# path = pkg_resources.resource_filename(__name__, "resources/efficientdet_lite0.tflite")
path = "efficientdet_lite0.tflite"
configs = engine_configurations.get_configurations_for_engine(self.get_class_name())
model_path = configs.get(Configurations.OBJECT_DETECTION_MP_MODELS_PATH)
if model_path is not None:
path = model_path
options = ObjectDetectorOptions(
base_options=BaseOptions(model_asset_path=path),
max_results=5,
running_mode=VisionRunningMode.IMAGE)
detector = vision.ObjectDetector.create_from_options(options)
self.detector = detector
[docs]
def get_detected_objects(self, image) -> ObjectDetectionResult:
"""
Detects objects in the provided image and returns a result containing a list of detected objects.
Args:
image: The image in which to detect objects.
Returns:
ObjectDetectionResult (ObjectDetectionResult) : A result containing a list of detected objects.
"""
detection_result = self.detector.detect(image)
return_list = []
simple_list = []
for detected_object in detection_result.detections:
formatted_object = ObjectDetected([], BoundingBox(detected_object.bounding_box.origin_x,
detected_object.bounding_box.origin_y,
detected_object.bounding_box.width,
detected_object.bounding_box.height))
highest_confidence = 0
highest_confident_category = ""
for label in detected_object.categories:
formatted_object.add_category(label.category_name, label.score)
if label.score > highest_confidence:
highest_confidence = label.score
formatted_object.add_category(label.category_name, label.score)
highest_confident_category = label.category_name
simple_list.append(highest_confident_category)
return_list.append(formatted_object)
return ObjectDetectionResult(simple_list, return_list)
[docs]
def get_bounding_boxes_of_detected_objects(self, image) -> list:
"""
Detects objects in the provided image and returns a list of bounding boxes for the detected objects.
Args:
image: The image in which to detect objects.
Returns:
list: A list of bounding boxes for the detected objects.
"""
pass
[docs]
def get_required_params(self) -> list:
"""
Returns a list of required configuration parameters.
Returns:
list: A list of required configuration parameters.
"""
return []
[docs]
def get_optional_params(self) -> list:
"""
Returns a list of optional configuration parameters.
Returns:
list: A list of optional configuration parameters.
"""
return [Configurations.OBJECT_DETECTION_MP_MODELS_PATH]