文末有重点
1.配置文件解析代码yolov8/ultralytics/nn/tasks.py 如下:
def yaml_model_load(path):
"""Load a YOLOv8 model from a YAML file."""
import re
path = Path(path)
if path.stem in (f'yolov{d}{x}6' for x in 'nsmlx' for d in (5, 8)):
new_stem = re.sub(r'(\d+)([nslmx])6(.+)?$', r'\1\2-p6\3', path.stem)
LOGGER.warning(f'WARNING ⚠️ Ultralytics YOLO P6 models now use -p6 suffix. Renaming {path.stem} to {new_stem}.')
path = path.with_name(new_stem + path.suffix)
print("path,",path)
unified_path = re.sub(r'(\d+)([nslmx])(.+)?$', r'\1\3', str(path)) # i.e. yolov8x.yaml -> yolov8.yaml
print("unified_path,",unified_path)
yaml_file = check_yaml(unified_path, hard=False)
if not yaml_file:
yaml_file = check_yaml(path)
d = yaml_load(yaml_file) # model dict
d['scale'] = guess_model_scale(path)
d['yaml_file'] = str(path)
return d
def guess_model_scale(model_path):
"""
Takes a path to a YOLO model's YAML file as input and extracts the size character of the model's scale. The function
uses regular expression matching to find the pattern of the model scale in the YAML file name, which is denoted by
n, s, m, l, or x. The function returns the size character of the model scale as a string.
Args:
model_path (str | Path): The path to the YOLO model's YAML file.
Returns:
(str): The size character of the model's scale, which can be n, s, m, l, or x.
"""
with contextlib.suppress(AttributeError):
import re
return re.search(r'yolov\d+([nslmx])', Path(model_path).stem).group(1) # n, s, m, l, or x
return ''
这段代码的功能是加载一个 YOLOv8 模型的 YAML 文件,并对可能存在的文件名或路径格式进行规范化处理。此外,它还提取模型的“大小标识”(n
, s
, m
, l
, x
)并返回包含配置信息的字典。以下是代码的详细解读:
函数 1:yaml_model_load(path)
功能:
加载一个 YOLOv8 模型 YAML 文件,并规范化路径以支持 YOLO 的不同模型文件格式。
代码分析:
1. 路径初始化:
path = Path(path)
将输入的路径参数转为 Path
对象,以便更方便地操作文件名、扩展名等。
2. 模型文件重命名逻辑:
if path.stem in (f'yolov{d}{x}6' for x in 'nsmlx' for d in (5, 8)):
new_stem = re.sub(r'(\d+)([nslmx])6(.+)?$', r'\1\2-p6\3', path.stem)
LOGGER.warning(f'WARNING ⚠️ Ultralytics YOLO P6 models now use -p6 suffix. Renaming {path.stem} to {new_stem}.')
path = path.with_name(new_stem + path.suffix)
-
检查文件名是否匹配特定格式:
path.stem
是文件名(不含扩展名)。通过生成器表达式(f'yolov{d}{x}6' for x in 'nsmlx' for d in (5, 8))
,匹配 YOLOv5 或 YOLOv8 的 P6 模型文件名,例如:"yolov8n6"
"yolov5x6"
-
修改文件名以添加
-p6
后缀: 如果文件名符合上述规则,用正则表达式将其后缀从6
替换为-p6
:
r'(\d+)([nslmx])6(.+)?$'
替换为:
r'\1\2-p6\3'
-
- 示例:
"yolov8n6.yaml"
→"yolov8n-p6.yaml"
- 示例:
-
记录警告信息: 使用
LOGGER.warning
提示用户文件名已被修改。 -
更新路径: 将路径更新为新的文件名。
3. 文件名规范化处理
unified_path = re.sub(r'(yolov\d+)([nslmx])(.+)?$', r'\1\3', str(path))
-
正则表达式匹配:
yolov\d+
: 匹配版本号(如yolov8
)。[nslmx]
: 匹配大小标识(n
,s
,m
,l
,x
)。(.+)?$
: 匹配剩余部分(可选)。
-
替换模式:
\1\3
- 保留版本号(
yolov\d+
)和剩余部分((.+)?
)。 - 去掉大小标识
[nslmx]
。
- 保留版本号(
-
示例:
"yolov8n.yaml"
→"yolov8.yaml"
4. 检查 YAML 文件
yaml_file = check_yaml(unified_path, hard=False)
if not yaml_file:
yaml_file = check_yaml(path)
- 尝试加载经过统一处理的路径(
unified_path
)。 - 如果失败,则尝试加载原路径(
path
)。
5. 加载 YAML 内容
d = yaml_load(yaml_file)
调用 yaml_load
方法读取 YAML 文件内容为字典。
6. 提取模型大小标识
d['scale'] = guess_model_scale(path)
使用 guess_model_scale
函数从文件名中提取大小标识(n
, s
, m
, l
, x
)。
7. 返回结果:
d['yaml_file'] = str(path)
return d
返回包含模型配置信息和路径的字典。
函数 2:guess_model_scale(model_path)
功能:
从文件路径中提取模型的大小标识(n
, s
, m
, l
, x
)。
代码分析:
1. 正则匹配大小标识:
return re.search(r'yolov\d+([nslmx])', Path(model_path).stem).group(1)
-
yolov\d+
: 匹配版本号(如yolov8
)。 -
([nslmx])
: 捕获大小标识(n
,s
,m
,l
,x
)。 -
示例:
"yolov8n.yaml"
→ 匹配"n"
。
2.异常处理:
with contextlib.suppress(AttributeError):
如果正则匹配失败,返回 None
,调用 .group(1)
会引发 AttributeError
。通过 contextlib.suppress
忽略此错误并返回空字符串 ''
。
整体逻辑
- 尝试处理 YOLO P6 文件名的历史兼容性问题,添加
-p6
后缀。 - 规范化路径,去掉文件名中的大小标识(如
n
、s
)。 - 提取文件名中的模型大小标识。
- 加载 YAML 文件,返回配置信息。
示例输入和输出
输入:
文件名:"yolov8n6.yaml"
输出:
{
'scale': 'n',
'yaml_file': 'yolov8n-p6.yaml',
# 其他 YAML 文件中的配置内容
}
改进部分(重点)
在寻找配置文件的名字的正则,按照yolov8给的配置文件,在文件名字中是没有尺寸信息,在文件里面是有尺寸信息的。
re.sub(r'(\d+)([nslmx])(.+)?$', r'\1\3', str(path))
得到网络尺寸的正则化。代码传入的配置文件是具有尺寸信息的。
re.search(r'yolov\d+([nslmx])', Path(model_path).stem).group(1)
两者是不一样。有时候会导致可以解析文件尺寸,但是找到文件名字。
为了让两个正则化匹配一样。
(1)建议把找文件名字的匹配改成的
re.sub(r'(yolov\d+)([nslmx])(.+)?$', r'\1\3', str(path))
(2)建议新的配置文件名字为{name}_yolov8.yaml.
根据需要命名,但是name不能包括yolov。
在训练导入配置文件的时候
{name}_yolov8n.yaml.
{name}_yolov8s.yaml.
{name}_yolov8l.yaml.
{name}_yolov8m.yaml.
{name}_yolov8x.yaml.
分别对应不同的尺寸,但是都是加载{name}_yolov8.yaml.进行配置。
文件中对应尺寸的配置信息。
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
# [depth, width, max_channels]
n: [0.33, 0.25, 1024]
s: [0.33, 0.50, 1024]
m: [0.67, 0.75, 768]
l: [1.00, 1.00, 512]
x: [1.00, 1.25, 512]
标签:配置文件,YOLOv8,yaml,nslmx,file,命名,path,model,stem
From: https://blog.csdn.net/Lucy_wzw/article/details/144119339