【yolov5-代码细读】


前言

知其然更要知其所以然。
科科大佬带你一行行读懂yolov5代码,yolov5源码

2024/5/30 好的,懒得写,没仔细看完,今晚只是大概过了一遍~


一、detect.py

文件开头,包的导入。
在这里插入图片描述
在这里插入图片描述
这种在这里插入图片描述
往下,就是定义了一些路径
在这里插入图片描述

简单来说,相对路径是相对于当前位置的路径,而绝对路径是完整的路径,从文件系统的根目录开始描述文件或目录的位置。想象你在迷宫里走路,相对路径是指你向左转、向右转这样的指示,而绝对路径则是给出了你当前位置到出口的完整路径描述。

导包结束后会跳转到底下,执行if __name__ == "__main__":
在这里插入图片描述

func-parse_opt

允许传入的参数
在这里插入图片描述
default表示如果没有传入参数,默认执行的就是这些参数
在这里插入图片描述
底下这句,我的小脑瓜真的转了好久QWQ

parser.add_argument('--imgsz', '--img', '--img-size', nargs='+', type=int, default=[640], help='inference size h,w')
。
。
。
opt = parser.parse_args()
opt.imgsz *= 2 if len(opt.imgsz) == 1 else 1  # expand

这段代码是使用 argparse 库中的 add_argument 方法添加了一个参数 --imgsz,它可以用三种不同的名称来调用。
nargs=‘+’ 表示该参数可以接受一个或多个值,这些值将以列表的形式存储。
type=int 指定这些值应该被解析为整数。
default=[640] 表示如果没有提供该参数,则默认为 640。
help 参数提供了对该参数的简要描述。

  • 这行代码会扩展imgsz参数,如果它只有一个值的话。换句话说,如果imgsz是一个单独的值,它会将其大小加倍,如果imgsz已经是一对值(高度,宽度),则保持其原始大小不变。通常这样做是为了确保在推断过程中处理图像尺寸时的一致性。
  • 如果opt.imgsz的长度为1,说明只提供了一个值,意味着只指定了图像的宽度或高度而没有指定另一个维度。在这种情况下,需要将这个值扩展为一对值,以便能够同时指定图像的高度和宽度。如果opt.imgsz的长度不为1,即已经是一对值,则不需要进行扩展,因此返回1,保持原样。
    在这里插入图片描述

func-main

检测依赖包有没有完全下载和执行传入参数的run函数。
在这里插入图片描述
检查参数函数

def check_requirements(requirements=ROOT / 'requirements.txt', exclude=(), install=True, cmds=''):
    # Check installed dependencies meet YOLOv5 requirements (pass *.txt file or list of packages or single package str)
    prefix = colorstr('red', 'bold', 'requirements:')
    check_python()  # check python version
    if isinstance(requirements, Path):  # requirements.txt file
        file = requirements.resolve()
        assert file.exists(), f"{prefix} {file} not found, check failed."
        with file.open() as f:
            requirements = [f'{x.name}{x.specifier}' for x in pkg.parse_requirements(f) if x.name not in exclude]
    elif isinstance(requirements, str):
        requirements = [requirements]

    s = ''
    n = 0
    for r in requirements:
        try:
            pkg.require(r)
        except (pkg.VersionConflict, pkg.DistributionNotFound):  # exception if requirements not met
            s += f'"{r}" '
            n += 1

    if s and install and AUTOINSTALL:  # check environment variable
        LOGGER.info(f"{prefix} YOLOv5 requirement{'s' * (n > 1)} {s}not found, attempting AutoUpdate...")
        try:
            # assert check_online(), "AutoUpdate skipped (offline)"
            LOGGER.info(check_output(f'pip install {s} {cmds}', shell=True).decode())
            source = file if 'file' in locals() else requirements
            s = f"{prefix} {n} package{'s' * (n > 1)} updated per {source}\n" \
                f"{prefix} ⚠️ {colorstr('bold', 'Restart runtime or rerun command for updates to take effect')}\n"
            LOGGER.info(s)
        except Exception as e:
            LOGGER.warning(f'{prefix} ❌ {e}')

分析如下:

def check_requirements(requirements=ROOT / 'requirements.txt', exclude=(), install=True, cmds=''):

这是一个函数定义,名称为 check_requirements,
接受四个参数:requirements、exclude、install、cmds,
其中requirements默认为 ROOT / 'requirements.txt',即一个文件路径;exclude 默认为空元组;install 默认为 True;cmds 默认为空字符串。
prefix = colorstr('red', 'bold', 'requirements:')

定义一个变量 prefix,用于存储带有样式的字符串 'requirements:',颜色为红色加粗。
check_python()

调用 check_python 函数,可能是用来检查 Python 版本。
if isinstance(requirements, Path):

检查 requirements 是否是 Path 类型的实例,如果是则说明传入的是一个文件路径。
file = requirements.resolve()

将 requirements 转换为绝对路径。
assert file.exists(), f"{prefix} {file} not found, check failed."

使用断言确保文件存在,如果文件不存在则会抛出异常。
with file.open() as f:

打开文件 file。
requirements = [f'{x.name}{x.specifier}' for x in pkg.parse_requirements(f) if x.name not in exclude]

解析文件中的每一行内容,生成一个包含包名称和版本信息的列表。
elif isinstance(requirements, str):

检查 requirements 是否是字符串类型,如果是则说明传入的是一个包名称。
requirements = [requirements]

将包名称转换为包含在列表中。
for r in requirements:

遍历所有的包名称。
pkg.require(r)

检查当前环境是否安装了指定的包,如果未安装则会抛出异常。
except (pkg.VersionConflict, pkg.DistributionNotFound):

捕获可能的异常,表示存在版本冲突或未找到指定的包。
if s and install and AUTOINSTALL:

检查是否存在未满足的依赖、是否允许安装依赖、以及是否设置了自动安装。
LOGGER.info(f"{prefix} YOLOv5 requirement{'s' * (n > 1)} {s}not found, attempting AutoUpdate...")

记录日志,显示缺少的依赖项,并尝试自动更新。
LOGGER.info(check_output(f'pip install {s} {cmds}', shell=True).decode())

调用 pip install 命令安装缺少的依赖项。
source = file if 'file' in locals() else requirements

确定安装来源,是文件还是直接指定的依赖项。
s = f"{prefix} {n} package{'s' * (n > 1)} updated per {source}\n" \

记录日志,显示已更新的包数量和更新来源。
f"{prefix} ⚠️ {colorstr('bold', 'Restart runtime or rerun command for updates to take effect')}\n"

提示需要重新启动运行时环境或重新运行命令以使更新生效。
except Exception as e:

捕获可能的异常。
LOGGER.warning(f'{prefix} ❌ {e}')

记录警告日志,显示异常信息。
这个函数的主要作用是检查项目所需的依赖项是否已安装,
如果未安装则尝试自动安装,最后输出安装结果。

-run函数

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值