diff --git a/requirements.txt b/requirements.txt index 0f9bd3fa7..3c5c2104f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -37,6 +37,7 @@ seaborn>=0.11.0 ipython # interactive notebook psutil # system utilization thop>=0.1.1 # FLOPs computation +wheel>=0.38.0 # Snyk vulnerability fix # albumentations>=1.0.3 # pycocotools>=2.0.6 # COCO mAP # roboflow diff --git a/setup.py b/setup.py index fef391bf0..4d3563caa 100644 --- a/setup.py +++ b/setup.py @@ -41,14 +41,22 @@ setup( 'dev': ['check-manifest', 'pytest', 'pytest-cov', 'coverage', 'mkdocs', 'mkdocstrings[python]', 'mkdocs-material']}, classifiers=[ - "Intended Audience :: Developers", "Intended Audience :: Science/Research", - "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", - "Topic :: Software Development", "Topic :: Scientific/Engineering", + "Intended Audience :: Developers", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Topic :: Software Development", + "Topic :: Scientific/Engineering", "Topic :: Scientific/Engineering :: Artificial Intelligence", - "Topic :: Scientific/Engineering :: Image Recognition", "Operating System :: POSIX :: Linux", - "Operating System :: MacOS", "Operating System :: Microsoft :: Windows"], + "Topic :: Scientific/Engineering :: Image Recognition", + "Operating System :: POSIX :: Linux", + "Operating System :: MacOS", + "Operating System :: Microsoft :: Windows", + "Development Status :: 4 - Beta",], keywords="machine-learning, deep-learning, vision, ML, DL, AI, YOLO, YOLOv3, YOLOv5, YOLOv8, HUB, Ultralytics", entry_points={ 'console_scripts': ['yolo = ultralytics.yolo.cfg:entrypoint', 'ultralytics = ultralytics.yolo.cfg:entrypoint']}) diff --git a/ultralytics/yolo/cfg/__init__.py b/ultralytics/yolo/cfg/__init__.py index 33a2e4ccc..b6a271003 100644 --- a/ultralytics/yolo/cfg/__init__.py +++ b/ultralytics/yolo/cfg/__init__.py @@ -122,7 +122,7 @@ def get_cfg(cfg: Union[str, Path, Dict, SimpleNamespace] = DEFAULT_CFG, override f"Valid '{k}' values are between 0.0 and 1.0.") elif k in CFG_INT_KEYS and not isinstance(v, int): raise TypeError(f"'{k}={v}' is of invalid type {type(v).__name__}. " - f"'{k}' must be an int (i.e. '{k}=0')") + f"'{k}' must be an int (i.e. '{k}=8')") elif k in CFG_BOOL_KEYS and not isinstance(v, bool): raise TypeError(f"'{k}={v}' is of invalid type {type(v).__name__}. " f"'{k}' must be a bool (i.e. '{k}=True' or '{k}=False')") diff --git a/ultralytics/yolo/utils/__init__.py b/ultralytics/yolo/utils/__init__.py index 0a0b33382..6a9dd2dca 100644 --- a/ultralytics/yolo/utils/__init__.py +++ b/ultralytics/yolo/utils/__init__.py @@ -18,6 +18,7 @@ from typing import Union import cv2 import numpy as np import pandas as pd +import requests import torch import yaml @@ -345,8 +346,31 @@ def get_git_branch(): return None # if not git dir or on error +def get_latest_pypi_version(package_name='ultralytics'): + """ + Returns the latest version of a PyPI package without downloading or installing it. + + Parameters: + package_name (str): The name of the package to find the latest version for. + + Returns: + str: The latest version of the package. + """ + response = requests.get(f"https://pypi.org/pypi/{package_name}/json") + if response.status_code == 200: + return response.json()["info"]["version"] + return None + + def get_default_args(func): - # Get func() default arguments + """Returns a dictionary of default arguments for a function. + + Args: + func (callable): The function to inspect. + + Returns: + dict: A dictionary where each key is a parameter name, and each value is the default value of that parameter. + """ signature = inspect.signature(func) return {k: v.default for k, v in signature.parameters.items() if v.default is not inspect.Parameter.empty}