predict.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. # Ultralytics YOLO 🚀, AGPL-3.0 license
  2. import torch
  3. from ultralytics.engine.predictor import BasePredictor
  4. from ultralytics.engine.results import Results
  5. from ultralytics.utils import DEFAULT_CFG
  6. class ClassificationPredictor(BasePredictor):
  7. """
  8. A class extending the BasePredictor class for prediction based on a classification model.
  9. Notes:
  10. - Torchvision classification models can also be passed to the 'model' argument, i.e. model='resnet18'.
  11. Example:
  12. ```python
  13. from ultralytics.utils import ASSETS
  14. from ultralytics.models.yolo.classify import ClassificationPredictor
  15. args = dict(model='yolov8n-cls.pt', source=ASSETS)
  16. predictor = ClassificationPredictor(overrides=args)
  17. predictor.predict_cli()
  18. ```
  19. """
  20. def __init__(self, cfg=DEFAULT_CFG, overrides=None, _callbacks=None):
  21. super().__init__(cfg, overrides, _callbacks)
  22. self.args.task = 'classify'
  23. def preprocess(self, img):
  24. """Converts input image to model-compatible data type."""
  25. if not isinstance(img, torch.Tensor):
  26. img = torch.stack([self.transforms(im) for im in img], dim=0)
  27. img = (img if isinstance(img, torch.Tensor) else torch.from_numpy(img)).to(self.model.device)
  28. return img.half() if self.model.fp16 else img.float() # uint8 to fp16/32
  29. def postprocess(self, preds, img, orig_imgs):
  30. """Post-processes predictions to return Results objects."""
  31. results = []
  32. is_list = isinstance(orig_imgs, list) # input images are a list, not a torch.Tensor
  33. for i, pred in enumerate(preds):
  34. orig_img = orig_imgs[i] if is_list else orig_imgs
  35. img_path = self.batch[0][i]
  36. results.append(Results(orig_img, path=img_path, names=self.model.names, probs=pred))
  37. return results