predict.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. # Ultralytics YOLO 🚀, AGPL-3.0 license
  2. from ultralytics.engine.results import Results
  3. from ultralytics.models.yolo.detect.predict import DetectionPredictor
  4. from ultralytics.utils import DEFAULT_CFG, LOGGER, ops
  5. class PosePredictor(DetectionPredictor):
  6. """
  7. A class extending the DetectionPredictor class for prediction based on a pose model.
  8. Example:
  9. ```python
  10. from ultralytics.utils import ASSETS
  11. from ultralytics.models.yolo.pose import PosePredictor
  12. args = dict(model='yolov8n-pose.pt', source=ASSETS)
  13. predictor = PosePredictor(overrides=args)
  14. predictor.predict_cli()
  15. ```
  16. """
  17. def __init__(self, cfg=DEFAULT_CFG, overrides=None, _callbacks=None):
  18. super().__init__(cfg, overrides, _callbacks)
  19. self.args.task = 'pose'
  20. if isinstance(self.args.device, str) and self.args.device.lower() == 'mps':
  21. LOGGER.warning("WARNING ⚠️ Apple MPS known Pose bug. Recommend 'device=cpu' for Pose models. "
  22. 'See https://github.com/ultralytics/ultralytics/issues/4031.')
  23. def postprocess(self, preds, img, orig_imgs):
  24. """Return detection results for a given input image or list of images."""
  25. preds = ops.non_max_suppression(preds,
  26. self.args.conf,
  27. self.args.iou,
  28. agnostic=self.args.agnostic_nms,
  29. max_det=self.args.max_det,
  30. classes=self.args.classes,
  31. nc=len(self.model.names))
  32. results = []
  33. is_list = isinstance(orig_imgs, list) # input images are a list, not a torch.Tensor
  34. for i, pred in enumerate(preds):
  35. orig_img = orig_imgs[i] if is_list else orig_imgs
  36. pred[:, :4] = ops.scale_boxes(img.shape[2:], pred[:, :4], orig_img.shape).round()
  37. pred_kpts = pred[:, 6:].view(len(pred), *self.model.kpt_shape) if len(pred) else pred[:, 6:]
  38. pred_kpts = ops.scale_coords(img.shape[2:], pred_kpts, orig_img.shape)
  39. img_path = self.batch[0][i]
  40. results.append(
  41. Results(orig_img, path=img_path, names=self.model.names, boxes=pred[:, :6], keypoints=pred_kpts))
  42. return results