深度学习:yolov3的使用--建立模型

使用argparse模块来定义和解析命令行参数

创建一个ArgumentParser对象

parser = argparse.ArgumentParser()

训练的轮数,每批图像的大小,更新模型参数之前累积梯度的次数,模型定义文件的路径。

parser.add_argument("--epochs", type=int, default=100, help="number of epochs") #训练次数parser.add_argument("--batch_size", type=int, default=1, help="size of each image batch")   #batch的大小parser.add_argument("--gradient_accumulations", type=int, default=2, help="number of gradient accums before step")#在每一步(更新模型参数)之前累积梯度的次数”parser.add_argument("--model_def", type=str, default="config/yolov3.cfg", help="path to model definition file") #模型的配置文件

数据配置文件的路径,从预训练的模型权重开始训练,生成批次数据时使用的CPU线程数。

parser.add_argument("--data_config", type=str, default="config/coco.data", help="path to data config file") #数据的配置文件parser.add_argument("--pretrained_weights", type=str, help="if specified starts from checkpoint model") #预训练文件parser.add_argument("--n_cpu", type=int, default=0, help="number of cpu threads to use during batch generation")#数据加载过程中应使用的CPU线程数。

每张图像的尺寸,每隔多少个epoch保存一次模型权重,每隔多少个epoch在验证集上进行一次评估,每十批计算一次平均精度(mAP),是否允许多尺度训练,

parser.add_argument("--img_size", type=int, default=416, help="size of each image dimension")parser.add_argument("--checkpoint_interval", type=int, default=20, help="interval between saving model weights")#隔多少个epoch保存一次模型权重parser.add_argument("--evaluation_interval", type=int, default=20, help="interval evaluations on validation set")#多少个epoch进行一次验证集的验证parser.add_argument("--compute_map", default=False, help="if True computes mAP every tenth batch")#parser.add_argument("--multiscale_training", default=True, help="allow for multi-scale training")

使用parse_args方法解析命令行参数

opt = parser.parse_args()

使用TensorFlow 2.0以上版本中的tf.summary模块创建日志记录器(Logger)

import tensorflow as tf  # 导入TensorFlow库,并简写为tf
# 确保使用的是TensorFlow 2.0或更高版本class Logger(object):def __init__(self, log_dir):"""Create a summary writer logging to log_dir.这个类的构造函数接受一个参数log_dir,它表示日志文件将要保存的目录。函数的作用是创建一个日志记录器,用于记录TensorFlow的摘要信息(例如训练过程中的损失、准确率等)。"""self.writer = tf.summary.create_file_writer(log_dir)  # 创建一个文件写入器,用于将摘要信息写入到指定的日志目录

调用Logger,创建目录

logger = Logger("logs")
# 创建Logger类的实例,并将日志目录设置为"logs"。这意味着所有的日志信息将被写入到当前工作目录下的"logs"文件夹中。device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 这行代码使用PyTorch的torch.device来确定运行设备。如果系统有可用的CUDA(即NVIDIA的GPU),则device将被设置为"cuda",否则将使用CPU。os.makedirs("output", exist_ok=True)
# 使用os模块的makedirs函数创建一个名为"output"的目录。exist_ok=True参数意味着如果"output"目录已经存在,不会抛出错误。os.makedirs("checkpoints", exist_ok=True)
# 类似地,这行代码创建一个名为"checkpoints"的目录。这个目录通常用于存储模型的检查点或保存的状态,以便后续可以恢复训练或进行模型评估。

定义 parse_data_config 的函数,它用于解析数据配置文件(文件内容分类种类,训练集路径,测试集路径,文件名称路径)

def parse_data_config(path):"""Parses the data configuration file"""options = dict()options['gpus'] = '0,1,2,3'options['num_workers'] = '10'with open(path, 'r') as fp:lines = fp.readlines()for line in lines:line = line.strip()if line == '' or line.startswith('#'):#startswith()用于检查字符串是否以特定的子字符串开始。如果是,它将返回True,否则返回False。continuekey, value = line.split('=')options[key.strip()] = value.strip()return options

调用函数

    data_config = parse_data_config(opt.data_config)train_path = data_config["train"]valid_path = data_config["valid"]

定义了一个名为 load_classes 的函数,它用于从指定路径加载类别标签

def load_classes(path):"""Loads class labels at 'path'"""fp = open(path, "r")names = fp.read().split("\n")[:-1]return names

调用函数

class_names = load_classes(data_config["names"])

定义了一个名为 parse_model_config 的函数,它用于解析 YOLOv3 模型的配置文件

读取文件划分如卷积、池化、上采样、路由、快捷连接和 YOLO 层

def parse_model_config(path):"""Parses the yolo-v3 layer configuration file and returns module definitions"""file = open(path, 'r')lines = file.read().split('\n')lines = [x for x in lines if x and not x.startswith('#')]   #x.startswith('#')用于检查字符串变量x是否以#前缀开始。如果x以该前缀开头,该方法将返回一个布尔值,通常是True,否则返回False。lines = [x.rstrip().lstrip() for x in lines] # get rid of fringe whitespacesmodule_defs = []for line in lines:if line.startswith('['): # This marks the start of a new blockmodule_defs.append({})module_defs[-1]['type'] = line[1:-1].rstrip()if module_defs[-1]['type'] == 'convolutional':module_defs[-1]['batch_normalize'] = 0else:key, value = line.split("=")value = value.strip()module_defs[-1][key.rstrip()] = value.strip()return module_defs

这个函数的目的是将 YOLOv3 模型配置文件中的文本描述转换成 PyTorch 可以理解的网络层模块。它首先处理超参数,然后逐个处理每个模块定义,根据模块的类型(如卷积、池化、上采样、路由、快捷连接和 YOLO 层)创建相应的 PyTorch 层,并添加到 module_list 中。

def create_modules(module_defs):"""Constructs module list of layer blocks from module configuration in module_defs"""# 从模块定义列表中弹出第一个元素,它包含了超参数(hyperparameters),例如输入图像的尺寸等。hyperparams = module_defs.pop(0)# 初始化输出过滤器列表,它将存储每一层的输出通道数(即卷积核的数量)。# 这里假设第一个超参数中的 'channels' 键对应的值是网络输入层的通道数。output_filters = [int(hyperparams["channels"])]# 创建一个 PyTorch 的 ModuleList 对象,用于存储网络层模块。module_list = nn.ModuleList()# 遍历模块定义列表,module_i 是索引,module_def 是当前模块的定义。for module_i, module_def in enumerate(module_defs):# 对于每个模块,创建一个 PyTorch 的 Sequential 对象,用于线性堆叠网络层。modules = nn.Sequential()# 如果模块类型是 "convolutional":if module_def["type"] == "convolutional":# 获取当前模块是否使用批归一化(batch normalization)。bn = int(module_def["batch_normalize"])# 获取卷积核的数量(即输出通道数)。filters = int(module_def["filters"])# 获取卷积核的大小。kernel_size = int(module_def["size"])# 计算填充值,以保持输出尺寸与输入尺寸相同。pad = (kernel_size - 1) // 2# 添加一个卷积层到 Sequential 对象中。modules.add_module(f"conv_{module_i}",nn.Conv2d(in_channels=output_filters[-1],  # 输入特征图的数量。out_channels=filters,  # 输出特征图的数量。kernel_size=kernel_size,  # 卷积核的大小。stride=int(module_def["stride"]),  # 卷积核滑动的步长。padding=pad,  # 填充值。bias=not bn,  # 是否添加偏置项。),)# 如果使用批归一化,则添加一个批归一化层。if bn:modules.add_module(f"batch_norm_{module_i}", nn.BatchNorm2d(filters, momentum=0.9))# 如果激活函数是 "leaky",则添加一个 LeakyReLU 激活层。if module_def["activation"] == "leaky":modules.add_module(f"leaky_{module_i}", nn.LeakyReLU(0.1))# 如果模块类型是 "maxpool":elif module_def["type"] == "maxpool":# 获取池化层的大小和步长。kernel_size = int(module_def["size"])stride = int(module_def["stride"])# 如果池化核大小为2且步长为1,添加一个填充层以保持尺寸。if kernel_size == 2 and stride == 1:modules.add_module(f"_debug_padding_{module_i}", nn.ZeroPad2d((0, 1, 0, 1)))# 添加一个最大池化层。maxpool = nn.MaxPool2d(kernel_size=kernel_size, stride=stride, padding=int((kernel_size - 1) // 2))modules.add_module(f"maxpool_{module_i}", maxpool)# 如果模块类型是 "upsample":elif module_def["type"] == "upsample":# 添加一个上采样层。upsample = Upsample(scale_factor=int(module_def["stride"]), mode="nearest")modules.add_module(f"upsample_{module_i}", upsample)# 如果模块类型是 "route":elif module_def["type"] == "route":# 获取路由层的层索引。layers = [int(x) for x in module_def["layers"].split(",")]# 计算路由层的输出通道数。filters = sum([output_filters[1:][i] for i in layers])# 添加一个空层作为路由层。modules.add_module(f"route_{module_i}", EmptyLayer())# 如果模块类型是 "shortcut":elif module_def["type"] == "shortcut":# 获取快捷连接的输入通道数。filters = output_filters[1:][int(module_def["from"])]# 添加一个空层作为快捷连接层。modules.add_module(f"shortcut_{module_i}", EmptyLayer())# 如果模块类型是 "yolo":elif module_def["type"] == "yolo":# 获取 YOLO 层的锚点索引和锚点值。anchor_idxs = [int(x) for x in module_def["mask"].split(",")]anchors = [int(x) for x in module_def["anchors"].split(",")]anchors = [(anchors[i], anchors[i + 1]) for i in range(0, len(anchors), 2)]anchors = [anchors[i] for i in anchor_idxs]# 获取 YOLO 层的类别数和图像尺寸。num_classes = int(module_def["classes"])img_size = int(hyperparams["height"])# 创建一个 YOLO 层并添加到模块中。yolo_layer = YOLOLayer(anchors, num_classes, img_size)modules.add_module(f"yolo_{module_i}", yolo_layer)# 将构建好的模块添加到模块列表中。module_list.append(modules)# 更新输出过滤器列表,添加当前模块的输出通道数。output_filters.append(filters)# 返回超参数和构建好的模块列表。return hyperparams, module_list

定义了一个名为 Darknet 的类,它是用于构建 YOLOv3 目标检测模型的 PyTorch 神经网络类。

class Darknet(nn.Module):"""YOLOv3 object detection model"""# 这个类继承自 PyTorch 的 nn.Module 类,表示它是一个神经网络模型。# YOLOv3 是一个流行的目标检测算法,这个类实现了 YOLOv3 的网络结构。def __init__(self, config_path, img_size=416):super(Darknet, self).__init__()# 类的构造函数接受两个参数:config_path(模型配置文件的路径)和 img_size(输入图像的尺寸,默认为416)。# super() 函数用于调用父类的构造函数,即初始化 PyTorch 的 nn.Module。self.module_defs = parse_model_config(config_path)# 调用 parse_model_config 函数解析配置文件,并存储解析后的模块定义。self.hyperparams, self.module_list = create_modules(self.module_defs)# 调用 create_modules 函数根据模块定义创建网络层,并存储超参数和模块列表。self.yolo_layers = [layer[0] for layer in self.module_list if hasattr(layer[0], "metrics")]# 从模块列表中提取出包含 'metrics' 属性的层,这些层通常是 YOLO 层,用于目标检测。# hasattr() 函数检查对象是否具有给定的属性。self.img_size = img_size# 存储输入图像的尺寸。self.seen = 0# 用于跟踪训练过程中看到的数据量(例如,图像数量)。self.header_info = np.array([0, 0, 0, self.seen, 0], dtype=np.int32)# 创建一个 NumPy 数组,用于存储与模型相关的头部信息,如版本、修订号、seen、未知字段和 epoch 数。

调用函数

    model = Darknet(opt.model_def).to(device)model.apply(weights_init_normal)#model.apply(fn)表示将fn函数应用到神经网络的各个模块上,包括该神经网络本身。这通常在初始化神经网络的参数时使用,本处用于初始化神经网络的权值

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

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

相关文章

smuge error

0 Preface/Foreword 1 解决方法 第一步:跳过大文件下载,到时候统一使用快速批处理fast batch git lfs install --skip-smudge 故意敲错指令,会出现git lfs install 的usage: 第二步:clone仓库 下载结果:…

R语言机器学习与临床预测模型79--机器学习总览

R小盐准备介绍R语言机器学习与预测模型的学习笔记 你想要的R语言学习资料都在这里, 快来收藏关注【科研私家菜】 01 机器学习分类 机器学习模型主要分为有监督、无监督和强化学习方法。 监督学习 监督学习是教师向学生提供关于他们在考试中是否表现良好的反馈。其中…

黑马软件测试第二篇_功能测试

软件质量模型 应用场景:提供对于软件产品从测试角度思考的一种思路 定义:实际实现的产品和需求描述是否相一致,相一致程度高说明质量满足需求(好) 如何评判软件的质量? 功能:软件产品是否具备某…

React 中组件通信的几种主要方式

一、父传子&#xff1a; 1. 传递多个属性 父组件可以通过 props 传递多个属性给子组件。 示例 // 子组件 function Son(props) {return (<div>This is Son, {props.name} - Age: {props.age}</div>); }// 父组件 function App() {const name This is App N…

精华帖分享|如何全方位无死角保护你的交易所账号

本文来源于量化小论坛策略分享会板块精华帖&#xff0c;作者为菊座&#xff0c;发布于2024年3月4日。 以下为精华帖正文&#xff1a; 01 背景 起因是这两周保4赚麻了&#xff0c;看到中性群里大佬们的曲线&#xff0c;大家都想加大仓位&#xff0c;于是我在群里提醒了下大家资…

【STM32】SD卡

(一)常用卡的认识 在学习这个内容之前&#xff0c;作为生活小白的我对于SD卡、TF卡、SIM卡毫无了解&#xff0c;晕头转向。 SD卡&#xff1a;Secure Digital Card的英文缩写&#xff0c;直译就是“安全数字卡”。一般用于大一些的电子设备比如&#xff1a;电脑、数码相机、AV…

11月第一篇新作,十一月对我好一点:C++之继承(2)

C之继承&#xff08;2&#xff09; 虚继承 很多⼈说C语法复杂&#xff0c;其实多继承就是⼀个体现。有了多继承&#xff0c;就存在菱形继承&#xff0c;有了菱形继承就有 菱形虚拟继承&#xff0c;底层实现就很复杂&#xff0c;性能也会有⼀些损失&#xff0c;所以最好不要设计…

tiktok批量添加达人怎么弄

在 TikTok 上批量添加达人可以借助一些工具或方法&#xff0c;以下是一些常见的途径&#xff1a; 点我达秘免费体验地址注册 使用达人邀约工具&#xff1a; 功能特点&#xff1a;这类工具专为 TikTok 跨境小店和本土小店提供服务&#xff0c;可以实现多国家、多店铺同时私信和…

重塑重工起重行业未来:网关与云平台携手共创价值新篇章

在重工起重这一传统而关键的工业领域中&#xff0c;技术的每一次革新都意味着生产效率与安全标准的飞跃。随着物联网、大数据、云计算等先进技术的不断渗透&#xff0c;重工起重行业正迎来一场前所未有的智能化变革。其中&#xff0c;网关与云平台的深度融合&#xff0c;正成为…

NPOI 操作详解(操作Excel)

目录 1. 安装 NPOI 2. 使用 NPOI 创建新 Excel 文件 3. 设置列宽和行高 1. 设置列宽 2. 设置行高 3. 同时设置列宽和行高 4. 设置统一的行高 5. 设置统一的列宽 6. 应用统一的行高和列宽 4. 合并单元格 5. 设置单元格样式&#xff08;字体、边框、背景色等&#xf…

CMS getshell

进入前台 漏洞为前台任意用户密码修改和前台用户文件上传然后getshell 1. 弱口令进入前台用户admin123/admin123 2. 进入会员用户后点击内容中心 点击发布文章 存在文件上传&#xff0c;发现后缀和MIME类型都是白名单 但是在原文件的基础上继续添加随意后缀&#xff0c;发现成功…

教你用python实现自动化文本识别

目录 步骤1&#xff1a;安装依赖 安装Tesseract 安装pytesseract和Pillow&#xff08;用于图像处理&#xff09; 扩展功能 实现自动化文本识别&#xff08;Optical Character Recognition, OCR&#xff09;通常使用Python的OCR库&#xff0c;例如Tesseract。Tesseract是一个…

逻辑磁盘管理 附实验:逻辑卷的组成与划分

分区类型&#xff1a; 1、系统引导分区 就是存放系统的引导文件和Linux的内核文件 2、swap分区 交换分区&#xff0c;系统的物理内存不足时&#xff0c;从一些长时间未运行的程序当中释放一部分内存释放出来的保存到swap分区&#xff0c;这些未运行的程序一旦运行还要从swap空…

讲讲 kafka 维护消费状态跟踪的方法?

大家好&#xff0c;我是锋哥。今天分享关于【讲讲 kafka 维护消费状态跟踪的方法&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; 讲讲 kafka 维护消费状态跟踪的方法&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Kafka 中&#x…

Flutter-Engine 的定制实践:Text 绘制流程浅析及自定义underline的间距

前言 最近工作中处理的文本相关的内容较多&#xff0c;不论是刁钻的需求还是复杂的问题&#xff0c;最终都会引向一点“Flutter中的文本是如何绘制的&#xff1f;”。 这里我将以“调整下划线与文字的间距”为切入点并结合自定义Engine&#xff0c;记录一下我的个人分析和实践…

[A-14]ARMv8/ARMv9-Memory-内存模型的类型(Device Normal)

ver0.1 [看前序文章有惊喜。] 前言 前面花了很大的精力把ARM构建的VMSA中的几个核心的议题给大家做了介绍,相信大家已经能够理解并掌握ARM的内存子系统的工作原理大致框架。接下来我们会规划一些文章,对ARM内存子系统的一些细节做一下介绍,使ARM的内存子系统更加的丰满。本…

可编辑31页PPT | 智慧业务中台规划建设与应用总体方案

荐言分享&#xff1a;随着数字化转型的深入&#xff0c;企业面临着前所未有的挑战与机遇。为了高效整合内外部资源&#xff0c;快速响应市场变化&#xff0c;提升业务创新能力&#xff0c;智慧业务中台应运而生。智慧业务中台作为企业数字化转型的核心基础设施&#xff0c;旨在…

深入理解Docker,从入门到精通-Part1(基础使用)

一、Docker基本概念 Docker架构 基本组件的介绍 Docker Client 是用户界面&#xff0c;它支持用户与Docker Daemon之间通信 Docker Daemon Docker最核心的后台进程&#xff0c;运行于主机上&#xff0c;处理服务请求 Docker registry是中央registry&#xff0c;支持拥有公有与…

在macOS的多任务处理环境中,如何平衡应用的性能与用户体验?这是否是一个复杂的优化问题?如何优化用户体验|多任务处理|用户体验|应用设计

目录 一 多任务处理与应用性能 1. macOS中的多任务处理机制 2. 性能优化的基本策略 二 用户体验的关键要素 1. 响应速度 2. 界面友好性 3. 功能的直观性 三 平衡性能与用户体验的策略 1. 资源管理 2. 优化数据加载 3. 使用合适的线程模型 4. 实时监测和调整 四 使…

lvm逻辑卷管理

分区类型&#xff1a; 主分区扩展分区逻辑分区系统引导分区&#xff1a;存放系统的引导文件和linux的内核文件swap分区&#xff1a;交换分区&#xff0c;系统的物理内存不足时&#xff0c;从一些长时间未运行的程序当中释放一部分内存&#xff0c;释放出来的内存保存到swap分区…