当前位置: 首页 > article >正文

YOLO目标检测3

 一. 参考资料

《YOLO目标检测》 by 杨建华博士

本篇文章的主要内容来自于这本书,只是作为学习记录进行分享。

二. 搭建YOLOv1的网络

2.1 YOLOv1的网络结构

        作者带我们构建的YOLOv1网络是一个全卷积结构,其中不包含任何全连接层,这一点可以避免YOLOv1中存在的因全连接层而导致的参数过多的问题。尽管YOLO网络是在YOLOv2工作才开始转变为全卷积结构,但我们已经了解了全连接层的弊端,因此没有必要再循规蹈矩地照搬YOLOv1的原始网络结构,这也符合我们设计YOLOv1的初衷。

2.1.1 主干网络

        使用当下流行的ResNet网络代替YOLOv1的GoogLeNet风格的主干网络。相较于原本的主干网络,ResNet使用了诸如批归一化(batch normalization,BN)、残差连接(residual connection)等操作,有助于稳定训练更大更深的网络。

        前面已经讲过,将图像分类网络用作目标检测网络的主干网络时,通常是不需要最后的平均池化层和分类层的,因此,这里去除ResNet-18网络中的最后的平均池化层和全连接层,

        这里使用的ResNet-18网络的最大降采样倍数为32,在这个网络中,默认输入图像尺寸为416 \times 416,最后的输出图像为14 \times 14,要比传统的YOLOv1更精细些。

        根据书中提供的代码,实现ResNet主干网络的关键部分的代码为:

# YOLO_Tutorial/models/yolov1/yolov1_backbone.py
# --------------------------------------------------------
...
class ResNet(nn.Module):def __init__(self, block, layers, zero_init_residual=False):super(ResNet, self).__init__()self.inplanes=64self.conv1=nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, bias=False)self.bn1=nn.BatchNorm2d(64)self.relu=nn.ReLU(inplace=True)self.maxpool=nn.MaxPool2d(kernel_size=3, stride=2, padding=1)self.layer1=self._make_layer(block, 64, layers[0])self.layer2=self._make_layer(block, 128, layers[1], stride=2)self.layer3=self._make_layer(block, 256, layers[2], stride=2)self.layer4=self._make_layer(block, 512, layers[3], stride=2)def forward(self, x):c1=self.conv1(x)     # [B, C, H/2, W/2]c1=self.bn1(c1)      # [B, C, H/2, W/2]c1=self.relu(c1)     # [B, C, H/2, W/2]c2=self.maxpool(c1)  # [B, C, H/4, W/4]c2=self.layer1(c2)   # [B, C, H/4, W/4]c3=self.layer2(c2)   # [B, C, H/8, W/8]c4=self.layer3(c3)   # [B, C, H/16, W/16]c5=self.layer4(c4)   # [B, C, H/32, W/32]return c5
2.1.2 颈部网络

        出于参数和性能的综合考虑,作者使用性价比较高的空间金字塔池化(SPP)模块,遵循主流的YOLO框架的做法,对SPP模块进行适当的改进。

改进的SPP模块的网络结构设计参考了YOLOv5开源项目中的实现方法,让一层5×5的最大池化层等效于先前讲过的5×5、9×9和13×13这三条并行的最大池化层分支,从而降低计算开销,这也和之前所讲的空间金字塔的特性相同,通过逐层卷积能够从小到大找到不同尺寸的目标,再将不同的卷积结果叠起来进行最终的输出。

# YOLO_Tutorial/models/yolov1/yolov1_neck.py
# --------------------------------------------------------
...
class SPPF(nn.Module):def __init__(self, in_dim, out_dim, expand_ratio=0.5, pooling_size=5,act_type='lrelu', norm_type='BN'):super().__init__()inter_dim=int(in_dim * expand_ratio)self.out_dim=out_dimself.cv1=Conv(in_dim, inter_dim, k=1, act_type=act_type, norm_type=norm_type)self.cv2=Conv(inter_dim * 4, out_dim, k=1, act_type=act_type, norm_type=norm_type)self.m=nn.MaxPool2d(kernel_size=pooling_size, stride=1, padding=pooling_size // 2)def forward(self, x):x=self.cv1(x)y1=self.m(x)y2=self.m(y1)return self.cv2(torch.cat((x, y1, y2, self.m(y2)), 1))

在代码4-2中,输入的特征图会先被一层1 \times 1卷积处理,其通道数会被压缩一半,随后再由一层5 \times 5最大池化层连续处理三次,依据感受野的原理,该处理方式等价于分别使用5 \times 59 \times 913 \times 13最大池化层并行地处理特征图。最后,将所有处理后的特征图沿通道拼接,再由另一层1 \times 1卷积做一次输出的映射,将其通道映射至指定数目的输出通道。

2.1.3 检测头

在YOLOv1中,检测头部分用的是全连接层,全连接层具有参数过多,过于占用内存空间的缺点,这里,我们抛弃全连接层,改用卷积网络。由于当前主流的检测头是解耦检测头,因此,我们也采用解耦检测头作为YOLOv1的检测头,由类别分支和回归分支组成,类别分支进行类别和置信度预测,回归分支进行位置参数预测,如图4-4所示。

检测头的结构十分简单,共输出两种不同的特征:类别特征\mathbf{F}_{cls} \in \mathbb{R}^{13 \times 13 \times 512}和位置特征\mathbf{F}_{reg} \in \mathbb{R}^{13 \times 13 \times 512},没有复杂结构,代码编写简单,作者实现了相关代码,如以下代码所示:

# YOLO_Tutorial/models/yolov1/yolov1_head.py
# --------------------------------------------------------
...
class DecoupledHead(nn.Module):def __init__(self, cfg, in_dim, out_dim, num_classes=80):super().__init__()print('==============================')print('Head: Decoupled Head')self.in_dim=in_dimself.num_cls_head=cfg['num_cls_head']self.num_reg_head=cfg['num_reg_head']self.act_type=cfg['head_act']self.norm_type=cfg['head_norm']# cls headcls_feats=[]self.cls_out_dim=max(out_dim, num_classes)for i in range(cfg['num_cls_head']):if i==0:cls_feats.append(Conv(in_dim, self.cls_out_dim, k=3, p=1, s=1,act_type=self.act_type,norm_type=self.norm_type,depthwise=cfg['head_depthwise']))else:cls_feats.append(Conv(self.cls_out_dim, self.cls_out_dim, k=3, p=1, s=1,act_type=self.act_type,norm_type=self.norm_type,depthwise=cfg['head_depthwise']))# reg headreg_feats=[]self.reg_out_dim=max(out_dim, 64)for i in range(cfg['num_reg_head']):if i==0:reg_feats.append(Conv(in_dim, self.reg_out_dim, k=3, p=1, s=1,act_type=self.act_type,norm_type=self.norm_type,depthwise=cfg['head_depthwise']))else:reg_feats.append(Conv(self.reg_out_dim, self.reg_out_dim, k=3, p=1, s=1,act_type=self.act_type,norm_type=self.norm_type,depthwise=cfg['head_depthwise']))self.cls_feats=nn.Sequential(*cls_feats)self.reg_feats=nn.Sequential(*reg_feats)def forward(self, x):cls_feats=self.cls_feats(x)reg_feats=self.reg_feats(x)return cls_feats, reg_feats
2.1.4 预测层

        在官方的YOLOv1中,每个网格预测两个边界框,而这两个边界框的学习完全依赖自身预测的边界框位置的准确性,YOLOv1本身并没有对这两个边界框做任何约束。可以认为,这两个边界框是“平权”的,谁学得好谁学得差完全是随机的,二者之间没有显式的互斥关系,且每个网格处最终只会输出置信度最大的边界框,那么可以将这两个“平权”的边界框修改为一个边界框,即每个网格处只需要输出一个边界框。于是,我们的YOLOv1网络最终输出的张量为\mathbf{Y} \in \mathbb{R}^{13 \times 13 \times (1+N_c+4)},其中通道维度上的1表示边界框的置信度,N_c表示类别的总数,4表示边界框的4个位置参数。这里不再有表示每个网格的边界框数量的B

        预测层                

相关文章:

YOLO目标检测3

一. 参考资料 《YOLO目标检测》 by 杨建华博士 本篇文章的主要内容来自于这本书,只是作为学习记录进行分享。 二. 搭建YOLOv1的网络 2.1 YOLOv1的网络结构 作者带我们构建的YOLOv1网络是一个全卷积结构,其中不包含任何全连接层,这一点可以…...

css3 svg制作404页面动画效果HTML源码

源码介绍 css3 svg制作404页面动画效果HTML源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果 效果预览 源码如下 <!doctype html> <html> <head> <meta charse…...

LINUX 平台最快子网路由转发,内核使能选项配置

阅读本文之间&#xff0c;可线性参考以下文献。 Linux 命令行配置为单臂旁路由。_linux单臂路由-CSDN博客 Linux 软路由命令行配置&#xff08;参考&#xff09;_linux软路由-CSDN博客 VGW在 Windows 平台上局域网就绪的旁路由器程序_windows旁路由-CSDN博客 本文介绍 LINUX…...

「 机器人 」扑翼飞行器混合控制策略缺点浅谈

前言 将基于模型的控制与强化学习策略融合在扑翼飞行器中,虽然能够兼顾系统稳定性与极限机动能力,但也面临了更高的系统复杂性、对硬件算力与可靠性的额外要求,以及难以回避的能量效率等方面挑战。以下从四个方面进行归纳与分析。 1. 系统复杂性增加 1.1 两种控制方法的并存…...

RNN实现阿尔茨海默症的诊断识别

本文为为&#x1f517;365天深度学习训练营内部文章 原作者&#xff1a;K同学啊 一 导入数据 import torch.nn as nn import torch.nn.functional as F import torchvision,torch from sklearn.preprocessing import StandardScaler from torch.utils.data import TensorDatase…...

HackTheBox靶机:Sightless;NodeJS模板注入漏洞,盲XSS跨站脚本攻击漏洞实战

HackTheBox靶机&#xff1a;Sightless 渗透过程1. 信息收集常规探测深入分析 2. 漏洞利用&#xff08;CVE-2022-0944&#xff09;3. 从Docker中提权4. 信息收集&#xff08;michael用户&#xff09;5. 漏洞利用 Froxlor6. 解密Keepass文件 漏洞分析SQLPad CVE-2022-0944 靶机介…...

docker安装elk6.7.1-搜集java日志

docker安装elk6.7.1-搜集java日志 如果对运维课程感兴趣&#xff0c;可以在b站上、A站或csdn上搜索我的账号&#xff1a; 运维实战课程&#xff0c;可以关注我&#xff0c;学习更多免费的运维实战技术视频 0.规划 192.168.171.130 tomcat日志filebeat 192.168.171.131 …...

XML实体注入漏洞攻与防

JAVA中的XXE攻防 回显型 无回显型 cve-2014-3574...

Flutter 与 React 前端框架对比:深入分析与实战示例

Flutter 与 React 前端框架对比&#xff1a;深入分析与实战示例 在现代前端开发中&#xff0c;Flutter 和 React 是两个非常流行的框架。Flutter 是 Google 推出的跨平台开发框架&#xff0c;支持从一个代码库生成 iOS、Android、Web 和桌面应用&#xff1b;React 则是 Facebo…...

使用 Docker Compose 一键启动 Redis、MySQL 和 RabbitMQ

目录 一、Docker Compose 简介 二、服务配置详解 1. Redis 配置 2. MySQL 配置 3. RabbitMQ 配置 三、数据持久化与时间同步 四、部署与管理 五、总结 目录挂载与卷映射的区别 现代软件开发中&#xff0c;微服务架构因其灵活性和可扩展性而备受青睐。为了支持微服务的…...

【问题解决】el-upload数据上传成功后不显示成功icon

el-upload数据上传成功后不显示成功icon 原因 由于后端返回数据与要求形式不符&#xff0c;使用el-upload默认方法调用onSuccess钩子失败&#xff0c;上传文件的状态并未发生改变&#xff0c;因此数据上传成功后并未显示成功的icon标志。 解决方法 点击按钮&#xff0c;调用…...

spring框架之IoC学习与梳理(1)

目录 一、spring-IoC的基本解释。 二、spring-IoC的简单demo&#xff08;案例&#xff09;。 &#xff08;1&#xff09;maven-repository官网中找依赖坐标。 &#xff08;2&#xff09;.pom文件中通过标签引入。 &#xff08;3&#xff09;使用lombok帮助快速开发。 &#xff…...

MQ的可靠消息投递机制

确保消息在发送、传递和消费过程中不会丢失、重复消费或错乱。 1. 消息的可靠投递 消息持久化&#xff1a; 消息被发送到队列后会存储在磁盘上&#xff0c;即使消息队列崩溃&#xff0c;消息也不会丢失。例如&#xff1a;Kafka、RabbitMQ等都支持持久化消息。Kafka通过将消息存…...

Mono里运行C#脚本35—加载C#语言基类的过程

前面大体地分析了整个Mono运行过程,主要从文件的加载,再到EXE文件的入口点, 然后到方法的编译,机器代码的生成,再到函数调用的跳板转换,进而解析递归地实现JIT。 但是还有很多功能没有解析的,就是C#语言相关最多的,就是类的加载,以及类语言设计的实现属性, 比如类的…...

location+rewrite实现隐性域名配置

隐性域名&#xff1a;访问www.a.com 则跳转到www.b.com的页面&#xff0c;但是地址栏还是显示www.a.com 1、配置基于根目录的隐性域名&#xff08;就是nginx反向代理&#xff09; 访问http://www.bbb.org:8002&#xff0c; 跳转http://www.accp.org:8001的页面&#xff0c;地址…...

150 Linux 网络编程6 ,从socket 到 epoll整理。listen函数参数再研究

一 . 只能被一个client 链接 socket例子 此例子用于socket 例子&#xff0c; 该例子只能用于一个客户端连接server。 不能用于多个client 连接 server socket_server_support_one_clientconnect.c /* 此例子用于socket 例子&#xff0c; 该例子只能用于一个客户端连接server。…...

centos7 配置国内镜像源安装 docker

使用国内镜像源&#xff1a;由于 Docker 的官方源在国内访问可能不稳定&#xff0c;你可以使用国内的镜像源&#xff0c;如阿里云的镜像源。手动创建 /etc/yum.repos.d/docker-ce.repo 文件&#xff0c;并添加以下内容&#xff1a; [docker-ce-stable] nameDocker CE Stable -…...

周末总结(2024/01/25)

工作 人际关系核心实践&#xff1a; 要学会随时回应别人的善意&#xff0c;执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己&#xff0c;抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内&#xff0c;职场社交不要放在5min以外 职场的人际关系在面对利…...

【go语言】map 和 list

一、map map 是一种无序的键值对的集合。 无序 &#xff1a;map[key]键值对&#xff1a;key - value map 最重要的一点是通过 key 来快速检索数据&#xff0c;key 类似于索引&#xff0c;指向数据的值。map 是一种集合&#xff0c;所以我们可以像迭代数组和切片那样迭代他。…...

PCIe 个人理解专栏——【2】LTSSM(Link Training and Status State Machine)

前言&#xff1a; 链路训练和状况状态机LTSSM&#xff08;Link Training and Status State Machine&#xff09;是整个链路训练和运行中状态的状态转换逻辑关系图&#xff0c;总共有11个状态。 正文&#xff1a; 包括检测&#xff08;Detect&#xff09;&#xff0c;轮询&…...

《DiffIR:用于图像修复的高效扩散模型》学习笔记

paper&#xff1a;2303.09472 GitHub&#xff1a;GitHub - Zj-BinXia/DiffIR: This project is the official implementation of Diffir: Efficient diffusion model for image restoration, ICCV2023 目录 摘要 1、介绍 2、相关工作 2.1 图像恢复&#xff08;Image Rest…...

Vue3 30天精进之旅:Day01 - 初识Vue.js的奇妙世界

引言 在前端开发领域&#xff0c;Vue.js是一款极具人气的JavaScript框架。它以其简单易用、灵活高效的特性&#xff0c;吸引了大量开发者。本文是“Vue 3之30天系列学习”的第一篇博客&#xff0c;旨在帮助大家快速了解Vue.js的基本概念和核心特性&#xff0c;为后续的深入学习…...

[笔记] 极狐GitLab实例 : 手动备份步骤总结

官方备份文档 : 备份和恢复极狐GitLab 一. 要求 为了能够进行备份和恢复&#xff0c;请确保您系统已安装 Rsync。 如果您安装了极狐GitLab&#xff1a; 如果您使用 Omnibus 软件包&#xff0c;则无需额外操作。如果您使用源代码安装&#xff0c;您需要确定是否安装了 rsync。…...

将本地项目上传到 GitLab/GitHub

以下是将本地项目上传到 GitLab 的完整步骤&#xff0c;从创建仓库到推送代码的详细流程&#xff1a; 1. 在 GitLab 上创建新项目 登录 GitLab&#xff0c;点击 New project。选择 Create blank project。填写项目信息&#xff1a; Project name: 项目名称&#xff08;如 my-p…...

switch组件的功能与用法

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了PageView这个Widget,本章回中将介绍Switch Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍的Switch是指左右滑动的开关&#xff0c;常用来表示某项设置是打开还是关闭。Fl…...

mac 电脑上安装adb命令

在Mac下配置android adb命令环境&#xff0c;配置方式如下&#xff1a; 1、下载并安装IDE &#xff08;android studio&#xff09; Android Studio官网下载链接 详细的安装连接请参考 Mac 安装Android studio 2、配置环境 在安装完成之后&#xff0c;将android的adb工具所在…...

Couchbase UI: Dashboard

以下是 Couchbase UI Dashboard 页面详细介绍&#xff0c;包括页面布局和功能说明&#xff0c;帮助你更好地理解和使用。 1. 首页&#xff08;Overview&#xff09; 功能&#xff1a;提供集群的整体健康状态和性能摘要 集群状态 节点健康状况&#xff1a;绿色&#xff08;正…...

[极客大挑战 2019]Knife1

题目 蚁剑直接连接密码是Syc 拿下flag flag{1d373584-fc74-4a2c-a6d4-3691314be4ab}...

第17篇:python进阶:详解数据分析与处理

第17篇&#xff1a;数据分析与处理 内容简介 本篇文章将深入探讨数据分析与处理在Python中的应用。您将学习如何使用pandas库进行数据清洗与分析&#xff0c;掌握matplotlib和seaborn库进行数据可视化&#xff0c;以及处理大型数据集的技巧。通过丰富的代码示例和实战案例&am…...

【Maui】提示消息的扩展

文章目录 前言一、问题描述二、解决方案三、软件开发&#xff08;源码&#xff09;3.1 消息扩展库3.2 消息提示框使用3.3 错误消息提示使用3.4 问题选择框使用 四、项目展示 前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架&#xff0c;用于使用 C# 和 XAML 创建本机移…...