目录结构
ultralytics
├── __init__.py
├── __pycache__
├── assets
├── cfg
├── data
├── engine
├── hub
├── models
├── nn
├── solutions
├── trackers
└── utils
1. __init__.py
-
作用:将一个目录标记为一个 Python 包(package),并可以用于初始化该包的行为
2. __pycache__
-
作用:这个目录是 Python 的缓存目录,用于存储编译后的
.pyc
文件。这些文件是 Python 源文件的字节码版本,用于加速程序的启动时间。
3. assets
-
作用:通常用于存放项目中使用的静态资源,比如预训练模型权重文件、配置文件、示例图片或视频等。
4. cfg
-
作用:存放项目的配置文件,通常是 YAML 或 JSON 格式。这些文件用于定义模型的结构、训练参数、数据路径等。
5. data
-
作用:存放数据集相关的内容,包括数据集的脚本、数据预处理代码、数据集的配置文件等。
6. engine
-
作用:包含项目的主逻辑代码,如训练、验证、测试等核心功能的实现。
7. hub
-
作用:用于模型的加载和管理,与模型的下载、缓存、加载等功能相关。
8. models
-
作用:存放模型的定义代码,包括模型的架构和实现。
9. nn
-
作用:定义了自定义的神经网络层和模块
10. solutions
-
作用:存放项目中的一些解决方案代码,如停车管理、队列管理等。
11. trackers
-
作用:用于存放目标跟踪算法的实现,如 ByteTrack、BotSort。
12. utils
-
作用:存放项目中提供的通用工具函数,如绘图、日志记录、性能评估等。
__init__.py代码阅读
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
# 初始化和配置 Ultralytics 提供的 YOLO 模型及相关工具的运行环境,并为后续的模型加载、训练或推理做好准备。
# 定义了Ultralytics 工具的版本号,方便后续版本管理和兼容性检查。
__version__ = "8.3.81"
import os
# 检查是否设置了 OMP_NUM_THREADS 环境变量。如果没有设置,则将其值设置为 1。
# 作用:限制 OpenMP 使用的线程数,减少 CPU 资源占用,避免在多线程环境中过度消耗计算资源,尤其在训练或推理时对性能优化有帮助。
if not os.environ.get("OMP_NUM_THREADS"):
os.environ["OMP_NUM_THREADS"] = "1"
# 导入了 Ultralytics 提供的多种模型,这些模型可以用于不同的计算机视觉任务,例如目标检测、分割等。
# YOLO-NAS 是一种基于神经架构搜索(NAS)设计的目标检测模型,通过自动化的架构搜索优化模型性能
# --->适用于需要高效目标检测的场景,尤其是在资源受限的环境中,如移动设备或嵌入式系统
# RTDETR 是一种高效的目标检测模型,结合了 DETR(Detection Transformer)的精度和实时性能
# --->适用于对精度要求较高的目标检测任务,如安防监控、自动驾驶等领域
# SAM 是一种通用的分割模型,能够对图像中的任何对象进行分割
# --->适用于需要灵活分割的对象检测任务,如医学影像分析、内容创作等
# YOLO 是一种单阶段目标检测框架,能够在单次前向传递中同时预测边界框和类别概率
# --->广泛应用于实时目标检测任务,如自动驾驶、安防监控、工业自动化等
# FastSAM 是一种实时图像分割模型,基于 YOLOv8 架构,支持多种提示引导的分割方式,如边界框、点击和文本描述
# --->适用于需要快速响应的图像分割任务,如自动驾驶、医疗影像分析、增强现实(AR)等
# YOLO-World 是一种结合视觉和语言的下一代目标检测模型,支持开放词汇检测和文本引导的分割
# --->适用于需要结合文本信息进行目标检测的场景,如自动驾驶、内容创作、安防监控等
from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorld
# 导入了工具函数和配置:
# ASSETS:可能包含预训练模型文件、数据集等资源的路径。
# SETTINGS:全局配置信息。
# check_yolo:用于检查 YOLO 模型的工具函数。
# download:用于下载预训练模型或其他资源的函数。
from ultralytics.utils import ASSETS, SETTINGS
from ultralytics.utils.checks import check_yolo as checks
from ultralytics.utils.downloads import download
settings = SETTINGS
# 定义了当前模块中可以被外部导入的变量和函数列表,包括版本号、模型类、工具函数等。
__all__ = (
"__version__",
"ASSETS",
"YOLO",
"YOLOWorld",
"NAS",
"SAM",
"FastSAM",
"RTDETR",
"checks",
"download",
"settings",
)
# 总结
# 1.初始化包的运行环境:通过设置环境变量和导入必要的模块,为包的使用做好准备。
# 2.定义包的公共接口:通过 __all__ 列表,明确哪些内容可以被外部使用。
# 3.组织和提供模块访问:将多个模型和工具函数集中导入,方便使用者通过包的顶层接口直接访问。
cfg目录代码阅读
cfg
├── __init__.py
├── __pycache__
├── datasets
├── default.yaml
├── models
├── solutions
└── trackers
datasets:
存放所有数据集相关的配置文件,这些文件定义了数据集的路径、类别、数据划分等信息。
default.yaml:
定义项目的默认配置,通常包含全局设置,如训练参数、模型保存路径、日志设置等。
models
文件夹:存放所有模型相关的配置文件,定义了不同版本和类型的 YOLO 模型的架构。
每个文件(如 yolo11.yaml
、yolo12.yaml
)定义了一个模型的结构,包括:输入尺寸、主干网络(Backbone)、颈部结构(Neck)、头部结构(Head)
solutions
文件夹: 存放与特定解决方案相关的配置文件
trackers
文件夹: 存放与目标跟踪相关的配置文件
data/carparts-seg.yaml 阅读
#说明该数据集或相关代码遵循 AGPL-3.0 许可证。
#AGPL-3.0 许可证:是一种开源许可证,要求任何使用该代码或数据集的项目也必须开源。如果需要在商业项目中使用而不开源,需要申请企业许可证。
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
#提供了数据集的官方文档链接。
# Documentation: https://docs.ultralytics.com/datasets/segment/carparts-seg/
#Carparts Segmentation Dataset 是一个用于计算机视觉应用的数据集,专注于汽车零部件的分割任务。
#它包含从多个角度拍摄的图像和视频,用于训练和测试分割模型。
# 使用方法: yolo train data=carparts-seg.yaml
# 默认下载位置
# parent
# ├── ultralytics
# └── datasets
# └── carparts-seg ← downloads here (132 MB)
#数据集的训练集、验证集和测试集可以通过以下三种方式指定
# 1)dir: path/to/imgs
# 2) file: path/to/imgs.txt
# 3) list: [path/to/imgs1, path/to/imgs2, ..]
#path 是数据集的根目录路径。所有其他路径(如训练集、验证集、测试集的路径)都是相对于这个根目录定义的。
path: ../datasets/carparts-seg # dataset root dir
#定义训练集,验证集,测试集路径(相对位置)
train: train/images # train images (relative to 'path') 3516 images
val: valid/images # val images (relative to 'path') 276 images
test: test/images # test images (relative to 'path') 401 images
#数据集包含 23 个类别,每个类别对应汽车的一个零部件。
names:
0: back_bumper
1: back_door
2: back_glass
3: back_left_door
4: back_left_light
5: back_light
6: back_right_door
7: back_right_light
8: front_bumper
9: front_door
10: front_glass
11: front_left_door
12: front_left_light
13: front_light
14: front_right_door
15: front_right_light
16: hood
17: left_mirror
18: object
19: right_mirror
20: tailgate
21: trunk
22: wheel
#数据集的下载链接
download: https://github.com/ultralytics/assets/releases/download/v0.0.0/carparts-seg.zip
data/Argoverse.yaml阅读
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
# Argoverse-HD dataset (ring-front-center camera) https://www.cs.cmu.edu/~mengtial/proj/streaming/ by Argo AI
# Documentation: https://docs.ultralytics.com/datasets/detect/argoverse/
# Example usage: yolo train data=Argoverse.yaml
# parent
# ├── ultralytics
# └── datasets
# └── Argoverse ← downloads here (31.5 GB)
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/Argoverse # dataset root dir
train: Argoverse-1.1/images/train/ # train images (relative to 'path') 39384 images
val: Argoverse-1.1/images/val/ # val images (relative to 'path') 15062 images
test: Argoverse-1.1/images/test/ # test images (optional) https://eval.ai/web/challenges/challenge-page/800/overview
# Classes
names:
0: person
1: bicycle
2: car
3: motorcycle
4: bus
5: truck
6: traffic_light
7: stop_sign
#下载和转换脚本(可选配置) 包含一个 Python 脚本,用于下载数据集并将其标注转换为 YOLO 格式。
# Download script/URL (optional) ---------------------------------------------------------------------------------------
download: |
import json
from tqdm import tqdm
from ultralytics.utils.downloads import download
from pathlib import Path
# 用于将 Argoverse 数据集的标注转换为 YOLO 格式。
def argoverse2yolo(set):
# 初始化标注字典并加载 JSON 文件
labels = {}
a = json.load(open(set, "rb"))
# 遍历标注并转换为 YOLO 格式。 a['annotations']:包含所有标注的列表。
for annot in tqdm(a['annotations'], desc=f"Converting {set} to YOLOv5 format..."):
img_id = annot['image_id']
img_name = a['images'][img_id]['name']
img_label_name = f'{img_name[:-3]}txt'
cls = annot['category_id'] # instance class id
x_center, y_center, width, height = annot['bbox']
x_center = (x_center + width / 2) / 1920.0 # offset and scale
y_center = (y_center + height / 2) / 1200.0 # offset and scale
# 归一化:将边界框坐标归一化到 [0, 1] 范围内
width /= 1920.0 # scale
height /= 1200.0 # scale
# 创建标注文件的目录
img_dir = set.parents[2] / 'Argoverse-1.1' / 'labels' / a['seq_dirs'][a['images'][annot['image_id']]['sid']]
if not img_dir.exists():
img_dir.mkdir(parents=True, exist_ok=True)
# 存储标注信息, k:标注文件的完整路径。
k = str(img_dir / img_label_name)
if k not in labels:
labels[k] = []
labels[k].append(f"{cls} {x_center} {y_center} {width} {height}\n")
# 遍历所有标注文件路径,将标注信息写入对应的 .txt 文件。
for k in labels:
with open(k, "w") as f:
f.writelines(labels[k])
# 下载数据集
# Download 'https://argoverse-hd.s3.us-east-2.amazonaws.com/Argoverse-HD-Full.zip' (deprecated S3 link)
dir = Path(yaml['path']) # dataset root dir 数据集的根目录。
urls = ['https://drive.google.com/file/d/1st9qW3BeIwQsnR0t8mRpvbsSWIo16ACi/view?usp=drive_link'] #数据集的下载链接
# 提示用户手动下载数据集,因为自动下载可能无法工作。
print("\n\nWARNING: Argoverse dataset MUST be downloaded manually, autodownload will NOT work.")
print(f"WARNING: Manually download Argoverse dataset '{urls[0]}' to '{dir}' and re-run your command.\n\n")
# download(urls, dir=dir)
# 转换标注文件
# 将 tracking 文件夹重命名为 images
annotations_dir = 'Argoverse-HD/annotations/'
(dir / 'Argoverse-1.1' / 'tracking').rename(dir / 'Argoverse-1.1' / 'images') # rename 'tracking' to 'images'
# 遍历 train.json 和 val.json,调用 argoverse2yolo 函数将标注转换为 YOLO 格式。
for d in "train.json", "val.json":
argoverse2yolo(dir / annotations_dir / d) # convert Argoverse annotations to YOLO labels