YOLOv8模型代码学习

1.参考文献

链接1

2.网络模型解析

2.1卷积神经单元(conv.py)

在该文件中定义了yolov8网络中的卷积神经单元,位置如图所示。

def autopad(k, p=None, d=1):  # kernel(卷积核), padding(填充), dilation(扩张)
    """Pad to 'same' shape outputs."""
    # 返回pad的大小,使得padding后输出张量的shape不变
    if d > 1:  # 如果采用扩张卷积,则计算扩张后实际的kernel大小
        k = d * (k - 1) + 1 if isinstance(k, int) else [d * (x - 1) + 1 for x in k]  # actual kernel-size
    if p is None:
        p = k // 2 if isinstance(k, int) else [x // 2 for x in k]  # auto-pad # 自动pad
    return p

2.1.1代码解释

  • 扩张卷积的处理
if d > 1:  # 如果采用扩张卷积,则计算扩张后实际的kernel大小
    k = d * (k - 1) + 1 if isinstance(k, int) else [d * (x - 1) + 1 for x in k]  # actual kernel-size

这部分代码的作用是,如果 d 大于1,则计算扩张卷积后的实际卷积核大小。对于扩张卷积,其有效卷积核大小会增大:

  1. 如果 k 是一个整数,新的卷积核大小为 d * (k - 1) + 1
  2. 如果 k 是一个列表,则对列表中的每一个元素 x 进行相同的计算,生成新的列表。
  • 自动填充计算
if p is None:
    p = k // 2 if isinstance(k, int) else [x // 2 for x in k]  # auto-pad # 自动pad

这部分代码的作用是,如果没有显式指定填充大小 p(即 pNone),则自动计算填充大小以保持输出形状不变:

  1. 如果 k 是一个整数,则填充大小为 k // 2
  2. 如果 k 是一个列表,则对列表中的每一个元素 x 进行 x // 2 的计算,生成新的列表。
  • 返回填充大小
return p

最后返回计算出的填充大小 p

2.1.2示例

1:普通卷积,3x3卷积核

假设我们有一个3x3的卷积核,扩张率 d=1(即没有扩张),并且没有指定填充 p

k = 3
p = autopad(k, p=None, d=1)
print(p)  # 预期输出: 1
  • 计算过程:
  1. 没有扩张,卷积核大小保持3x3。
  2. 自动填充 p 计算:p = k // 2 = 3 // 2 = 1

输出的填充大小为1,这意味着每边需要填充1个像素,使得输出张量的形状与输入张量相同。

2:扩张卷积,3x3卷积核,扩张率2

假设我们有一个3x3的卷积核,扩张率 d=2,并且没有指定填充 p

k = 3
p = autopad(k, p=None, d=2)
print(p)  # 预期输出: 2
  • 计算过程:
  1. 扩张后,实际卷积核大小:k = d * (k - 1) + 1 = 2 * (3 - 1) + 1 = 5
  2. 自动填充 p 计算:p = k // 2 = 5 // 2 = 2

输出的填充大小为2,这意味着每边需要填充2个像素,使得输出张量的形状与输入张量相同。

3:矩形卷积核,5x7卷积核

假设我们有一个5x7的矩形卷积核,扩张率 d=1,并且没有指定填充 p

k = [5, 7]
p = autopad(k, p=None, d=1)
print(p)  # 预期输出: [2, 3]

  • 计算过程:
  1. 没有扩张,卷积核大小保持5x7。
  2. 自动填充 p 计算:p = [x // 2 for x in k] = [5 // 2, 7 // 2] = [2, 3]

输出的填充大小为 [2, 3],这意味着高度方向需要填充2个像素,宽度方向需要填充3个像素,使得输出张量的形状与输入张量相同。

4:矩形卷积核,5x7卷积核,扩张率2

假设我们有一个5x7的矩形卷积核,扩张率 d=2,并且没有指定填充 p

k = [5, 7]
p = autopad(k, p=None, d=2)
print(p)  # 预期输出: [4, 6]
  • 计算过程:
  1. 扩张后,实际卷积核大小:k = [d * (x - 1) + 1 for x in k] = [2 * (5 - 1) + 1, 2 * (7 - 1) + 1] = [9, 13]
  2. 自动填充 p 计算:p = [x // 2 for x in k] = [9 // 2, 13 // 2] = [4, 6]

输出的填充大小为 [4, 6],这意味着高度方向需要填充4个像素,宽度方向需要填充6个像素,使得输出张量的形状与输入张量相同。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据中心技术:大数据时代的机遇与挑战

在大数据时代,数据中心网络对于存储和处理大量信息至关重要。随着云计算的出现,数据中心已成为现代技术的支柱,支持社交媒体、金融服务等众多行业。然而,生成和处理的大量数据带来了一些挑战,需要创新的解决方案。在这…

不同版本的 Rocky Linux 快速更换阿里镜像源

环境:兼容 Rocky Linux 任意版本。 搞服务器系统从 CentOS 折腾到 Rocky Linux,然后又折腾到 Alma Linux;最近因为 RKE2 没有做 Alma Linux 的兼容性,又折腾到了 Rocky Linux ,真的是一把鼻涕一把泪呀。但是实在是不理…

深入理解和实现Windows进程间通信(共享内存)

常见的进程间通信方法 常见的进程间通信方法有: 管道(Pipe)消息队列共享内存信号量套接字 下面,我们将详细介绍共享内存的原理以及具体实现。 什么是共享内存? Windows共享内存(Shared Memory in Windo…

【linux】内核源码TCP->IP->L2层函数调用继续摸索中

日志打印的时候,把行数也打印了: 登录 - Gitee.comhttps://gitee.com/r77683962/linux-6.9.0/commit/b847489a9910f68b9581fd8788807c697c82cdbd 上回基于应用层wget操作找到TCP调用的一些接口,并且已经到IP层的一些接口,当前基…

Windows系统Maven下载安装

下载: 官网地址:https://maven.apache.org/download.cgi 安装: 下载下来的是一个压缩包,首先将其解压到你的Maven目标安装位置 接下来为其配置其环境变量 (Maven的基础是Java,因此要首先确认已为你的电…

求求你别学了:从 Prompt 到 RAG,从 RAG 到 DSPy

如本瓜在此前的文章中提到过,Prompt 工程已经不中用了,没有人愿意废那么大的劲来学习如何结构化提问,大家想要的就是傻瓜式提问,但是大模型的回答还是精准的、合意的; 后来,大兴 RAG 技术,做专…

Nuxt快速学习开发 - Nuxt3静态资源Assets

Nuxt 使用两个目录来处理样式表、字体或图像等资产。 public/目录内容按原样在服务器根目录中提供。 assets/目录包含您希望构建工具(Vite 或 webpack)处理的所有资产。 public/目录 public目录用作静态资产的公共服务器,可在您的应用程序定…

景联文科技构建高质量多轮对话数据库,赋能AI交互新飞跃

近年来,大语言模型的发展极大推动了自然语言处理领域的进步,大语言模型正引领智能对话领域进入一个全新时代,不仅提升了对话体验的自然度和效率,也为探索更加人性化、智能化的交互方式开辟了道路。 景联文科技作为大语言模型数据服…

文心一言 VS 讯飞星火 VS chatgpt (285)-- 算法导论21.2 4题

四、请给出图 21-3 所示操作序列的一个运行时间的渐近紧确界,假定使用链表表示和加权合并启发式策略。如果要写代码,请用go语言。 文心一言: 图 21-3 没有直接给出,但通常这种操作序列可能与某种数据结构(如并查集或…

算法:分治(归并)题目练习

目录 题目一:排序数组 题目二:数组中的逆序对 题目三:计算右侧小于当前元素的个数 题目四:翻转对 题目一:排序数组 给你一个整数数组 nums,请你将该数组升序排列。 示例 1: 输入&#xf…

收银系统源码推荐收银系统二次开发

千呼新零售收银系统是一套线下线上一体化的收银系统,给商户提供了含有线下收银/称重、线上小程序商城、精细化会员管理、ERP进销存、营销活动、移动店务管理等一体化解决方案! 1. 多样化线下收银 线下收银支持Windows收银、安卓收银、智能称重收银、无人…

BFS:FloodFill算法

文章目录 FloodFill算法简介1.图像渲染2.岛屿数量3.岛屿的最大面积4.被围绕的区域总结 FloodFill算法简介 Flood Fill算法是一种用于确定与某个给定节点相连的区域的算法,常用于计算机图形学和图像处理。该算法可以用于诸如填充多边形、检测连通区域等任务。Flood …

Linux 一键部署 Nginx1.26.1 + ModSecurity3

前言 ModSecurity 是 Apache 基金会的一个开源、高性能的 Web 应用程序防火墙(WAF),它提供了强大的安全规则引擎,用于检测和阻止各种攻击行为,如 SQL 注入、XSS 跨站点脚本攻击等。而 nginx 是一个高性能的 Web 服务器,常用于处理大量的并发请求,具有很高的负载均衡能力…

蓝牙数传芯片TD5325A,蓝牙5.1—拓达半导体

拓达TD5325A芯片是一款支持蓝牙BLE&SPP的纯数传芯片,蓝牙5.1版本。芯片的亮点在于性能强,支持APP端直接对芯片做设置与查询操作,包括修改蓝牙名、UUID、MAC地址,以及直接操作蓝牙芯片自身的IO与PWM口,还包括支持简…

Linux:用户账号和权限管理的命令

目录 一、Linux用户的分类和组的分类 1.1、用户账号和组账号 1.2、用户的分类 1.3、组账号 1.4、用户账号文件/etc/passwd 二、用户管理相关命令 2.1、chage命令:用来修改帐号和密码的有效期限,针对目前系统已经存在的用户 2.2、useradd&#xf…

行车记录仪文件夹“0字节”现象解析与恢复策略

一、行车记录仪文件夹“0字节”现象描述 行车记录仪作为现代驾驶中的必备设备,其储存的视频数据对于事故记录和取证至关重要。然而,有时车主们可能会遇到这样一个问题:行车记录仪的某个文件夹内的文件突然变成了0字节大小,无法正…

Vue快速上手和Vue指令

一、Vue快速上手 1、Vue概念 Vue (读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式框架 Vue2官网:https://v2.cn.vuejs.org/ 构建用户界面:基于数据渲染出用户可以看到的界面 渐进式: 循序渐进,不一定非得把…

操作系统精选题(一)(PV经典问题之生产者与消费者)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀操作系统 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 前言 进程互斥与同步 题目一 题目二 题…

开发uniapp插件包aar文件,使uniapp可以调用jar包

背景 使用 uniapp 开发应用时,很多时候都需要调用第三方的sdk,一般以 jar 为主。为了应对这个问题,官方提供了插件方案,可以将第三方 jar 包进行封装为 aar 包后,再集成到 uniapp 中使用。 一、环境安装工具 1、jdk…

后台管理台字典localStorage缓存删除

localStorage里存放了如以下dictItems_开头的字典数据,localStorage缓存是没有过期时间的,需要手动删除。同时localStorage里还存有其他不需要删除的数据。 这里的方案是遍历localStorage,利用正则和所有key进行匹配,匹配到dict…