物体检测-系列教程19:YOLOV5 源码解析9 (Focus模块、Model类构造函数)

😎😎😎物体检测-系列教程 总目录

有任何问题欢迎在下面留言
本篇文章的代码运行界面均在Pycharm中进行
本篇文章配套的代码资源已经上传
点我下载源码

13、Focus模块

13.1 基本流程

在这里插入图片描述

  1. 原始输入图像的格式为:tensor: float32[1,3,640,640]
  2. 如图所示,首先对于每个通道对应的图都将其平均分成A、B、C、D4块
  3. 再分别将A、B、C、D也平均分成更小4块
  4. 从A、B、C、D每个位置都各取一块拼接成一个大块
  5. 将大块在原图对应的通道位置进行通道的堆叠
  6. 最后得到4张图像,此时通道数变成了12
  7. 此时进行卷积的时候,长宽减小而通道输入增加了,有利于减少计算量,但是却不会减少AP值
  8. 此时数据的格式为:tensor: float32[1,320,320,12]
  9. focus模块也有自己的卷积,然后经过hardswish激活函数 H a r d s w i s h ( x ) = { 0 i f x < = − 3 , x i f x > = + 3 , x ∗ ( x + 3 ) / 6 o t h e r w i s e Hardswish(x)=\begin{cases} 0 & if x<=-3,\\ x & if x>=+3,\\ x*(x+3)/6 & otherwise \end{cases} Hardswish(x)= 0xx(x+3)/6ifx<=3,ifx>=+3,otherwise

13.2 源码

Focus模块通过空间重组来增强通道信息

class Focus(nn.Module):# Focus wh information into c-spacedef __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):  # ch_in, ch_out, kernel, stride, padding, groupssuper(Focus, self).__init__()self.conv = Conv(c1 * 4, c2, k, s, p, g, act)def forward(self, x):  # x(b,c,w,h) -> y(b,4c,w/2,h/2)return self.conv(torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1))
  1. 继承nn.module
  2. 构造函数,接受7个参数:c1输入通道、c2输出通道、k卷积核大小、s卷积步长、p填充、g卷积分组数、act激活函数
  3. 初始化
  4. 调用Conv类构造一个卷积层,这个类已经实现了批归一化、卷积、激活函数等
  5. 前向传播函数
  6. 将输入x在空间维度上分割为四部分,然后在通道维度上拼接,通过卷积层处理后输出

14、Model类

14.1 构造函数

class Model(nn.Module):def __init__(self, cfg='yolov5s.yaml', ch=3, nc=None):  # model, input channels, number of classessuper(Model, self).__init__()if isinstance(cfg, dict):self.yaml = cfg  # model dictelse:  # is *.yamlimport yaml  # for torch hubself.yaml_file = Path(cfg).namewith open(cfg) as f:self.yaml = yaml.load(f, Loader=yaml.FullLoader)  # model dict# Define modelif nc and nc != self.yaml['nc']:print('Overriding %s nc=%g with nc=%g' % (cfg, self.yaml['nc'], nc))self.yaml['nc'] = nc  # override yaml valueself.model, self.save = parse_model(deepcopy(self.yaml), ch=[ch])  # model, savelist, ch_out# print([x.shape for x in self.forward(torch.zeros(1, ch, 64, 64))])# Build strides, anchorsm = self.model[-1]  # Detect()if isinstance(m, Detect):s = 128  # 2x min stridem.stride = torch.tensor([s / x.shape[-2] for x in self.forward(torch.zeros(1, ch, s, s))])  # forwardm.anchors /= m.stride.view(-1, 1, 1)check_anchor_order(m)self.stride = m.strideself._initialize_biases()  # only run once# print('Strides: %s' % m.stride.tolist())# Init weights, biasesinitialize_weights(self)self.info()print('')
  1. 继承nn.Module
  2. 构造函数,传入3个参数,配置文件路径、输入通道数、类别数
  3. 初始化
  4. 配置信息是否为字典:
  5. 赋值给self.yaml
  6. 否则:
  7. 导入yaml工具包
  8. yaml_file ,获取文件名称
  9. 打开配置文件
  10. yaml ,加载配置文件
  11. 如果指定了类别数,并且与配置文件中的类别数不同
  12. 打印一条消息,说明正在覆盖YAML文件中的类别数
  13. 更新yaml字典中的类别数
  14. model,save ,调用parse_model函数,传入模型配置和输入通道数,返回模型的层和需要保存的层的列表
  15. m,获取模型的最后一层,通常是用于检测的层
  16. 最后一层是否是一个检测层
  17. s,设置一个基准步长大小
  18. m.stride,计算并设置检测层的步长。这是通过前向传播一个零张量(其尺寸基于s和输入通道数ch)并计算输出特征图的高度或宽度相对于s的比率来完成的
  19. m.anchors,调整锚点大小,使其适应步长的变化
  20. 调用check_anchor_order函数,检查锚点的顺序,并在需要时进行调整
  21. stride
  22. 调用**_initialize_biases函数**初始化模型的偏置参数,确保初始预测接近于均匀分布
  23. 调用initialize_weights函数来初始化模型中所有层的权重,以帮助模型训练时的收敛
  24. 调用info函数,打印模型的信息
  25. 打印一个换行,在输出中提供清晰的分隔,使得模型信息更容易阅读

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

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

相关文章

map和set例题应用

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 第一题 第二题 第三题 第一题 随机链表的复制https://leetcode.cn/problems/copy-list-with-random-pointer/description/ 思路 首先遍历旧链表&#xff0c;并创建新节点&#xff0c;同时用map将旧节点与新节点…

存储过程基本了解

文章目录 介绍存储过程示例1. 目的2. 输入参数3. 输出参数4. 执行逻辑5. 返回值6. 示例用法7. 注意事项 存储过程的关键字有哪些简单实操 介绍 存储过程是一组预编译的SQL语句&#xff0c;以及流程控制语句&#xff0c;封装在数据库服务器中并可以被重复调用。它们可以接收参数…

Mac 重新安装系统

Mac 重新安装系统 使用可引导安装器重新安装&#xff08;可用于安装非最新的 Mac OS&#xff0c;系统降级&#xff0c;需要清除所有数据&#xff09; 插入制作好的可引导安装器&#xff08;U盘或者移动固态硬盘&#xff09;&#xff0c;如何制作可引导安装器将 Mac 关机将 Ma…

MyBatis 学习(三)之 MyBatis 全局配置文件

目录 1 MyBatis 全局配置文件 2 properties 元素 3 setting 设置 4 typeAlianses 别名处理器 5 typeHandler 类型处理器 6 objectFacotry 对象工厂&#xff08;了解&#xff09; 7 plugins 插件&#xff08;了解&#xff09; 8 environments 运行环境 9 databaseIdPro…

TDengine 研发分享:利用 Windbg 解决内存泄漏问题的实践和经验

内存泄漏是一种常见的问题&#xff0c;它会导致程序的内存占用逐渐增加&#xff0c;最终导致系统资源耗尽或程序崩溃。AddressSanitizer (ASan) 和 Valgrind 是很好的内存检测工具&#xff0c;TDengine 的 CI 过程就使用了 ASan 。不过这次内存泄漏问题发生在 Windows 下&#…

探秘Python的Pipeline魔法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站AI学习网站。 目录 前言 什么是Pipeline&#xff1f; Pipeline的基本用法 Pipeline的高级用法 1. 动态调参 2. 并行处理 3. 多输出 …

AVL 树

AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年 发明了一种解决…

Qt的QFileSystemModel与QTreeView、QTableView、QListView的组合使用

1.相关描述 QFileSystemModel与QTreeView、QTableView、QListView的组合&#xff0c;当QTreeView点击发生改变&#xff0c;QTableView和QListView也会发生变化 2.相关界面 3.相关代码 mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h"…

Chrome插件 | WEB 网页数据采集和爬虫程序

无边无形的互联网遍地是数据&#xff0c;品类丰富、格式繁多&#xff0c;包罗万象。数据采集&#xff0c;或说抓取&#xff0c;就是把分散各处的内容&#xff0c;通过各种方式汇聚一堂&#xff0c;是个有讲究要思考的体力活。君子爱数&#xff0c;取之有道&#xff0c;得注意遵…

3.1 IO进程线程

使用fwrite、fread将一张随意的bmp图片&#xff0c;修改成德国的国旗 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> int main(int argc, const char *argv[]) {FILE* fp fopen("./2.bmp","r&quo…

【JVM】聊聊常见的JVM排查工具

JDK工具包 jps 虚拟机进程状况工具 jps是虚拟机进程状况工具&#xff0c;列出正在运行的虚拟机进程&#xff0c;使用 Windows 的任务管理器或 UNIX 的 ps 命令也可以查询&#xff0c;但如果同时启动多个进程&#xff0c;必须依赖 jps。jps -l 显示类名 jps :列出Java程序进程…

物联网通信协议介绍

为了方便&#xff0c;将物联网通信协议分为两大类&#xff0c;一类是接入协议&#xff0c;一类是通讯协议。接入协议一般负责子网内设备间的组网及通信&#xff1b;通讯协议主要是运行在传统互联网TCP/IP协议之上的设备通讯协议&#xff0c;负责设备通过互联网进行数据交换及通…