Bootstrap

Yolo v8代码逐行解读

train.py文件

1.FILE = Path(__file__).resolve()

       __file__代表的是train.py文件,Path(__file__).resolve()结果是train.py文件的绝对路径。

2.ROOT = FILE.parents[0]

       获得train.py父目录的绝对路径

3.sys.path

       是一个列表list,里面包含了已经添加到系统的环境变量路径

当导入一个模块时,默认情况下python解释器会搜索当前目录已安装的内置模块和第三方模块。搜索路径放在sys模块的path中。sys模块包含与python解释器和它的环境有关的函数,可以通过dir(sys)来查看方法和成员属性。

4.可以永久的将路径添加到sys.path中:

(1)将写好的py文件添加到系统环境变量的目录下。

(2)在 /usr/lib/python10/site-packages 下面新建一个.pth 文件(以pth作为后缀名);将模块的路径写进去,一行一个路径,如: vim pythonmodule.pth

/home/liu/shell/config
/home/liu/shell/base

(3)使用PYTHONPATH环境变量

export PYTHONPATH=$PYTHONPATH:/home/user/shell/config

 5.导入自定义模块

引用模块和执行脚本文件不在同一个目录时,可按照如下形式添加路径:

(1)导入的包在另一个项目文件,在运行程序过程中,需要先加载导入的包,加载过程中python解释器会默认sys.path搜索路径取搜索。

(2)如果该包无法通过sys.path路径搜索,就需要将该包的搜索路径添加到自己程序脚本的默认搜索路径,重新运行程序。

import sys  
sys.path.append(’引用模块的地址')
sys.path.append("..")   # 添加当前路径的上一级目录

这种方法只作用于脚本运行时,运行之后路径导入就会失效。

6.ROOT = Path(os.path.relpath(ROOT, Path.cwd()))

os模块是一个对接操作系统的模块。

       python中的cwd是current work dir 的意思,就是当前工作目录。当前工作目录并不是你运行的python文件所在的目录就叫做工作目录,而是你在命令行中运行脚本时,命令行显示你所在的目录。当前工作目录并不是你运行的python文件所在的目录就叫做工作目录,而是你在命令行中运行脚本时,命令行显示你所在的目录。Path.cwd()获取的位置就是终端所在的位置。

os.path.relpath()用于从当前工作目录或给定目录获取给定路径的相对文件路径。

os.path.relpath(path, start = os.curdir)

        给定路径相对路径将相对于start指示的目录进行计算。此参数的默认值为os.curdir,它是操作系统用来引用当前目录的常量字符串。

7.os.getenv('LOCAL_RANK', -1),用于多卡训练控制参数。

LOCAL_RANK = int(os.getenv('LOCAL_RANK', -1))  # 本地序号,是这台机器上的第几个Worker
RANK = int(os.getenv('RANK', -1))  # 进程序号。这个Worker是全局第几个 Worker
WORLD_SIZE = int(os.getenv('WORLD_SIZE', 1))  # 总共有几个 Worker
'''查找名为LOCAL_RANK,RANK,WORLD_SIZE的环境变量,若存在则返回环境变量的值,若不存在则返回第二个参数(-1,默认None)
rank和local_rank的区别: 两者的区别在于前者用于进程间通讯,后者用于本地设备分配。
'''
os.getenv(key, default = None) 

返回环境变量键的值(如果存在),否则返回默认值。

8.parser.add_argument('--quad', action='store_true', help='quad dataloader')

        这个四元组函数重新调整批处理,从16x3x640x640 调整为 4x3x1280x1280。他仅仅是重新排列批处理中的马赛克。 他允许批处理过程中某些图像进行2倍放大。

9.vars()函数:以字典形式返回参数中每个成员的当前值。

print_args(vars(opt))

10.可复用代码:递增文件或目录路径

from pathlib import Path
import os

def increment_path(path, exist_ok=False, sep='', mkdir=False):
    # Increment file or directory path, i.e. runs/exp --> runs/exp{sep}2, runs/exp{sep}3, ... etc.
    path = Path(path)  # os-agnostic
    # 如果文件路径存在并且不创建 
    if path.exists() and not exist_ok:
        path, suffix = (path.with_suffix(''), path.suffix) if path.is_file() else (path, '')

        # Method 1
        # 增加第n个文件夹名称,直到该文件夹不存在,跳出循环,创建该文件 
        for n in range(2, 9999):
            p = f'{path}{sep}{n}{suffix}'  # increment path
            if not os.path.exists(p):  #
                break
        path = Path(p)

        # Method 2 (deprecated)
        # dirs = glob.glob(f"{path}{sep}*")  # similar paths
        # matches = [re.search(rf"{path.stem}{sep}(\d+)", d) for d in dirs]
        # i = [int(m.groups()[0]) for m in matches if m]  # indices
        # n = max(i) + 1 if i else 2  # increment number
        # path = Path(f"{path}{sep}{n}{suffix}")  # increment path

    if mkdir:
        path.mkdir(parents=True, exist_ok=True)  # make directory

    return path
;