关键点检测,作为计算机视觉领域的重要分支,广泛应用于人体姿态估计、面部表情识别、手部动作分析等多个场景。其核心在于从图像中准确检测并定位特定的关键点位置。然而,目前存在单阶段和双阶段的关键点检测算法。单阶段的检测算法以yolo为代表的,而双阶段的目前就是mmpose中rtm-pose为代表的(目前个人了解到情况)。这里先了解一下单阶段的yolov8-pose的网络结构。但是在学习之前肯定要安装,而我最近发现其做了一些小改变。所以打算也学习一下其python的新规范pyporject.toml。
1,源码安装yolov8
本来安装没啥说的,但是我发现随着yolov8版本的不断迭代,最新的版本已经没有requirements.txt和setup.py了。在安装的时候,直接使用下面代码会报错:
pip install -e .
报错如下:
File "setup.py" or "setup.cfg" not found. Directory cannot be installed in editable mode: D:\work\ultralytics
(A "pyproject.toml" file was found, but editable mode currently requires a setuptools-based build.)
从报错可以看到,我们目录已经使用pyproject.toml文件来替换所谓的requirement.txt和setup.py了。所以项目已经使用现代的构建工具了。如果我们使用poetry即可。所以说想使用pyproject.toml,并通过pyproject.toml进行依赖包管理。
但是下面方法也可以解决,为了确保我们的python环境是最新的,直接升级pip即可。哈哈哈哈
pip install --upgrade pip
然后再安装也可以成功。但是这样安装还是以安装包的形式。我这样安装后,查看其情况如下:
这样就源码安装了成功了。为了验证是否可以修改代码。我创建一个train_custom.py文件,内容如下:
from ultralytics import YOLO
import os
def train_pose_model():
# load a pretrained model (recommended for training)
weights_path = r"D:\ultralytics\weights\yolov8n-pose.pt"
model = YOLO(weights_path)
# Train the model
# model.train(data='cfg/datasets/tiger-pose.yaml')
# print(model.info())
print(model)
if __name__ == '__main__':
os.environ['WANDB_DISABLED'] = 'true'
train_pose_model()
我们在Pose代码里面初始化加一句调试代码:
然后run一下,查看结果:
说明安装成功!!!
但是我们仍然查看一下pyproject.toml 的内容,当然主要看安装依赖,因为本文主要是安装嘛。
首先,就是pyproject.toml的依赖,据了解pyproject.tom文件是python的包管理工具之一,用于定义构建和打包过程。其依赖如下:
所以我们要确保自己的python环境已经安装了setuptools和wheel这两个Python包。他们是处理pyproject.toml文件所必需的。如果问题仍然存在,我们就需要检查是否安装了正确的python版本。因为某些Python包可能只支持特定版本的Python。比如我们的yolov8就需要Python3.8及其以上。
当然如果还习惯于之前安装的方式。也为了方便起见,我们最简单的就是将其修改为requirements.txt文件,然后使用pip安装。
我这里也提供对应的requirements.txt 和setup.py。
直接使用下面安装即可:
python setup.py install
1,requirement.txt 和 setup.txt
requirement.txt 如下:
#pip install -r requirements.txt
# Ultralytics requirements
# Usage: pip install -r requirements.txt
# Base ----------------------------------------
hydra-core>=1.2.0
matplotlib>=3.2.2
numpy>=1.18.5
opencv-python>=4.1.1
Pillow>=7.1.2
PyYAML>=5.3.1
requests>=2.23.0
scipy>=1.4.1
torch>=1.7.0
torchvision>=0.8.1
tqdm>=4.64.0
# Logging -------------------------------------
tensorboard>=2.4.1
# clearml
# comet
# Plotting ------------------------------------
pandas>=1.1.4
seaborn>=0.11.0
# Export --------------------------------------
# coremltools>=6.0 # CoreML export
# onnx>=1.12.0 # ONNX export
# onnx-simplifier>=0.4.1 # ONNX simplifier
# nvidia-pyindex # TensorRT export
# nvidia-tensorrt # TensorRT export
# scikit-learn==0.19.2 # CoreML quantization
# tensorflow>=2.4.1 # TF exports (-cpu, -aarch64, -macos)
# tensorflowjs>=3.9.0 # TF.js export
# openvino-dev # OpenVINO export
# Extras --------------------------------------
ipython # interactive notebook
psutil # system utilization
thop>=0.1.1 # FLOPs computation
# albumentations>=1.0.3
# pycocotools>=2.0.6 # COCO mAP
# roboflow
# HUB -----------------------------------------
GitPython>=3.1.24
setup.py内容如下:
# Ultralytics YOLO 🚀, GPL-3.0 license
import re
from pathlib import Path
import pkg_resources as pkg
from setuptools import find_packages, setup
# Settings
FILE = Path(__file__).resolve()
ROOT = FILE.parent # root directory
README = (ROOT / "README.md").read_text(encoding="utf-8")
REQUIREMENTS = [f'{x.name}{x.specifier}' for x in pkg.parse_requirements((ROOT / 'requirements.txt').read_text())]
def get_version():
file = ROOT / 'ultralytics/__init__.py'
return re.search(r'^__version__ = [\'"]([^\'"]*)[\'"]', file.read_text(), re.M)[1]
setup(
name="ultralytics", # name of pypi package
version=get_version(), # version of pypi package
python_requires=">=3.7.0",
license='GPL-3.0',
description='Ultralytics YOLOv8 and HUB',
long_description=README,
long_description_content_type="text/markdown",
url="https://github.com/ultralytics/ultralytics",
project_urls={
'Bug Reports': 'https://github.com/ultralytics/ultralytics/issues',
'Funding': 'https://ultralytics.com',
'Source': 'https://github.com/ultralytics/ultralytics',},
author="Ultralytics",
author_email='[email protected]',
packages=find_packages(), # required
include_package_data=True,
install_requires=REQUIREMENTS,
extras_require={
'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",
"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",
entry_points={
'console_scripts': ['yolo = ultralytics.yolo.cli:cli', 'ultralytics = ultralytics.yolo.cli:cli'],})
上面就是最简单,最快的方式了。这样可以在源码修改,并运行。
2,安装包安装
第二个就是官方推荐的方式,但是这样是以安装包的形式安装
都取决于自己哈。这样安装后,安装结果如下:
而既然yolov8都使用了pyproject.toml来管理项目了。说明我已经落后了。所以这篇博文也继续学习一下pyproject.toml是怎么回事呢。
2,pyproject.toml的笔记
1, pyporject.toml背景
pyproject.toml是Python项目中的一个配置文件,类似于之前的requirements.txt文件,用于声明项目所需的依赖项和版本号。它是用来替代旧版本的setup.py文件和requestments.txt文件。pyproject.toml使用TOML(Tom’s Obvious, Minimal Language)格式,具有更简洁和易读的语法。
据了解Python已经从PEP518开始引入和使用pyproject.toml来管理i项目元数据的方案了。而且该规范目前已经在很多开源项目中得到支持。 大家可以去官网查看:PEP 518 – Specifying Minimum Build System Requirements for Python Projects | peps.python.org
从该摘要我们可以看到,此PEP指定了python软件包应如何指定他们具有的构建依赖项,以便执行所选的构建系统。他们引入了一个新的配置文件,用于指定其构建依赖性项(期望未来的配置信息将使用相同的配置文件)。所以说这可能是未来的大势所趋。
下面再来看看为什么选择这种格式:
总的来说,就是项目生成系统依赖项将存储再以TOML格式(pyproject.toml)编写的文件。他们认为这种格式非常灵活,也不会过于复杂。
目前来说它逐渐成为Python项目的首选配置文件之一,特别是在现代的构建工具和发布流程中。
2,PyProject.toml的基本结构
pyproject.toml
文件的基本结构如下:
[build-system] requires = ["setuptools>=40.0.0", "wheel"] build-backend = "setuptools.build_meta" [tool.poetry] name = "example" version = "0.1.0" description = "An example project" authors = ["Lebron James <[email protected]>"] [tool.poetry.dependencies] python = "^3.6" requests = "^2.23.0" [tool.poetry.dev-dependencies] pytest = "^5.4" coverage = "^5.1" [tool.poetry.scripts] say_hello = "example.say_hello:say_hello"
简单学习一下:
- build-system:这部分配置了项目的构建系统,其中requires指定构建该项目所需的依赖包,这里指定了setuptools 和 wheel 的最低版本要求。build-backend指定构建工具的后端模块,这里是 setuptools.build_meta,它告诉构建系统使用 setuptools 作为构建后端。
- tool.poetry:这部分配置了使用Poetry作为构建和依赖管理工具的相关信息。项目的名称,版本号,描述和作者的名字和电子邮件地址。
- dependencies:这部分列出项目运行时所需要的依赖项及其版本约束。python指定支持的python版本范围,这里的^3.6 表示支持Python3.6及以上版本。requests也是同理,^2.23.0 表示至少支持2.23.0版本,但不超过下一个大版本
- dev-dependencies:这部分列出了开发阶段所需要的依赖项及其版本约束。这些依赖项通常用于测试,构建文档等,而不是项目运行时必需的。pytest是测试框架的版本范围,而coverage表示代码覆盖率工具的版本范围。
- scripts:这部分定义了项目中的一些命令行脚本,这些脚本可以作为可执行程序直接运行。比如say_hello这是一个命令行脚本的名称。example.say_hello:say_hello:这是一个指向模块和函数的路径。这里 example.say_hello 是模块名,say_hello 是该模块中定义的函数名。这意味着当你运行 say_hello 脚本时,它将调用 example.say_hello 模块中的 say_hello 函数。
总结起来,pyproject.toml
文件用于定义项目的构建配置、依赖关系以及可执行脚本。这使得项目构建、安装和部署过程更加标准化和自动化。通过这种方式,开发者可以轻松地管理项目依赖项,并确保跨环境的一致性。
2.1,PyProject.toml 的主要用途
- 构建系统配置:指定构建工具及其依赖项。
- 项目元数据:存储有关项目的元数据,如名称、版本号、作者信息等。
- 依赖管理:列出项目所需的依赖项及其版本约束。
- 开发依赖:列出开发过程中所需的额外依赖项。
3,使用pip下载声明的依赖
要使用pip下载并安装pyproject.toml中声明的依赖,我们可以使用poetry工具。Poetry是一个用于管理python包和依赖关系的工具,它提供了一种更便捷的方式来定义和管理项目的依赖。
首先,我们需要安装Poetry工具,可以使用pip安装poetry,命令如下:
pip install poetry
因为我已经安装了,所以给大家看一下我的版本:
安装完成后,我们可以在项目的根目录下运行以下命令来初始化Poetry:
poetry init
Poetry将会引导我们填写项目的元数据和依赖信息。如下:
我们可以查看文件夹下,生成了pyproject.toml文件:
我们打开后,内容如下:
在初始化完成后,我们可以将项目的依赖添加到pyproject.toml文件中。
例如,我们要添加一个名为”requests”的依赖,可以使用以下命令:
poetry add requests
poetry将会自动将依赖信息添加到 pyproject.toml文件中:
然后,我们就可以使用以下命令来安装声明的依赖:
poetry install
poetry 将会自动下载并安装所有声明的依赖项,并将他们存储在项目的虚拟环境中。
这样显示我们在尝试安装当前项目时,poetry发现无法安装,因为没有找到对应的文件或文件夹。所以肯可能出现一些配置问题,导致poetry无法正确处理依赖项。
而实际上我们的项目结构也是不符合poetry的要求,通常情况下,项目结构应该是这样的:
.
├── pyproject.toml
└── src
└── your_package_name
└── __init__.py
└── other_modules.py
但是没关系,我们只是测试,安装依赖,而不是安装项目本身,所以使用 --no-root参数来安装依赖项。
在此之前呢,我为了使得自己的测试更有效,我给依赖里面添加了一个matplotlib。如下:
而这时候,使用poetry install ,则会报下面信息:
Installing dependencies from lock file
pyproject.toml changed significantly since poetry.lock was last generated. Run `poetry lock [--no-update]` to fix the lock file.
从提示来看,表明我们的pyproject.toml文件自从上次生成 poetry.lock
文件以来发生了显著的变化。poetry.lock
文件记录了项目的依赖关系及其确切的版本,以确保每次安装时都能重现相同的环境。
所以按照其说明,我们也需要更新 poetry.lock 文件:
poetry lock
运行 上面命令来更新poetry.lock文件。这会根据pyproject.toml文件中的依赖关系生成了一个新的锁定文件。
当然如果我们想更新依赖并获取最新版本,我们可以使用下面命令,这会根据pyproject.toml文件中的版本约束更新依赖项版本,并更新 poetry.lock 文件。
poetry lock --update
一旦poetry.lock文件更新完毕后,我们可以使用 poetry install 来按照依赖项。
我这里超时了。我就不再继续下去了。
4,使用pip 下载 pyproject.toml 中声明的依赖
除了使用Poetry外,我们也可以使用pip直接下载 pyproject.toml中声明的依赖,pip支持从 pyproject.toml文件中解析依赖。
要使用pip下载并安装 pyproject.toml中声明的依赖,我们可以使用下面命令:
pip install -r pyproject.toml
pip 将会解析 pyproject.toml文件,并下载安装所有声明的依赖项。它会自动安装每一个依赖的正确版本。