text: Title: [Detections] - make `from_ultralytics` extract class names from result
  Body: ### Description
  
  ultralytics result stores a dict allowing `class_id` to be mapped to `class_name`. You can find it in `result.names`. Perform such a mapping by converting `class_id` values into class names and storing it in the output `Detections.data["class_names"]`. For references a similar mapping has already been done in the [`Detections.from_inference`](https://github.com/roboflow/supervision/blob/30db3c3f0640cc3b9c437ad900efaa2f4d829d1f/supervision/detection/core.py#L411) function, look there for more implementation details.
  
  ### Use case
  
  Note that the class names associated with the detections are available through `detections["class_name"]`.
  
  ```python
  import cv2
  import supervision as sv
  from ultralytics import YOLO
  
  image = cv2.imread(<SOURCE_IMAGE_PATH>)
  model = YOLO("yolov8s.pt")
  
  result = model(image)[0]
  detections = sv.Detections.from_ultralytics(result)
  
  detections.class_id
  # np.array([2, 0])
  
  detections["class_name"]
  # np.array(["car", "person"])
  ```
  
  ### Additional
  
  - Note: Please share a Google Colab with minimal code to test the new feature. We know it's additional work, but it will speed up the review process. The reviewer must test each change. Setting up a local environment to do this is time-consuming. Please ensure that Google Colab can be accessed without any issues (make it public). Thank you! 🙏🏻 