|
|
|
@ -8,9 +8,9 @@ from pathlib import Path
|
|
|
|
|
from types import SimpleNamespace
|
|
|
|
|
from typing import Dict, List, Union
|
|
|
|
|
|
|
|
|
|
from ultralytics import __version__
|
|
|
|
|
from ultralytics.yolo.utils import (DEFAULT_CFG, DEFAULT_CFG_DICT, DEFAULT_CFG_PATH, LOGGER, PREFIX, ROOT,
|
|
|
|
|
USER_CONFIG_DIR, IterableSimpleNamespace, colorstr, emojis, yaml_load, yaml_print)
|
|
|
|
|
USER_CONFIG_DIR, IterableSimpleNamespace, __version__, colorstr, emojis, yaml_load,
|
|
|
|
|
yaml_print)
|
|
|
|
|
from ultralytics.yolo.utils.checks import check_yolo
|
|
|
|
|
|
|
|
|
|
CLI_HELP_MSG = \
|
|
|
|
@ -25,13 +25,13 @@ CLI_HELP_MSG = \
|
|
|
|
|
See all ARGS at https://docs.ultralytics.com/cfg or with 'yolo cfg'
|
|
|
|
|
|
|
|
|
|
1. Train a detection model for 10 epochs with an initial learning_rate of 0.01
|
|
|
|
|
yolo detect train data=coco128.yaml model=yolov8n.pt epochs=10 lr0=0.01
|
|
|
|
|
yolo train data=coco128.yaml model=yolov8n.pt epochs=10 lr0=0.01
|
|
|
|
|
|
|
|
|
|
2. Predict a YouTube video using a pretrained segmentation model at image size 320:
|
|
|
|
|
yolo segment predict model=yolov8n-seg.pt source='https://youtu.be/Zgi9g1ksQHc' imgsz=320
|
|
|
|
|
yolo predict model=yolov8n-seg.pt source='https://youtu.be/Zgi9g1ksQHc' imgsz=320
|
|
|
|
|
|
|
|
|
|
3. Val a pretrained detection model at batch-size 1 and image size 640:
|
|
|
|
|
yolo detect val model=yolov8n.pt data=coco128.yaml batch=1 imgsz=640
|
|
|
|
|
yolo val model=yolov8n.pt data=coco128.yaml batch=1 imgsz=640
|
|
|
|
|
|
|
|
|
|
4. Export a YOLOv8n classification model to ONNX format at image size 224 by 128 (no TASK required)
|
|
|
|
|
yolo export model=yolov8n-cls.pt format=onnx imgsz=224,128
|
|
|
|
@ -56,7 +56,7 @@ CFG_FRACTION_KEYS = {
|
|
|
|
|
'mixup', 'copy_paste', 'conf', 'iou'}
|
|
|
|
|
CFG_INT_KEYS = {
|
|
|
|
|
'epochs', 'patience', 'batch', 'workers', 'seed', 'close_mosaic', 'mask_ratio', 'max_det', 'vid_stride',
|
|
|
|
|
'line_thickness', 'workspace', 'nbs'}
|
|
|
|
|
'line_thickness', 'workspace', 'nbs', 'save_period'}
|
|
|
|
|
CFG_BOOL_KEYS = {
|
|
|
|
|
'save', 'exist_ok', 'pretrained', 'verbose', 'deterministic', 'single_cls', 'image_weights', 'rect', 'cos_lr',
|
|
|
|
|
'overlap_mask', 'val', 'save_json', 'save_hybrid', 'half', 'dnn', 'plots', 'show', 'save_txt', 'save_conf',
|
|
|
|
@ -131,7 +131,7 @@ def get_cfg(cfg: Union[str, Path, Dict, SimpleNamespace] = DEFAULT_CFG, override
|
|
|
|
|
return IterableSimpleNamespace(**cfg)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def check_cfg_mismatch(base: Dict, custom: Dict):
|
|
|
|
|
def check_cfg_mismatch(base: Dict, custom: Dict, e=None):
|
|
|
|
|
"""
|
|
|
|
|
This function checks for any mismatched keys between a custom configuration list and a base configuration list.
|
|
|
|
|
If any mismatched keys are found, the function prints out similar keys from the base list and exits the program.
|
|
|
|
@ -143,12 +143,12 @@ def check_cfg_mismatch(base: Dict, custom: Dict):
|
|
|
|
|
base, custom = (set(x.keys()) for x in (base, custom))
|
|
|
|
|
mismatched = [x for x in custom if x not in base]
|
|
|
|
|
if mismatched:
|
|
|
|
|
string = ''
|
|
|
|
|
for x in mismatched:
|
|
|
|
|
matches = get_close_matches(x, base, 3, 0.6)
|
|
|
|
|
match_str = f"Similar arguments are {matches}." if matches else 'There are no similar arguments.'
|
|
|
|
|
LOGGER.warning(f"'{colorstr('red', 'bold', x)}' is not a valid YOLO argument. {match_str}")
|
|
|
|
|
LOGGER.warning(CLI_HELP_MSG)
|
|
|
|
|
sys.exit()
|
|
|
|
|
matches = get_close_matches(x, base)
|
|
|
|
|
match_str = f"Similar arguments are {matches}." if matches else ''
|
|
|
|
|
string += f"'{colorstr('red', 'bold', x)}' is not a valid YOLO argument. {match_str}\n"
|
|
|
|
|
raise SyntaxError(string + CLI_HELP_MSG) from e
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def merge_equals_args(args: List[str]) -> List[str]:
|
|
|
|
@ -178,10 +178,6 @@ def merge_equals_args(args: List[str]) -> List[str]:
|
|
|
|
|
return new_args
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def argument_error(arg):
|
|
|
|
|
return SyntaxError(f"'{arg}' is not a valid YOLO argument.\n{CLI_HELP_MSG}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def entrypoint(debug=''):
|
|
|
|
|
"""
|
|
|
|
|
This function is the ultralytics package entrypoint, it's responsible for parsing the command line arguments passed
|
|
|
|
@ -212,6 +208,7 @@ def entrypoint(debug=''):
|
|
|
|
|
'settings': lambda: yaml_print(USER_CONFIG_DIR / 'settings.yaml'),
|
|
|
|
|
'cfg': lambda: yaml_print(DEFAULT_CFG_PATH),
|
|
|
|
|
'copy-cfg': copy_default_cfg}
|
|
|
|
|
FULL_ARGS_DICT = {**DEFAULT_CFG_DICT, **{k: None for k in tasks}, **{k: None for k in modes}, **special}
|
|
|
|
|
special = {**special, **{f'-{k}': v for k, v in special.items()}, **{f'--{k}': v for k, v in special.items()}}
|
|
|
|
|
|
|
|
|
|
overrides = {} # basic overrides, i.e. imgsz=320
|
|
|
|
@ -236,7 +233,7 @@ def entrypoint(debug=''):
|
|
|
|
|
v = eval(v)
|
|
|
|
|
overrides[k] = v
|
|
|
|
|
except (NameError, SyntaxError, ValueError, AssertionError) as e:
|
|
|
|
|
raise argument_error(a) from e
|
|
|
|
|
check_cfg_mismatch(FULL_ARGS_DICT, {a: ""}, e)
|
|
|
|
|
|
|
|
|
|
elif a in tasks:
|
|
|
|
|
overrides['task'] = a
|
|
|
|
@ -251,7 +248,7 @@ def entrypoint(debug=''):
|
|
|
|
|
raise SyntaxError(f"'{colorstr('red', 'bold', a)}' is a valid YOLO argument but is missing an '=' sign "
|
|
|
|
|
f"to set its value, i.e. try '{a}={DEFAULT_CFG_DICT[a]}'\n{CLI_HELP_MSG}")
|
|
|
|
|
else:
|
|
|
|
|
raise argument_error(a)
|
|
|
|
|
check_cfg_mismatch(FULL_ARGS_DICT, {a: ""})
|
|
|
|
|
|
|
|
|
|
# Defaults
|
|
|
|
|
task2model = dict(detect='yolov8n.pt', segment='yolov8n-seg.pt', classify='yolov8n-cls.pt')
|
|
|
|
|