From 512a225ce87952b233e6c377cc40b96424ef9d1e Mon Sep 17 00:00:00 2001 From: Ayush Chaurasia Date: Wed, 23 Nov 2022 16:07:27 +0530 Subject: [PATCH] Cli support (#50) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Glenn Jocher --- .github/workflows/ci.yaml | 4 +-- .gitignore | 4 ++- README.md | 28 ++++++++++++---- setup.py | 5 ++- ultralytics/__init__.py | 2 +- ultralytics/yolo/__init__.py | 36 +++++++++++++++++++-- ultralytics/yolo/utils/configs/default.yaml | 4 ++- ultralytics/yolo/v8/classify/__init__.py | 2 +- ultralytics/yolo/v8/segment/__init__.py | 2 +- 9 files changed, 70 insertions(+), 17 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index ae23219..63ec1a2 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -94,8 +94,8 @@ jobs: - name: Test segmentation shell: bash # for Windows compatibility run: | - python ultralytics/yolo/v8/segment/train.py model=yolov5n-seg.yaml data=coco128-seg.yaml epochs=1 img_size=64 + yolo task=segment mode=train model=yolov5n-seg.yaml data=coco128-seg.yaml epochs=1 img_size=64 - name: Test classification shell: bash # for Windows compatibility run: | - python ultralytics/yolo/v8/classify/train.py model=resnet18 data=mnist160 epochs=1 img_size=32 + yolo task=classify mode=train model=resnet18 data=mnist160 epochs=1 img_size=32 diff --git a/.gitignore b/.gitignore index ed06157..2898fbb 100644 --- a/.gitignore +++ b/.gitignore @@ -131,4 +131,6 @@ dmypy.json # datasets and projects datasets/ ultralytics-yolo/ -runs/ \ No newline at end of file +runs/ + +.DS_Store \ No newline at end of file diff --git a/README.md b/README.md index 0992175..6e1e857 100644 --- a/README.md +++ b/README.md @@ -3,18 +3,32 @@ ### Install ```bash +pip install ultralytics +``` +Development +``` git clone https://github.com/ultralytics/ultralytics cd ultralytics -python -m pip install --upgrade pip wheel -pip install . # (dev) -# pip install ultralytics (production) +pip install -e . ``` -### Usage - +## Usage +### 1. CLI +To simply use the latest Ultralytics YOLO models +```bash +yolo task=detect mode=train model=s.yaml ... + classify infer s-cls.yaml + segment val s-seg.yaml +``` +### 2. Python SDK +To use pythonic interface of Ultralytics YOLO model ```python import ultralytics -from ultralytics import HUB, YOLO +from ultralytics import YOLO -ultralytics.checks() +model = YOLO() +model.new("s-seg.yaml") # automatically detects task type +model.load("s-seg.pt") # load checkpoint +model.train(data="coco128-segments", epochs=1, lr0=0.01, ...) ``` +If you're looking to modify YOLO for R&D or to build on top of it, refer to [Using Trainer]() Guide on our docs. diff --git a/setup.py b/setup.py index 7494ae8..7085012 100644 --- a/setup.py +++ b/setup.py @@ -46,4 +46,7 @@ setup( "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Scientific/Engineering :: Image Recognition", "Operating System :: POSIX :: Linux", "Operating System :: MacOS", "Operating System :: Microsoft :: Windows"], - keywords="machine-learning, deep-learning, vision, ML, DL, AI, YOLO, YOLOv3, YOLOv5, YOLOv8, HUB, Ultralytics") + keywords="machine-learning, deep-learning, vision, ML, DL, AI, YOLO, YOLOv3, YOLOv5, YOLOv8, HUB, Ultralytics", + entry_points={ + 'console_scripts': [ + 'yolo = ultralytics.yolo.__init__:cli',],}) diff --git a/ultralytics/__init__.py b/ultralytics/__init__.py index 47bcd18..7eeb1e9 100644 --- a/ultralytics/__init__.py +++ b/ultralytics/__init__.py @@ -1 +1 @@ -__version__ = "0.0.1.dev0" +__version__ = "8.0.0.dev0" diff --git a/ultralytics/yolo/__init__.py b/ultralytics/yolo/__init__.py index fa1c3b2..d100fb9 100644 --- a/ultralytics/yolo/__init__.py +++ b/ultralytics/yolo/__init__.py @@ -1,7 +1,39 @@ -import ultralytics.yolo.v8 as v8 +import hydra + +import ultralytics +import ultralytics.yolo.v8 as yolo from .engine.model import YOLO -from .engine.trainer import BaseTrainer +from .engine.trainer import DEFAULT_CONFIG, BaseTrainer from .engine.validator import BaseValidator +from .utils import LOGGER __all__ = ["BaseTrainer", "BaseValidator", "YOLO"] # allow simpler import + + +@hydra.main(version_base=None, config_path="utils/configs", config_name="default") +def cli(cfg): + LOGGER.info(f"using Ultralytics YOLO v{ultralytics.__version__}") + module_file = None + if cfg.task.lower() == "detect": + module_file = yolo.detect + elif cfg.task.lower() == "segment": + module_file = yolo.segment + elif cfg.task.lower() == "classify": + module_file = yolo.classify + + if not module_file: + raise Exception("task not recognized. Choices are `'detect', 'segment', 'classify'`") + + module_function = None + + if cfg.mode.lower() == "train": + module_function = module_file.train + elif cfg.mode.lower() == "val": + module_function = module_file.val + elif cfg.mode.lower() == "infer": + module_function = module_file.infer + + if not module_function: + raise Exception("mode not recognized. Choices are `'train', 'val', 'infer'`") + module_function(cfg) diff --git a/ultralytics/yolo/utils/configs/default.yaml b/ultralytics/yolo/utils/configs/default.yaml index a1887bd..278e87f 100644 --- a/ultralytics/yolo/utils/configs/default.yaml +++ b/ultralytics/yolo/utils/configs/default.yaml @@ -1,6 +1,9 @@ # YOLO 🚀 by Ultralytics, GPL-3.0 license # Default training settings and hyperparameters for medium-augmentation COCO training +# Task and Mode +task: "classify" # choices=['detect', 'segment', 'classify'] +mode: "train" # choice=['train', 'val', 'infer'] # Train settings ------------------------------------------------------------------------------------------------------- model: null # i.e. yolov5s.pt, yolo.yaml @@ -36,7 +39,6 @@ max_det: 300 half: True plots: False save_txt: False -task: 'val' # Hyperparameters ------------------------------------------------------------------------------------------------------ lr0: 0.001 # initial learning rate (SGD=1E-2, Adam=1E-3) diff --git a/ultralytics/yolo/v8/classify/__init__.py b/ultralytics/yolo/v8/classify/__init__.py index 23a43a3..90eb7df 100644 --- a/ultralytics/yolo/v8/classify/__init__.py +++ b/ultralytics/yolo/v8/classify/__init__.py @@ -1,4 +1,4 @@ -from ultralytics.yolo.v8.classify.train import ClassificationTrainer +from ultralytics.yolo.v8.classify.train import ClassificationTrainer, train from ultralytics.yolo.v8.classify.val import ClassificationValidator __all__ = ["train"] diff --git a/ultralytics/yolo/v8/segment/__init__.py b/ultralytics/yolo/v8/segment/__init__.py index 3575c95..1f39867 100644 --- a/ultralytics/yolo/v8/segment/__init__.py +++ b/ultralytics/yolo/v8/segment/__init__.py @@ -1,2 +1,2 @@ -from ultralytics.yolo.v8.segment.train import SegmentationTrainer +from ultralytics.yolo.v8.segment.train import SegmentationTrainer, train from ultralytics.yolo.v8.segment.val import SegmentationValidator