【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3源码整体结构解析

【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3源码整体结构解析

文章目录

  • 【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3源码整体结构解析
  • 前言
  • 代码结构整体
  • data文件结构
    • 模型训练超参数配置文件解析
    • 数据集配置文件解析
  • models文件结构
  • utils文件结构
  • runs文件结构
  • 总结


前言

Ultralytics YOLO 是一系列基于 YOLO(You Only Look Once)算法的检测、分割、分类、跟踪和姿势估计模型,此前博主已经搭建完成绍Ultralytics–YOLOv人脸检测项目【Windows11下YOLOV3人脸检测】,本博文解析Ultralytics–YOLOV3源码的整体结构。


代码结构整体

核心结构部分如下图所示:

本博文不对具体的代码进行讲解,只对主要的yaml配置文件进行解析。


data文件结构

模型训练超参数配置文件解析

hyp.scratch.yaml内容解析:

################## 1、学习率相关参数 ##################
lr0: 0.01   # 学习率的初始值:通常使用SGD时为0.01,使用Adam时为0.001.
lrf: 0.1    # 学习率调度器OneCycleLR中的最终学习率(lr0 * lrf):在一个训练周期内逐步增加然后减少学习率来加速模型的收敛,有助于模型跳出局部最优解.
momentum: 0.937 # 学习率动量:记录之前梯度(方向和大小)的加权平均值并将其用于参数更新以决定当前梯度的大小和方向
weight_decay: 0.0005  # optimizer权重衰减系数5e-4:有效地限制模型复杂度,减少过拟合的风险.
warmup_epochs: 3.0    # 预热阶段:先用较小的学习率在训练初始时预热,避免出现不稳定的梯度或损失的情况.
warmup_momentum: 0.8  # 预热学习率动量
warmup_bias_lr: 0.1   # 预热学习率
################## 学习率相关参数  ####################################### 2、损失函数相关参数  ###################
box: 0.05  # 预测边界框损失的系数(位置和尺寸)
cls: 0.5   # 分类损失的系数
cls_pw: 1.0 # 分类损失的二元交叉熵损失中正样本的权重
obj: 1.0      # 置信度损失权重
obj_pw: 1.0   # 置信度损失的二元交叉熵损失中正样本的权重
iou_t: 0.20     # Iou阈值:当预测框和真实框之间的IoU大于阈值时为检测正确,否则为检测错误.
anchor_t: 4.0   # anchor的阈值:真实框与预测框的尺寸的比例在阈值范围内为检测正确,否则为检测错误.
# anchors: 3  # anchors per output layer (0 to ignore)
fl_gamma: 0.0  # focal loss gamma (efficientDet default gamma=1.5)  通过调节因子降低容易分类样本的权重,gamma值越大模型更加关注难分类的样本.
################### 损失函数相关参数 ########################################### 3、数据增强相关参数 ####################
# hsv_h、hsv_s、hsv_v表示图像HSV颜色空间的色调、饱和度、明度的增强参数,取值范围都是[0, 1],值越大强度越大.
hsv_h: 0.015  # 色调
hsv_s: 0.7    # 饱和度
hsv_v: 0.4    # 明度
# degrees、translate、scale、shear表示图像旋转、平移、缩放、扭曲的增强参数
degrees: 0.0    # 旋转角度
translate: 0.1  # 水平和垂直随机平移,取值范围都是[0,1],这里允许的最大水平和垂直平移比例分别为原图宽高的0.1
scale: 0.5      # 随机缩放,图像会被随机缩放到原图大小的0.5到1之间。
shear: 0.0      # 剪切:沿着某个方向对图像进行倾斜或拉伸
# 模拟从不同的角度拍摄图像:将图像中的点映射到一个新的位置,产生类似倾斜、拉伸或压缩的效果,取值范围都是[0, 0.001].
perspective: 0.0 # 透视变换参数
# flipud、fliplr表示图像上下翻转、左右翻转的增强概率,取值范围都是[0, 1]。
flipud: 0.0   # 上下翻转
fliplr: 0.5   # 左右翻转
# mosaic、mixup、copy_paste表示选择不同方式增强训练集多样性的概率,取值范围都是[0, 1].
mosaic: 1.0  # 将四张图片拼接成一张,增强了模型对多物体的感知能力和位置估计能力
mixup: 0.0   # 对两张图片进行线性混合,增强了模型对物体形状和纹理的学习能力
copy_paste: 0.0   # 将一张图片的一部分复制到另一张图片上,增强了模型对物体的位置和尺度变化的鲁棒性。
#################### 数据增强相关参数 ######################

其他的模型训练超参数配置文件只是一些具体超参数数值上不同。

数据集配置文件解析

coco.yaml内容解析:

path: ../datasets/coco128       # 数据集源路径
train: images/train2017 # path下训练集地址,
val: images/train2017   # path下验证集地址
test:   # path下测试集地址nc: 80  # 检测的类别数量
names: ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light','fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow','elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee','skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard','tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple','sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch','potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone','microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear','hair drier', 'toothbrush']     # 检测的类别名,避免用中文# 数据集下载URL(可选)
download: https://ultralytics.com/assets/coco128.zip

coco128.yaml内容解释: 调用了utils中的函数,采用脚本方式下载数据集。

path: ../datasets/coco  # 数据集源路径
# txt列出了训练集/验证集/测试集中的所有图像文件名或相对路径
train: train2017.txt  # path下训练集地址
val: val2017.txt  # path下验证集地址
test: test-dev2017.txt  # path下测试集地址nc: 80  # 检测的类别数量
names: ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light','fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow','elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee','skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard','tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple','sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch','potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone','microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear','hair drier', 'toothbrush']  # 检测的类别名,避免用中文# 数据集下载脚本(可选)
download: |# 导入模块utils下的函数from utils.general import download, Path# 下载标签segments = False  # 决定下载的标签类型(分割标签或者检测标签)dir = Path(yaml['path'])  # 指定了数据集的路径# 构建标签下载URLurl = 'https://github.com/ultralytics/yolov5/releases/download/v1.0/'     # 基础URLurls = [url + ('coco2017labels-segments.zip' if segments else 'coco2017labels.zip')]  # 下载指定标签的URLdownload(urls, dir=dir.parent)  # 下载标签文件# 下载数据文件urls = ['http://images.cocodataset.org/zips/train2017.zip',  # 19G, 118k images'http://images.cocodataset.org/zips/val2017.zip',  # 1G, 5k images'http://images.cocodataset.org/zips/test2017.zip']  # 7G, 41k images (optional)# 使用3个线程并行下载提高下载速度download(urls, dir=dir / 'images', threads=3)

voc.yaml内容解释: 调用了utils中的函数,采用脚本方式下载数据集。

path: ../datasets/VOC  # 数据集源路径
train:  # path下训练集地址- images/train2012  # YAML语法格式中 - 表示一个列表项- images/train2007- images/val2012- images/val2007
val:  # path下验证集地址- images/test2007
test: # path下测试集地址- images/test2007nc: 20  # 检测的类别数量
names: ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog','horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor']  # 检测的类别名,避免用中文# 数据集下载脚本(可选)
download: |# 导入模块import xml.etree.ElementTree as ETfrom tqdm import tqdm# 导入utils下的函数from utils.general import download, Path# 将PASCAL VOC的XML标注文件转换为YOLO格式的标注文件def convert_label(path, lb_path, year, image_id):# 将PASCAL VOC的边界框坐标(xmin, xmax, ymin, ymax)转换为YOLO格式的归一化的中心点坐标和宽高def convert_box(size, box):dw, dh = 1. / size[0], 1. / size[1]x, y, w, h = (box[0] + box[1]) / 2.0 - 1, (box[2] + box[3]) / 2.0 - 1, box[1] - box[0], box[3] - box[2]return x * dw, y * dh, w * dw, h * dh# 读取XML文件in_file = open(path / f'VOC{year}/Annotations/{image_id}.xml')#  保存YOLO格式的.txt文件out_file = open(lb_path, 'w')# 并解析XML文件内容tree = ET.parse(in_file)root = tree.getroot()# 获取图像的尺寸size = root.find('size')w = int(size.find('width').text)h = int(size.find('height').text)# 遍历XML文件中的每个目标对象for obj in root.iter('object'):# 获取目标对象的类别名称cls = obj.find('name').text# 类别属于数据集配置文件中的内容中且不是困难样本,则进行转换if cls in yaml['names'] and not int(obj.find('difficult').text) == 1:# 获取目标对象的边界框信息xmlbox = obj.find('bndbox')# 转化为YOLO格式的归一化的中心点坐标和宽高bb = convert_box((w, h), [float(xmlbox.find(x).text) for x in ('xmin', 'xmax', 'ymin', 'ymax')])# 类别序号cls_id = yaml['names'].index(cls)# 保存数据out_file.write(" ".join([str(a) for a in (cls_id, *bb)]) + '\n')# 下载数据集# 数据集存储的根目录dir = Path(yaml['path'])# : 需要下载的文件 URL 列表url = 'https://github.com/ultralytics/yolov5/releases/download/v1.0/'urls = [url + 'VOCtrainval_06-Nov-2007.zip',  # 446MB, 5012 imagesurl + 'VOCtest_06-Nov-2007.zip',  # 438MB, 4953 imagesurl + 'VOCtrainval_11-May-2012.zip']  # 1.95GB, 17126 images# 下载urls指定的数据集download(urls, dir=dir / 'images', delete=False)# 转换数据集path = dir / f'images/VOCdevkit'# 遍历年份和数据集类型for year, image_set in ('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test'):# 创建对应的图像和标签文件夹imgs_path = dir / 'images' / f'{image_set}{year}'lbs_path = dir / 'labels' / f'{image_set}{year}'imgs_path.mkdir(exist_ok=True, parents=True)lbs_path.mkdir(exist_ok=True, parents=True)# 读取每组数据集的图像ID列表image_ids = open(path / f'VOC{year}/ImageSets/Main/{image_set}.txt').read().strip().split()# 遍历所有图片for id in tqdm(image_ids, desc=f'{image_set}{year}'):# 移动图像文件到目标目录f = path / f'VOC{year}/JPEGImages/{id}.jpg'  # 旧图像路径lb_path = (lbs_path / f.name).with_suffix('.txt')  # 新图像路径f.rename(imgs_path / f.name)  # 移动图像convert_label(path, lb_path, year, id)  # 生成YOLO格式的标签文件

其他的数据集配置文件基本结构都与这三种相似,除了下载数据集脚本略微不同。


models文件结构


网络模型配置文件yolov3.yaml内容解析:

nc: 80   # 模型识别的类别数量
# 通过以下两个参数就可以实现不同复杂度的模型设计(原本Joseph Redmon的YOLOV3版本没有以下俩个参数的)
depth_multiple: 1.0  # 模型深度系数:卷积模块的缩放因子,原始模型的所有模块乘以缩放因子,得到当前模型的模块数
width_multiple: 1.0  # 模型通道系数:卷积层通道的缩放因子,backbone和head中所有卷积层的通道数乘以缩放因子得到,得到当前模型的所有卷积层的新通道数# 初始化了9个anchors,在3个检测头中中使用,每个检测头对应的特征图中,每个网格单元都有3个anchor进行预测
anchors:  #  以下3组anchors不能保证适用于所有的数据集- [10,13, 16,30, 33,23]  # P3/8- [30,61, 62,45, 59,119]  # P4/16- [116,90, 156,198, 373,326]  # P5/32# darknet53 主干网络
backbone:# [from, number, module, args]# from表示当前模块的输入来自那一层的输出,-1表示来自上一层的输出.# number表示本模块的理论重复次数,实际的重复次数:number×depth_multiple.# module表示模块名,通过模块名在common.py中寻找相应的类完成模块化的搭建网络.# args表示模块搭建所需参数的列表,包括channel,kernel_size,stride,padding,bias等.[[-1, 1, Conv, [32, 3, 1]],  # 0[-1, 1, Conv, [64, 3, 2]],  # 1-P1/2[-1, 1, Bottleneck, [64]],[-1, 1, Conv, [128, 3, 2]],  # 3-P2/4[-1, 2, Bottleneck, [128]],[-1, 1, Conv, [256, 3, 2]],  # 5-P3/8[-1, 8, Bottleneck, [256]],[-1, 1, Conv, [512, 3, 2]],  # 7-P4/16[-1, 8, Bottleneck, [512]],[-1, 1, Conv, [1024, 3, 2]],  # 9-P5/32[-1, 4, Bottleneck, [1024]],  # 10]# 检测头(包含了neck模块)
head:# [from, number, module, args] 同理[[-1, 1, Bottleneck, [1024, False]],[-1, 1, Conv, [512, [1, 1]]],[-1, 1, Conv, [1024, 3, 1]],[-1, 1, Conv, [512, 1, 1]],[-1, 1, Conv, [1024, 3, 1]],  # 15 (P5/32-large)[-2, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 8], 1, Concat, [1]],  # cat backbone P4[-1, 1, Bottleneck, [512, False]],[-1, 1, Bottleneck, [512, False]],[-1, 1, Conv, [256, 1, 1]],[-1, 1, Conv, [512, 3, 1]],  # 22 (P4/16-medium)[-2, 1, Conv, [128, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]],  # cat backbone P3[-1, 1, Bottleneck, [256, False]],[-1, 2, Bottleneck, [256, False]],  # 27 (P3/8-small)[[27, 22, 15], 1, Detect, [nc, anchors]],   # Detect(P3, P4, P5)]

模型配置文件与模型结构图的对应关系如下图所示:

这里注意一个点,Bottleneck是2个卷积层组成:1×1卷积层和3×3卷积层,所以在head配置部分与模型结构图的对应有点差异,即模型结构图展现了1×1卷积层和3×3卷积层,但是在head配置部分用Bottleneck代替了。

其他网络模型配置文件基本与yolov3.yaml相似。


utils文件结构


功能性代码部分,在使用到这部分代码时候再详细讲解内容。


runs文件结构


执行训练、验证和推理三个不同阶段都会得出相应的输出结果,具体输出的含义在后续不同阶段内容时候详细讲解。


总结

尽可能简单、详细的介绍了YOLOV3源码整体结构解析。后续会根据自己学到的知识结合个人理解讲解YOLOV3的每个阶段的详细代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/75334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python常用排序算法

1. 冒泡排序 冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,比较相邻的元素,如果他们的顺序错误就交换他们。 def bubble_sort(arr):# 遍历所有数组元素for i in range(len(arr)):# 最后i个元素是已经排序好的for j in range(0, …

解锁塔能科技,开启工厂绿色转型与可持续发展双引擎

在全球积极推进可持续发展的大背景下,能源的高效利用与节能减排,已成为各行各业迈向高质量发展进程中无法回避的核心任务。工厂作为能源消耗大户与污染排放重点源头,其绿色转型迫在眉睫,这不仅关乎企业自身的长远发展,…

Spring Boot 线程池配置详解

Spring Boot 线程池配置详解 一、核心配置参数及作用 基础参数核心线程数 (corePoolSize)‌ 作用‌:线程池中始终保持存活的线程数量,即使空闲也不回收‌。 建议‌:根据任务类型设定(如 I/O 密集型任务可设为 CPU 核心数 2)‌。 最大线程数 (maxPoolSize)‌ 作用‌:…

入侵检测系统(IDS)和入侵防御系统(IPS)有啥区别?

入侵检测系统(IDS)和入侵防御系统(IPS)是网络安全中的两种关键技术,它们的核心区别在于 检测后的响应方式 和 部署位置。以下是详细对比: 1. 核心功能 - IDS(入侵检测系统) - 仅监…

【MySQL 数据库】数据表的操作

🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 目录 1. 表的查看 1.1 语法 2. 表的创建 2.1 语法 2.2 练习 3. 查看表结构 3.1 语法 3.2 示例 4. 表的修改 4.1 语法 4.2 示例操作 4.2.1 向表中添加字段…

sqli-labs靶场 less5

文章目录 sqli-labs靶场less 5 报错注入 sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、’、“”&#xf…

C# 状态模式深度解析:构建灵活的状态驱动系统

一、状态模式概述 状态模式(State Pattern)是一种行为型设计模式,它允许对象在其内部状态改变时改变其行为,使对象看起来像是修改了它的类。这种模式将特定状态相关的行为局部化,并且将不同状态的行为分割开来。 状态…

vue实现二维码生成器和解码器

vue实现二维码生成器和解码器 1.生成基本二维码:根据输入的value生成二维码。 2.可定制尺寸:通过size调整大小。 3.颜色和背景色:设置二维码颜色和背景。 4.静区(quiet zone)支持:通过quietZone调整周围的…

Nacos:Nacos服务注册与服务发现超详细的源码解析(二)

🪁🍁 希望本文能给您带来帮助,如果有任何问题,欢迎批评指正!🐅🐾🍁🐥 文章目录 一、背景二、环境与依赖三、服务注册与服务发现总流程图四、服务注册源码4.1 客户端4.1.1…

ECMAScript 6 新特性(二)

ECMAScript 6 新特性(二) ECMAScript 6 新特性(一) ECMAScript 6 新特性(二)(本文) ECMAScript 7~10 新特性 1. 生成器 生成器函数是 ES6 提供的一种解决异步编程方案,一…

深入理解 RxSwift 中的 Driver:用法与实践

目录 前言 一、什么是Driver 1.不会发出错误 2.主线程保证 3.可重放 4.易于绑定 二、Driver vs Observable 三、使用场景 1.绑定数据到UI控件 2.响应用户交互 3.需要线程安全的逻辑 4.如何使用Driver? 1.绑定文本输入到Label 2.处理按钮点击事件 3.从网络请求…

Linux自行实现的一个Shell(15)

文章目录 前言一、头文件和全局变量头文件全局变量 二、辅助函数获取用户名获取主机名获取当前工作目录获取最后一级目录名生成命令行提示符打印命令行提示符 三、命令处理获取用户输入解析命令行执行外部命令 四、内建命令添加环境变量检查和执行内建命令 五、初始化初始化环境…

RocketMQ和kafka 的区别

一、数据可靠性与容错机制 数据可靠性 RocketMQ支持同步刷盘和同步复制,确保消息写入磁盘后才返回确认,单机可靠性高达10个9,即使操作系统崩溃也不会丢失数据。而Kafka默认采用异步刷盘和异步复制,虽然吞吐量高,但极端…

在 openEuler 24.03 (LTS) 操作系统上添加 ollama 作为系统服务的步骤

以下是在 openEuler 操作系统上添加 ollama 作为系统服务的步骤: 创建 systemd 服务文件 sudo vi /etc/systemd/system/ollama.service将以下内容写入服务文件(按需修改参数): [Unit] DescriptionOllama Service Afternetwork.…

光谱相机的关键技术参数

光谱相机的关键技术参数直接影响其数据获取能力和应用场景适配性。以下是核心参数的详细解析,涵盖光谱性能、空间性能、硬件性能及环境适应性: 一、光谱性能参数‌ ‌1. 光谱范围(Spectral Range)‌ ‌定义‌:相机可…

ARM内核与寄存器

ARM内核与寄存器详解 目录 ARM架构概述ARM处理器模式 Cortex-M3内核的处理器模式Cortex-A系列处理器模式 ARM寄存器集 通用寄存器程序计数器(PC)链接寄存器(LR)堆栈指针(SP)状态寄存器(CPSR/SPSR) 协处理器寄存器NEON和VFP寄存器寄存器使用规范常见ARM指令与寄存器操作 ARM架…

Git 拉取时常见冲突及解决方法总结

Git 拉取时常见冲突及解决方法总结 一、常见错误场景1. 本地修改与远程修改冲突解决方法 2. 未跟踪文件与远程文件冲突解决方法 3. 子模块权限问题解决方法 二、总结 在日常开发中,使用 Git 进行团队协作和代码管理时,经常会遇到拉取代码(git…

深度学习、图像算法学习记录

深度学习加速 综述文档: https://chenzomi12.github.io/02Hardware01Foundation/02ArchSlim.html winograd: https://zhuanlan.zhihu.com/p/260109670 ncnn 1.修改模型结构,优化模型内存访问次数,加速。 VGG 和 InceptionNet : …

Java中的Exception和Error有什么区别?还有更多扩展

概念 在Java中,Exception和Error都是Throwable的子类,用于处理程序中的错误和异常情况。 然而,它们在用途和处理方式上有显著的不同: Exception: 用于表示程序在正常运行过程中可能出现的错误,如文件未找…

文章记单词 | 第26篇(六级)

一,单词释义 actor:名词,演员mask:名词,面具;口罩;遮盖物;动词,掩饰;戴面具;遮盖construct:动词,建造;构造&a…