ultralytics 8.0.18 new python callbacks and minor fixes (#580)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Jeroen Rombouts <36196499+jarombouts@users.noreply.github.com> Co-authored-by: Glenn Jocher <glenn.jocher@ultralytics.com>
This commit is contained in:
parent
e9ab157330
commit
936414c615
24 changed files with 136 additions and 106 deletions
|
|
@ -307,18 +307,20 @@ def strip_optimizer(f='best.pt', s=''):
|
|||
LOGGER.info(f"Optimizer stripped from {f},{f' saved as {s},' if s else ''} {mb:.1f}MB")
|
||||
|
||||
|
||||
def guess_task_from_head(head):
|
||||
task = None
|
||||
if head.lower() in ["classify", "classifier", "cls", "fc"]:
|
||||
task = "classify"
|
||||
if head.lower() in ["detect"]:
|
||||
task = "detect"
|
||||
if head.lower() in ["segment"]:
|
||||
task = "segment"
|
||||
|
||||
if not task:
|
||||
raise SyntaxError("task or model not recognized! Please refer the docs at : ") # TODO: add docs links
|
||||
|
||||
def guess_task_from_model_yaml(model):
|
||||
try:
|
||||
cfg = model if isinstance(model, dict) else model.yaml # model cfg dict
|
||||
m = cfg["head"][-1][-2].lower() # output module name
|
||||
task = None
|
||||
if m in ["classify", "classifier", "cls", "fc"]:
|
||||
task = "classify"
|
||||
if m in ["detect"]:
|
||||
task = "detect"
|
||||
if m in ["segment"]:
|
||||
task = "segment"
|
||||
except Exception as e:
|
||||
raise SyntaxError('Unknown task. Define task explicitly, i.e. task=detect when running your command. '
|
||||
'Valid tasks are detect, segment, classify.') from e
|
||||
return task
|
||||
|
||||
|
||||
|
|
@ -374,14 +376,36 @@ def profile(input, ops, n=10, device=None):
|
|||
|
||||
|
||||
class EarlyStopping:
|
||||
# early stopper
|
||||
"""
|
||||
Early stopping class that stops training when a specified number of epochs have passed without improvement.
|
||||
"""
|
||||
|
||||
def __init__(self, patience=30):
|
||||
"""
|
||||
Initialize early stopping object
|
||||
|
||||
Args:
|
||||
patience (int, optional): Number of epochs to wait after fitness stops improving before stopping. Default is 30.
|
||||
"""
|
||||
self.best_fitness = 0.0 # i.e. mAP
|
||||
self.best_epoch = 0
|
||||
self.patience = patience or float('inf') # epochs to wait after fitness stops improving to stop
|
||||
self.possible_stop = False # possible stop may occur next epoch
|
||||
|
||||
def __call__(self, epoch, fitness):
|
||||
"""
|
||||
Check whether to stop training
|
||||
|
||||
Args:
|
||||
epoch (int): Current epoch of training
|
||||
fitness (float): Fitness value of current epoch
|
||||
|
||||
Returns:
|
||||
bool: True if training should stop, False otherwise
|
||||
"""
|
||||
if fitness is None: # check if fitness=None (happens when val=False)
|
||||
return False
|
||||
|
||||
if fitness >= self.best_fitness: # >= 0 to allow for early zero-fitness stage of training
|
||||
self.best_epoch = epoch
|
||||
self.best_fitness = fitness
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue