انتقل إلى المحتوى

مرجع ل ultralytics/models/rtdetr/val.py

ملاحظه

هذا الملف متاح في https://github.com/ultralytics/ultralytics/ نقطة / الرئيسية /ultralytics/ نماذج / RTDETR / فال .py. إذا اكتشفت مشكلة ، فيرجى المساعدة في إصلاحها من خلال المساهمة في طلب 🛠️ سحب. شكرا لك 🙏!



ultralytics.models.rtdetr.val.RTDETRDataset

قواعد: YOLODataset

في الوقت الحقيقي DEtection و TRacking (RT-DETR) فئة مجموعة البيانات توسيع فئة YOLODataset الأساسية.

تم تصميم فئة مجموعة البيانات المتخصصة هذه للاستخدام مع RT-DETR نموذج الكشف عن الكائنات وهو محسن ل مهام الكشف والتتبع في الوقت الحقيقي.

شفرة المصدر في ultralytics/models/rtdetr/val.py
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 3839404142 43 444546 4748 4950
class RTDETRDataset(YOLODataset):
    """
    Real-Time DEtection and TRacking (RT-DETR) dataset class extending the base YOLODataset class.

    This specialized dataset class is designed for use with the RT-DETR object detection model and is optimized for
    real-time detection and tracking tasks.
    """

    def __init__(self, *args, data=None, **kwargs):
        """Initialize the RTDETRDataset class by inheriting from the YOLODataset class."""
        super().__init__(*args, data=data, **kwargs)

    # NOTE: add stretch version load_image for RTDETR mosaic
    def load_image(self, i, rect_mode=False):
        """Loads 1 image from dataset index 'i', returns (im, resized hw)."""
        return super().load_image(i=i, rect_mode=rect_mode)

    def build_transforms(self, hyp=None):
        """Temporary, only for evaluation."""
        if self.augment:
            hyp.mosaic = hyp.mosaic if self.augment and not self.rect else 0.0
            hyp.mixup = hyp.mixup if self.augment and not self.rect else 0.0
            transforms = v8_transforms(self, self.imgsz, hyp, stretch=True)
        else:
            # transforms = Compose([LetterBox(new_shape=(self.imgsz, self.imgsz), auto=False, scaleFill=True)])
            transforms = Compose([])
        transforms.append(
            Format(
                bbox_format="xywh",
                normalize=True,
                return_mask=self.use_segments,
                return_keypoint=self.use_keypoints,
                batch_idx=True,
                mask_ratio=hyp.mask_ratio,
                mask_overlap=hyp.overlap_mask,
            )
        )
        return transforms

__init__(*args, data=None, **kwargs)

تهيئة الفئة RTDETRDataset عن طريق الوراثة من الفئة YOLODataset.

شفرة المصدر في ultralytics/models/rtdetr/val.py
def __init__(self, *args, data=None, **kwargs):
    """Initialize the RTDETRDataset class by inheriting from the YOLODataset class."""
    super().__init__(*args, data=data, **kwargs)

build_transforms(hyp=None)

مؤقت ، فقط للتقييم.

شفرة المصدر في ultralytics/models/rtdetr/val.py
30 31 32 3334 35 36 37 38 39 40 4142 43444546474849 50
def build_transforms(self, hyp=None):
    """Temporary, only for evaluation."""
    if self.augment:
        hyp.mosaic = hyp.mosaic if self.augment and not self.rect else 0.0
        hyp.mixup = hyp.mixup if self.augment and not self.rect else 0.0
        transforms = v8_transforms(self, self.imgsz, hyp, stretch=True)
    else:
        # transforms = Compose([LetterBox(new_shape=(self.imgsz, self.imgsz), auto=False, scaleFill=True)])
        transforms = Compose([])
    transforms.append(
        Format(
            bbox_format="xywh",
            normalize=True,
            return_mask=self.use_segments,
            return_keypoint=self.use_keypoints,
            batch_idx=True,
            mask_ratio=hyp.mask_ratio,
            mask_overlap=hyp.overlap_mask,
        )
    )
    return transforms

load_image(i, rect_mode=False)

تحميل صورة 1 من فهرس مجموعة البيانات 'i' ، إرجاع (im ، تغيير حجم hw).

شفرة المصدر في ultralytics/models/rtdetr/val.py
def load_image(self, i, rect_mode=False):
    """Loads 1 image from dataset index 'i', returns (im, resized hw)."""
    return super().load_image(i=i, rect_mode=rect_mode)



ultralytics.models.rtdetr.val.RTDETRValidator

Bases: DetectionValidator

يعمل RTDETRValidator على توسيع فئة DetectionValidator لتوفير إمكانات التحقق من الصحة المصممة خصيصا ل ال RT-DETR (في الوقت الحقيقي DETR) نموذج الكشف عن الكائنات.

تسمح الفئة ببناء مجموعة بيانات خاصة ب RTDETR للتحقق من صحتها ، وتطبق قمع غير أقصى ل المعالجة اللاحقة ، وتحديث مقاييس التقييم وفقا لذلك.

مثل
from ultralytics.models.rtdetr import RTDETRValidator

args = dict(model='rtdetr-l.pt', data='coco8.yaml')
validator = RTDETRValidator(args=args)
validator()
ملاحظه

لمزيد من التفاصيل حول السمات والأساليب، راجع الفئة DetectionValidator الأصل.

شفرة المصدر في ultralytics/models/rtdetr/val.py
53 54 55 56 57 58  59 60 61 62 63 64 65 66 67  68 69 70  71 72 73  74 75 76 77  78         79 80   81 82 83  84   85  86       87   88 89 90 91 92 93 94 95 96 97 98    99 100   101 102 103 104 105 106 107 108 109 110  111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127128129 130131132
class RTDETRValidator(DetectionValidator):
    """
    RTDETRValidator extends the DetectionValidator class to provide validation capabilities specifically tailored for
    the RT-DETR (Real-Time DETR) object detection model.

    The class allows building of an RTDETR-specific dataset for validation, applies Non-maximum suppression for
    post-processing, and updates evaluation metrics accordingly.

    Example:
        ```python
        from ultralytics.models.rtdetr import RTDETRValidator

        args = dict(model='rtdetr-l.pt', data='coco8.yaml')
        validator = RTDETRValidator(args=args)
        validator()
        ```

    Note:
        For further details on the attributes and methods, refer to the parent DetectionValidator class.
    """

    def build_dataset(self, img_path, mode="val", batch=None):
        """
        Build an RTDETR Dataset.

        Args:
            img_path (str): Path to the folder containing images.
            mode (str): `train` mode or `val` mode, users are able to customize different augmentations for each mode.
            batch (int, optional): Size of batches, this is for `rect`. Defaults to None.
        """
        return RTDETRDataset(
            img_path=img_path,
            imgsz=self.args.imgsz,
            batch_size=batch,
            augment=False,  # no augmentation
            hyp=self.args,
            rect=False,  # no rect
            cache=self.args.cache or None,
            prefix=colorstr(f"{mode}: "),
            data=self.data,
        )

    def postprocess(self, preds):
        """Apply Non-maximum suppression to prediction outputs."""
        bs, _, nd = preds[0].shape
        bboxes, scores = preds[0].split((4, nd - 4), dim=-1)
        bboxes *= self.args.imgsz
        outputs = [torch.zeros((0, 6), device=bboxes.device)] * bs
        for i, bbox in enumerate(bboxes):  # (300, 4)
            bbox = ops.xywh2xyxy(bbox)
            score, cls = scores[i].max(-1)  # (300, )
            # Do not need threshold for evaluation as only got 300 boxes here
            # idx = score > self.args.conf
            pred = torch.cat([bbox, score[..., None], cls[..., None]], dim=-1)  # filter
            # Sort by confidence to correctly get internal metrics
            pred = pred[score.argsort(descending=True)]
            outputs[i] = pred  # [idx]

        return outputs

    def _prepare_batch(self, si, batch):
        """Prepares a batch for training or inference by applying transformations."""
        idx = batch["batch_idx"] == si
        cls = batch["cls"][idx].squeeze(-1)
        bbox = batch["bboxes"][idx]
        ori_shape = batch["ori_shape"][si]
        imgsz = batch["img"].shape[2:]
        ratio_pad = batch["ratio_pad"][si]
        if len(cls):
            bbox = ops.xywh2xyxy(bbox)  # target boxes
            bbox[..., [0, 2]] *= ori_shape[1]  # native-space pred
            bbox[..., [1, 3]] *= ori_shape[0]  # native-space pred
        return dict(cls=cls, bbox=bbox, ori_shape=ori_shape, imgsz=imgsz, ratio_pad=ratio_pad)

    def _prepare_pred(self, pred, pbatch):
        """Prepares and returns a batch with transformed bounding boxes and class labels."""
        predn = pred.clone()
        predn[..., [0, 2]] *= pbatch["ori_shape"][1] / self.args.imgsz  # native-space pred
        predn[..., [1, 3]] *= pbatch["ori_shape"][0] / self.args.imgsz  # native-space pred
        return predn.float()

build_dataset(img_path, mode='val', batch=None)

إنشاء مجموعة بيانات RTDETR.

البارامترات:

اسم نوع وصف افتراضي
img_path str

المسار إلى المجلد الذي يحتوي على الصور.

مطلوب
mode str

train الوضع أو val الوضع ، يمكن للمستخدمين تخصيص تعزيزات مختلفة لكل وضع.

'val'
batch int

حجم الدفعات ، هذا من أجل rect. الإعدادات الافتراضية إلى لا شيء.

None
شفرة المصدر في ultralytics/models/rtdetr/val.py
74 75 76 77 78 79 80 81 82 83 848586878889909192 93
def build_dataset(self, img_path, mode="val", batch=None):
    """
    Build an RTDETR Dataset.

    Args:
        img_path (str): Path to the folder containing images.
        mode (str): `train` mode or `val` mode, users are able to customize different augmentations for each mode.
        batch (int, optional): Size of batches, this is for `rect`. Defaults to None.
    """
    return RTDETRDataset(
        img_path=img_path,
        imgsz=self.args.imgsz,
        batch_size=batch,
        augment=False,  # no augmentation
        hyp=self.args,
        rect=False,  # no rect
        cache=self.args.cache or None,
        prefix=colorstr(f"{mode}: "),
        data=self.data,
    )

postprocess(preds)

تطبيق قمع غير أقصى لمخرجات التنبؤ.

شفرة المصدر في ultralytics/models/rtdetr/val.py
95 96 97 98  99 100 101 102 103 104  105 106 107 108 109 110111
def postprocess(self, preds):
    """Apply Non-maximum suppression to prediction outputs."""
    bs, _, nd = preds[0].shape
    bboxes, scores = preds[0].split((4, nd - 4), dim=-1)
    bboxes *= self.args.imgsz
    outputs = [torch.zeros((0, 6), device=bboxes.device)] * bs
    for i, bbox in enumerate(bboxes):  # (300, 4)
        bbox = ops.xywh2xyxy(bbox)
        score, cls = scores[i].max(-1)  # (300, )
        # Do not need threshold for evaluation as only got 300 boxes here
        # idx = score > self.args.conf
        pred = torch.cat([bbox, score[..., None], cls[..., None]], dim=-1)  # filter
        # Sort by confidence to correctly get internal metrics
        pred = pred[score.argsort(descending=True)]
        outputs[i] = pred  # [idx]

    return outputs





تم إنشاء 2023-11-12, اخر تحديث 2023-11-25
المؤلفون: جلين جوشر (3) ، يضحك س (1)