mirror of
				https://github.com/THU-MIG/yolov10.git
				synced 2025-11-04 17:05:40 +08:00 
			
		
		
		
	New dataset fraction=1.0 argument (#2860)
				
					
				
			This commit is contained in:
		
							parent
							
								
									61fa5efe6d
								
							
						
					
					
						commit
						0bdd4ad379
					
				@ -82,6 +82,7 @@ task.
 | 
				
			|||||||
| `close_mosaic`    | `0`      | (int) disable mosaic augmentation for final epochs                          |
 | 
					| `close_mosaic`    | `0`      | (int) disable mosaic augmentation for final epochs                          |
 | 
				
			||||||
| `resume`          | `False`  | resume training from last checkpoint                                        |
 | 
					| `resume`          | `False`  | resume training from last checkpoint                                        |
 | 
				
			||||||
| `amp`             | `True`   | Automatic Mixed Precision (AMP) training, choices=[True, False]             |
 | 
					| `amp`             | `True`   | Automatic Mixed Precision (AMP) training, choices=[True, False]             |
 | 
				
			||||||
 | 
					| `fraction`        | `1.0`    | dataset fraction to train on (default is 1.0, all images in train set)      |
 | 
				
			||||||
| `lr0`             | `0.01`   | initial learning rate (i.e. SGD=1E-2, Adam=1E-3)                            |
 | 
					| `lr0`             | `0.01`   | initial learning rate (i.e. SGD=1E-2, Adam=1E-3)                            |
 | 
				
			||||||
| `lrf`             | `0.01`   | final learning rate (lr0 * lrf)                                             |
 | 
					| `lrf`             | `0.01`   | final learning rate (lr0 * lrf)                                             |
 | 
				
			||||||
| `momentum`        | `0.937`  | SGD momentum/Adam beta1                                                     |
 | 
					| `momentum`        | `0.937`  | SGD momentum/Adam beta1                                                     |
 | 
				
			||||||
 | 
				
			|||||||
@ -104,6 +104,7 @@ The training settings for YOLO models encompass various hyperparameters and conf
 | 
				
			|||||||
| `close_mosaic`    | `0`      | (int) disable mosaic augmentation for final epochs                          |
 | 
					| `close_mosaic`    | `0`      | (int) disable mosaic augmentation for final epochs                          |
 | 
				
			||||||
| `resume`          | `False`  | resume training from last checkpoint                                        |
 | 
					| `resume`          | `False`  | resume training from last checkpoint                                        |
 | 
				
			||||||
| `amp`             | `True`   | Automatic Mixed Precision (AMP) training, choices=[True, False]             |
 | 
					| `amp`             | `True`   | Automatic Mixed Precision (AMP) training, choices=[True, False]             |
 | 
				
			||||||
 | 
					| `fraction`        | `1.0`    | dataset fraction to train on (default is 1.0, all images in train set)      |
 | 
				
			||||||
| `lr0`             | `0.01`   | initial learning rate (i.e. SGD=1E-2, Adam=1E-3)                            |
 | 
					| `lr0`             | `0.01`   | initial learning rate (i.e. SGD=1E-2, Adam=1E-3)                            |
 | 
				
			||||||
| `lrf`             | `0.01`   | final learning rate (lr0 * lrf)                                             |
 | 
					| `lrf`             | `0.01`   | final learning rate (lr0 * lrf)                                             |
 | 
				
			||||||
| `momentum`        | `0.937`  | SGD momentum/Adam beta1                                                     |
 | 
					| `momentum`        | `0.937`  | SGD momentum/Adam beta1                                                     |
 | 
				
			||||||
 | 
				
			|||||||
@ -66,7 +66,7 @@ CLI_HELP_MSG = \
 | 
				
			|||||||
CFG_FLOAT_KEYS = 'warmup_epochs', 'box', 'cls', 'dfl', 'degrees', 'shear'
 | 
					CFG_FLOAT_KEYS = 'warmup_epochs', 'box', 'cls', 'dfl', 'degrees', 'shear'
 | 
				
			||||||
CFG_FRACTION_KEYS = ('dropout', 'iou', 'lr0', 'lrf', 'momentum', 'weight_decay', 'warmup_momentum', 'warmup_bias_lr',
 | 
					CFG_FRACTION_KEYS = ('dropout', 'iou', 'lr0', 'lrf', 'momentum', 'weight_decay', 'warmup_momentum', 'warmup_bias_lr',
 | 
				
			||||||
                     'label_smoothing', 'hsv_h', 'hsv_s', 'hsv_v', 'translate', 'scale', 'perspective', 'flipud',
 | 
					                     'label_smoothing', 'hsv_h', 'hsv_s', 'hsv_v', 'translate', 'scale', 'perspective', 'flipud',
 | 
				
			||||||
                     'fliplr', 'mosaic', 'mixup', 'copy_paste', 'conf', 'iou')  # fractional floats limited to 0.0 - 1.0
 | 
					                     'fliplr', 'mosaic', 'mixup', 'copy_paste', 'conf', 'iou', 'fraction')  # fraction floats 0.0 - 1.0
 | 
				
			||||||
CFG_INT_KEYS = ('epochs', 'patience', 'batch', 'workers', 'seed', 'close_mosaic', 'mask_ratio', 'max_det', 'vid_stride',
 | 
					CFG_INT_KEYS = ('epochs', 'patience', 'batch', 'workers', 'seed', 'close_mosaic', 'mask_ratio', 'max_det', 'vid_stride',
 | 
				
			||||||
                'line_width', 'workspace', 'nbs', 'save_period')
 | 
					                'line_width', 'workspace', 'nbs', 'save_period')
 | 
				
			||||||
CFG_BOOL_KEYS = ('save', 'exist_ok', 'verbose', 'deterministic', 'single_cls', 'rect', 'cos_lr', 'overlap_mask', 'val',
 | 
					CFG_BOOL_KEYS = ('save', 'exist_ok', 'verbose', 'deterministic', 'single_cls', 'rect', 'cos_lr', 'overlap_mask', 'val',
 | 
				
			||||||
 | 
				
			|||||||
@ -30,6 +30,7 @@ cos_lr: False  # use cosine learning rate scheduler
 | 
				
			|||||||
close_mosaic: 0  # (int) disable mosaic augmentation for final epochs
 | 
					close_mosaic: 0  # (int) disable mosaic augmentation for final epochs
 | 
				
			||||||
resume: False  # resume training from last checkpoint
 | 
					resume: False  # resume training from last checkpoint
 | 
				
			||||||
amp: True  # Automatic Mixed Precision (AMP) training, choices=[True, False], True runs AMP check
 | 
					amp: True  # Automatic Mixed Precision (AMP) training, choices=[True, False], True runs AMP check
 | 
				
			||||||
 | 
					fraction: 1.0  # dataset fraction to train on (default is 1.0, all images in train set)
 | 
				
			||||||
# Segmentation
 | 
					# Segmentation
 | 
				
			||||||
overlap_mask: True  # masks should overlap during training (segment train only)
 | 
					overlap_mask: True  # masks should overlap during training (segment train only)
 | 
				
			||||||
mask_ratio: 4  # mask downsample ratio (segment train only)
 | 
					mask_ratio: 4  # mask downsample ratio (segment train only)
 | 
				
			||||||
 | 
				
			|||||||
@ -36,6 +36,7 @@ class BaseDataset(Dataset):
 | 
				
			|||||||
        pad (float, optional): Padding. Defaults to 0.0.
 | 
					        pad (float, optional): Padding. Defaults to 0.0.
 | 
				
			||||||
        single_cls (bool, optional): If True, single class training is used. Defaults to False.
 | 
					        single_cls (bool, optional): If True, single class training is used. Defaults to False.
 | 
				
			||||||
        classes (list): List of included classes. Default is None.
 | 
					        classes (list): List of included classes. Default is None.
 | 
				
			||||||
 | 
					        fraction (float): Fraction of dataset to utilize. Default is 1.0 (use all data).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Attributes:
 | 
					    Attributes:
 | 
				
			||||||
        im_files (list): List of image file paths.
 | 
					        im_files (list): List of image file paths.
 | 
				
			||||||
@ -58,13 +59,15 @@ class BaseDataset(Dataset):
 | 
				
			|||||||
                 stride=32,
 | 
					                 stride=32,
 | 
				
			||||||
                 pad=0.5,
 | 
					                 pad=0.5,
 | 
				
			||||||
                 single_cls=False,
 | 
					                 single_cls=False,
 | 
				
			||||||
                 classes=None):
 | 
					                 classes=None,
 | 
				
			||||||
 | 
					                 fraction=1.0):
 | 
				
			||||||
        super().__init__()
 | 
					        super().__init__()
 | 
				
			||||||
        self.img_path = img_path
 | 
					        self.img_path = img_path
 | 
				
			||||||
        self.imgsz = imgsz
 | 
					        self.imgsz = imgsz
 | 
				
			||||||
        self.augment = augment
 | 
					        self.augment = augment
 | 
				
			||||||
        self.single_cls = single_cls
 | 
					        self.single_cls = single_cls
 | 
				
			||||||
        self.prefix = prefix
 | 
					        self.prefix = prefix
 | 
				
			||||||
 | 
					        self.fraction = fraction
 | 
				
			||||||
        self.im_files = self.get_img_files(self.img_path)
 | 
					        self.im_files = self.get_img_files(self.img_path)
 | 
				
			||||||
        self.labels = self.get_labels()
 | 
					        self.labels = self.get_labels()
 | 
				
			||||||
        self.update_labels(include_class=classes)  # single_cls and include_class
 | 
					        self.update_labels(include_class=classes)  # single_cls and include_class
 | 
				
			||||||
@ -114,6 +117,8 @@ class BaseDataset(Dataset):
 | 
				
			|||||||
            assert im_files, f'{self.prefix}No images found'
 | 
					            assert im_files, f'{self.prefix}No images found'
 | 
				
			||||||
        except Exception as e:
 | 
					        except Exception as e:
 | 
				
			||||||
            raise FileNotFoundError(f'{self.prefix}Error loading data from {img_path}\n{HELP_URL}') from e
 | 
					            raise FileNotFoundError(f'{self.prefix}Error loading data from {img_path}\n{HELP_URL}') from e
 | 
				
			||||||
 | 
					        if self.fraction < 1:
 | 
				
			||||||
 | 
					            im_files = im_files[:round(len(im_files) * self.fraction)]
 | 
				
			||||||
        return im_files
 | 
					        return im_files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def update_labels(self, include_class: Optional[list]):
 | 
					    def update_labels(self, include_class: Optional[list]):
 | 
				
			||||||
 | 
				
			|||||||
@ -69,7 +69,7 @@ def seed_worker(worker_id):  # noqa
 | 
				
			|||||||
    random.seed(worker_seed)
 | 
					    random.seed(worker_seed)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def build_yolo_dataset(cfg, img_path, batch, data_info, mode='train', rect=False, stride=32):
 | 
					def build_yolo_dataset(cfg, img_path, batch, data, mode='train', rect=False, stride=32):
 | 
				
			||||||
    """Build YOLO Dataset"""
 | 
					    """Build YOLO Dataset"""
 | 
				
			||||||
    return YOLODataset(
 | 
					    return YOLODataset(
 | 
				
			||||||
        img_path=img_path,
 | 
					        img_path=img_path,
 | 
				
			||||||
@ -86,7 +86,8 @@ def build_yolo_dataset(cfg, img_path, batch, data_info, mode='train', rect=False
 | 
				
			|||||||
        use_segments=cfg.task == 'segment',
 | 
					        use_segments=cfg.task == 'segment',
 | 
				
			||||||
        use_keypoints=cfg.task == 'pose',
 | 
					        use_keypoints=cfg.task == 'pose',
 | 
				
			||||||
        classes=cfg.classes,
 | 
					        classes=cfg.classes,
 | 
				
			||||||
        data=data_info)
 | 
					        data=data,
 | 
				
			||||||
 | 
					        fraction=cfg.fraction if mode == 'train' else 1.0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def build_dataloader(dataset, batch, workers, shuffle=True, rank=-1):
 | 
					def build_dataloader(dataset, batch, workers, shuffle=True, rank=-1):
 | 
				
			||||||
 | 
				
			|||||||
@ -226,6 +226,8 @@ class ClassificationDataset(torchvision.datasets.ImageFolder):
 | 
				
			|||||||
            cache (Union[bool, str], optional): Cache setting, can be True, False, 'ram' or 'disk'. Defaults to False.
 | 
					            cache (Union[bool, str], optional): Cache setting, can be True, False, 'ram' or 'disk'. Defaults to False.
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        super().__init__(root=root)
 | 
					        super().__init__(root=root)
 | 
				
			||||||
 | 
					        if augment and args.fraction < 1.0:  # reduce training fraction
 | 
				
			||||||
 | 
					            self.samples = self.samples[:round(len(self.samples) * args.fraction)]
 | 
				
			||||||
        self.cache_ram = cache is True or cache == 'ram'
 | 
					        self.cache_ram = cache is True or cache == 'ram'
 | 
				
			||||||
        self.cache_disk = cache == 'disk'
 | 
					        self.cache_disk = cache == 'disk'
 | 
				
			||||||
        self.samples = [list(x) + [Path(x[0]).with_suffix('.npy'), None] for x in self.samples]  # file, index, npy, im
 | 
					        self.samples = [list(x) + [Path(x[0]).with_suffix('.npy'), None] for x in self.samples]  # file, index, npy, im
 | 
				
			||||||
@ -269,4 +271,4 @@ class SemanticDataset(BaseDataset):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def __init__(self):
 | 
					    def __init__(self):
 | 
				
			||||||
        """Initialize a SemanticDataset object."""
 | 
					        """Initialize a SemanticDataset object."""
 | 
				
			||||||
        pass
 | 
					        super().__init__()
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user