YOLO V3 SPP ultralytics 第三节:关于yolo 中cfg的网络配置信息和读取cfg配置文件

news2024/11/17 11:35:00

目录

1. 介绍

2.  关于yolo的cfg网络配置文件

2.1 关于卷积层

2.2 关于池化层

2.3 关于捷径分支shortcut

2.4 关于route 层

2.5 关于上采样层

2.6 关于yolo层

3.  解析cfg 文件

4. 代码


1. 介绍

根据 第二节 的步骤,生成了属于自己的 my_yolov3.cfg 配置文件,本章将介绍yolo 配置文件的内容以及如何读取配置文件

 部分的yolo配置文件如下:

 

2.  关于yolo的cfg网络配置文件

因为搭建网络的时候,是根据配置文件cfg逐步实现的,因此理解 cfg网络配置文件也很重要

首先,关于net部分是用于训练的相关配置,这里用不到

TIPS : cfg 配置文件里面的内容不要做更改,因为固定的行号是确定的。删除了一个空格的话,索引的行号就对不上了

 

yolo v3 spp 网络如下:

 

2.1 关于卷积层

卷积层的开始是:[convolutional]

其中,batch_normalize和pad的1代表是否使用这两个参数,为1代表使用

 

2.2 关于池化层

池化层的开始是:[maxpool]

yolo v3 spp中,只有 SPP用maxpool操作,为了实现concatenate 操作,所以要保证shape相同,因此padding 的设定就是为了这个

yolo v3 spp 下采样用卷积 stride = 2实现

 

2.3 关于捷径分支shortcut

捷径分支shortcut的开始是:[shortcut]

-3 代表,前面-3的输出和自己相加

shortcut 是指两个不同信息的shape相同,再相加的操作

如图所示,第一个residual就是两个矩形框的输出相加

 

2.4 关于route 层

route层的开始是:[route]

spp 中,需要多个信息的融合,所以route层也很重要

route 的实现类似于指针

 

具体的如下:
当route 只有一个值的时候,可以理解为一个指针,返回对应的层结构

当route 有多个值的时候,将对应的输出拼接

concatenate 代表在 channel 维度堆起来

 

2.5 关于上采样层

上采样层的开始是:[upsample]

将图像的w和h扩大两倍

 

2.6 关于yolo层

yolo层的开始是:[yolo]

yolo 层并不在 spp 的网络图中,是3个尺度的后处理

前三组是小目标的anchor ,以此类推

3.  解析cfg 文件

代码是 parse_config.py

首先,先读取cfg的文件,去掉空格和注释

 lines 的部分内容为,这里每样保留了一个方便观看:

[

'[net]', 'batch=64', 'subdivisions=16', 'width=608', 'height=608', 'channels=3', 'momentum=0.9', 'decay=0.0005', 'angle=0', 'saturation = 1.5', 'exposure = 1.5', 'hue=.1', 'learning_rate=0.001', 'burn_in=1000', 'max_batches = 500200', 'policy=steps', 'steps=400000,450000', 'scales=.1,.1',

'[convolutional]', 'batch_normalize=1', 'filters=32', 'size=3', 'stride=1', 'pad=1', 'activation=leaky',

'[shortcut]', 'from=-3', 'activation=linear',

'[maxpool]', 'stride=1', 'size=5',

'[route]', 'layers=-2',

'[route]', 'layers=-1,-3,-5,-6',

'[upsample]', 'stride=2',

'[yolo]', 'mask = 6,7,8', 'anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326', 'classes=20', 'num=9', 'jitter=.3', 'ignore_thresh = .7', 'truth_thresh = 1', 'random=1'

]

type 存放网络的结构,后面跟着对应的配置,存放在一个字典中

需要注意的是,有的卷积后面不跟BN层,所以矩形框里面的内容不可忽略。因为大部分conv后面有BN,虽然设定为0,后面也会被替换成本来的值

 

后面是对key的相关操作,key是 = 之前的东西,val是 = 后面的东西,这里主要是将 = 后面的val 数值变成int或者float类型,因为默认读取的val是str类型

 

parse_config.py 代码中,还有一个是解析my_data.data 文件的,具体效果如下:

 

4. 代码

parse_config.py 的代码为:

# 解析网络中的配置文件

import os
import numpy as np


# 解析 my_yolov3.cfg 文件
def parse_model_cfg(path: str):
    if not path.endswith(".cfg") or not os.path.exists(path):    # 检查文件是否存在
        raise FileNotFoundError("the cfg file not exist...")

    # 读取文件信息
    with open(path, "r") as f:
        lines = f.read().split("\n")

    lines = [x for x in lines if x and not x.startswith("#")]   # 去除空行和注释行
    lines = [x.strip() for x in lines]  # 去除每行开头和结尾的空格符

    mdefs = []  # module definitions
    for line in lines:
        if line.startswith("["):    # 网络层都是[]形式
            mdefs.append({})
            mdefs[-1]["type"] = line[1:-1].strip()  # type 存放网络结构,[]里面的

            if mdefs[-1]["type"] == "convolutional":    # 如果是卷积模块,设置默认不使用BN,因为有的conv后面没有BN,0代表不启用BN
                mdefs[-1]["batch_normalize"] = 0
        else:                       # 网络层的参数
            key, val = line.split("=")          # 例如,learning_rate=0.001 用等号进行分割
            key = key.strip()
            val = val.strip()

            # yolo 层
            if key == "anchors":
                val = val.replace(" ", "")  # 将空格去除
                mdefs[-1][key] = np.array([float(x) for x in val.split(",")]).reshape((-1, 2))  # (9,2) anchor
            # 特殊结构
            elif key in ["from", "layers", "mask"]:
                mdefs[-1][key] = [int(x) for x in val.split(",")]
            # 常见的正常网络参数
            else:
                if val.isnumeric():  # return int or float 如果是数值的情况
                    mdefs[-1][key] = int(val) if (int(val) - float(val)) == 0 else float(val)
                else:
                    mdefs[-1][key] = val  # return string  是字符的情况

    # check all fields are supported
    supported = ['type', 'batch_normalize', 'filters', 'size', 'stride', 'pad', 'activation', 'layers', 'groups',
                 'from', 'mask', 'anchors', 'classes', 'num', 'jitter', 'ignore_thresh', 'truth_thresh', 'random',
                 'stride_x', 'stride_y', 'weights_type', 'weights_normalization', 'scale_x_y', 'beta_nms', 'nms_kind',
                 'iou_loss', 'iou_normalizer', 'cls_normalizer', 'iou_thresh', 'probability']

    # 遍历检查每个模型的配置
    for x in mdefs[1:]:  # 0对应 net配置
        # 遍历每个配置字典中的key值
        for k in x:
            if k not in supported:
                raise ValueError("Unsupported fields:{} in cfg".format(k))

    return mdefs


# 解析 my_data.data 文件,用于train的时候找到数据集
def parse_data_cfg(path):   
    if not os.path.exists(path) and os.path.exists('data' + os.sep + path):
        path = 'data' + os.sep + path

    with open(path, 'r') as f:
        lines = f.readlines()

    options = dict()
    for line in lines:
        line = line.strip()
        if line == '' or line.startswith('#'):
            continue
        key, val = line.split('=')
        options[key.strip()] = val.strip()

    return options


# info = parse_model_cfg('../cfg/my_yolov3.cfg')        # 测试解析 cfg文件
# info_data = parse_data_cfg('../data/my_data.data')
# print(info_data)        # {'classes': '20', 'train': 'data/my_train_data.txt', 'valid': 'data/my_val_data.txt', 'names': 'data/my_data_label.names'}

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

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

相关文章

Python 墨西哥湾流(gulf stream)可视化

背景介绍 墨西哥湾流和黑潮分别是北半球两支强大的西边界流,墨西哥湾流的流速还要强于黑潮,也是温盐环流的重要组成部分。 引入涡度的概念,将涡度分为两个部分: 1、行星涡度,记为 f f f,与地球自转有关…

【软考数据库】第十四章 数据库主流应用技术

目录 14.1 分布式数据库 14.2 Web与数据库 14.3 XML与数据库 14.4 面向对象数据库 14.5 大数据与数据库 14.6 NewSQL 前言: 笔记来自《文老师软考数据库》教材精讲,精讲视频在b站,某宝都可以找到,个人感觉通俗易懂。 14.1 …

Springcloud1---->openFeign

目录 简介快速入门导入依赖开启Feign配置Feign客户端接口Feign使用小结feign feign配置负载均衡feign配置Hystix支持 简介 Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切…

WebSocket 详解,以及用QWebSocket 实现服务端和客户端(含代码例子)

目录 1、WebSocket 诞生背景 2、WebSocket的特点: 3、 WebSocket 简介 4、WebSocket 优点 5、QWebSocket通讯—客户端: 6、QWebSocket通讯—服务端: 1、WebSocket 诞生背景 早期,很多网站为了实现推送技术,所用的技术都…

初始Linux发展

目录 前言 Linux概念: 一.Linux发展历史 二.Linux的发展现状 三.发行版本 四.Linux 环境的搭建方式 主要有三种 : 4.6下载方式: 五.XShell软件 前言 Linux概念: Linux,全称GNU/Linux,是一套免费使用和自由传播的…

python中的对象和变量的关系

这里写目录标题 对象简介对象的结构变量和对象 对象简介 Python是一门面向对象的编程语言! 一切皆对象! 程序运行当中,所有的数据都是存储到内存当中然后再运行的! 对象就是内存中专门用来存储指定数据的一块区域 对象实际上就是…

《计算机网络—自顶向下方法》 Wireshark实验(九):DHCP 协议分析

DHCP(Dynamic Host configuration protocol)动态主机配置协议,它可以为客户机自动分配 IP 地址、子网掩码以及缺省网关、DNS 服务器的 IP 地址等 TCP/IP 参数, 简单来说,就是在 DHCP 服务器上有一个数据库,…

Go开发PaaS平台核心功能

Go开发PaaS平台核心功能 1 云原生PaaS平台介绍 随着云计算的发展,越来越多的企业逐步的把IT资源迁移到云上。PaaS平台作为基础设施基座,可以帮助企业快速构建功能丰富的容器云平台,提升交付效率,降低成本。 [1.1] 云原生平台使…

【SpringMVC框架】--01.简介、入门、@RequestMapping、获取请求参数、域对象共享数据、视图、RestFul

文章目录 SpringMVC1.简介1.1 什么是MVC1.2 什么是SpringMVC1.3 SpringMVC的特点 2.编写HelloWorld2.1 创建maven工程2.2 配置web.xml2.3 创建请求控制器2.4 创建springMVC的配置文件2.5测试HelloWorld2.6总结 3.RequestMapping注解3.1 RequestMapping注解的功能3.2 RequestMap…

Java自定义类:打造属于自己的编程世界

🧑‍💻CSDN主页:夏志121的主页 📋专栏地址:Java核心技术专栏 目录 一、自定义类示例 二、隐式参数与显式参数 三、封装的优点 自定义类是Java中最基本、也是最重要的组成部分之一,使用者可以根据需求创建…

【Go微服务开发】gin+grpc+etcd 重构 grpc-todolist 项目

写在前面 最近稍微重构了之前写的 grpc-todolist 模块 项目地址:https://github.com/CocaineCong/grpc-todoList 1. 项目结构改变 与之前的目录有很大的区别 1.1 grpc_todolist 项目总体 1.1.1 改变前 grpc-todolist/ ├── api-gatway // 网关模块 ├── ta…

【小白版】最简单的 goland package 教程包括自定义包的使用

一、Hello World 最简单的教程,就需要从最简单的事情开始说起: mkdir myappcd myappgo mod init myapp // myapp是主项目名 这行命令将生成一个go.mod文件,这个文件会记录所有的包的依赖关系,一个空的go.mod只有项目名称和go版本…

智能指针详解

概念 在c中,动态内存的管理式通过一对运算符来完成的:new,在动态内存中为对象分配空间并返回一个指向该对象的指针,我们可以选择对对象进行初始化;delete,接受一个动态对象的指针,销毁该对象,并…

gitlab建立新分支提交,cherry-pick部分更新

gitlab介绍 GitLab是一个基于Git的在线代码托管和协作平台,提供源代码管理、单元测试、CI/CD构建、代码审查等功能。它是一个开放源代码的Git仓库管理系统,使用 Ruby on Rails 构建GitLab 不仅具有自己的 Git 仓库管理系统,还具有很多其他的…

AI 加持的代码编写实战:快速实现 Nginx 配置格式化工具

本篇文章聊聊如何使用 GPT 快速完成一个开源小项目,解决实际的问题,顺手点亮 GitHub 上 Nginx 开源社区的贡献者图标。 “Talk is Cheap,Show you the Code。” 写在前面 整理了一篇本该上个月就发出的内容。 前段时间,有个投…

浅谈JDK8的垃圾回收器

JDK1.8默认使用Parallel Scavenge作为年轻代的垃圾回收器,使用Parallel Old作为老年代的垃圾回收器,又称为PS MarkSweep。 Parallel Scavenge 收集器 Parallel Scavenge收集器又称为吞吐量优先收集器,和ParNew收集器类似,是一个新生代收集器。…

【OpenCV DNN】Flask 视频监控目标检测教程 01

欢迎关注『OpenCV DNN Youcans』系列,持续更新中 【OpenCV DNN】Flask 视频监控目标检测教程 01 【OpenCV DNN】Flask 视频监控目标检测教程 01 1. 面向Python程序的Web框架2. Flask 框架的安装与使用2.1 Flask 安装2.2 Flask 框架例程2.3 绑定IP和端口2.4 Flask路…

2023-5-20基于52单片机的智能家居系统(蓝牙)

资料已上传在微信公众号:风吹摇铃 奔赴星海 此系统可根据开发板原理图搭配外载模块实现功能,也可以根据原理图焊接或者PCB焊接。 注意:根据开发板搭载外部模块实现功能,需根据开发板原理图修改代码 0、整理及编写了19个常用的5…

NameServer路由注册与发现

NameServer在RocketMQ中主要承担的就是路由的管理、服务注册、以及服务的发现。在RocketMQ这承担着很重要的责任。 整体架构: 消息生产者在发送消息前需要考虑的问题就是,我需要发给谁?地址在哪儿?对于消费者也一样。那么NameSer…

软件工程 | 期末复习

一、软件与软件危机 1、软件发展经历三个阶段:程序设计、程序系统、软件工程 2、软件的概念:软件是计算机系统与硬件相互依存的另一部分,包括程序、数据以及相关文档的完整集合,软件程序数据文档 数据:使程序能够适…