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

037、目标检测-SSD实现

之——实现

目录

之——简单实现

杂谈

正文

1.类别预测层

2.边界框预测

3.多尺度输出联结做预测(提高预测效率)

4.多尺度实现

5.基本网络块

6.完整模型


杂谈

        原理查看:037、目标检测-算法速览-CSDN博客


正文

1.类别预测层

         类别预测的实现,锚框类别数num_classes+1背景:

        该图层使用填充为1的3×3的卷积层。此卷积层的输入和输出的宽度和高度保持不变,只是改变了通道数: 

import torch
import torchvision
from torch import nn
from torch.nn import functional as F
from d2l import torch as d2ldef cls_predictor(num_inputs, num_anchors, num_classes):return nn.Conv2d(num_inputs, num_anchors * (num_classes + 1),kernel_size=3, padding=1)

2.边界框预测

        把边界框也看做一个预测问题,要预测的值就是两个坐标四个值,所以输出通道为4*num_anchors:

def bbox_predictor(num_inputs, num_anchors):return nn.Conv2d(num_inputs, num_anchors * 4, kernel_size=3, padding=1)


3.多尺度输出联结做预测(提高预测效率)

        单发多框检测使用多尺度特征图来生成锚框并预测其类别和偏移量。 在不同的尺度下,特征图的形状或以同一单元为中心的锚框的数量可能会有所不同。 因此,不同尺度下预测输出的形状可能会有所不同。

def forward(x, block):return block(x)Y1 = forward(torch.zeros((2, 8, 20, 20)), cls_predictor(8, 5, 10))
Y2 = forward(torch.zeros((2, 16, 10, 10)), cls_predictor(16, 3, 10))
Y1.shape, Y2.shape

        通道维包含中心相同的锚框的预测结果。我们首先将通道维移到最后一维。 因为不同尺度下批量大小仍保持不变,我们可以将预测结果转成二维的(批量大小,高×宽×通道数)的格式,以方便之后在维度1上的连结 :

def flatten_pred(pred):return torch.flatten(pred.permute(0, 2, 3, 1), start_dim=1)def concat_preds(preds):return torch.cat([flatten_pred(p) for p in preds], dim=1)

         


4.多尺度实现

        为了在多个尺度下检测目标,我们在下面定义了高和宽减半块down_sample_blk,该模块将输入特征图的高度和宽度减半。

def down_sample_blk(in_channels, out_channels):blk = []for _ in range(2):blk.append(nn.Conv2d(in_channels, out_channels,kernel_size=3, padding=1))blk.append(nn.BatchNorm2d(out_channels))blk.append(nn.ReLU())in_channels = out_channelsblk.append(nn.MaxPool2d(2))return nn.Sequential(*blk)

        跟当时VGG的实现极其类似,效果:

forward(torch.zeros((2, 3, 20, 20)), down_sample_blk(3, 10)).shape


5.基本网络块

        基本网络块用于从输入图像中抽取特征。 为了计算简洁,我们构造了一个小的基础网络,该网络串联3个高和宽减半块,并逐步将通道数翻倍。 给定输入图像的形状为256×256,此基本网络块输出的特征图形状为32×32:

def base_net():blk = []num_filters = [3, 16, 32, 64]for i in range(len(num_filters) - 1):blk.append(down_sample_blk(num_filters[i], num_filters[i+1]))return nn.Sequential(*blk)forward(torch.zeros((2, 3, 256, 256)), base_net()).shape

6.完整模型

        完整的单发多框检测模型由五个模块组成。每个块生成的特征图既用于生成锚框,又用于预测这些锚框的类别和偏移量。在这五个模块中,第一个是基本网络块,第二个到第四个是高和宽减半块,最后一个模块使用全局最大池化将高度和宽度都降到1

def get_blk(i):if i == 0:blk = base_net()elif i == 1:blk = down_sample_blk(64, 128)elif i == 4:blk = nn.AdaptiveMaxPool2d((1,1))else:blk = down_sample_blk(128, 128)return blk

        每个块的前向传播:为每个块定义前向传播。与图像分类任务不同,此处的输出包括:CNN特征图Y;在当前尺度下根据Y生成的锚框;预测的这些锚框的类别和偏移量(基于Y):

def blk_forward(X, blk, size, ratio, cls_predictor, bbox_predictor):Y = blk(X)anchors = d2l.multibox_prior(Y, sizes=size, ratios=ratio)cls_preds = cls_predictor(Y)bbox_preds = bbox_predictor(Y)return (Y, anchors, cls_preds, bbox_preds)

        一个较接近顶部的多尺度特征块是用于检测较大目标的,因此需要生成更大的锚框。 在上面的前向传播中,在每个多尺度特征块上,我们通过调用的multibox_prior函数的sizes参数传递两个比例值的列表。

sizes = [[0.2, 0.272], [0.37, 0.447], [0.54, 0.619], [0.71, 0.79],[0.88, 0.961]]
ratios = [[1, 2, 0.5]] * 5
num_anchors = len(sizes[0]) + len(ratios[0]) - 1

        汇总:

class TinySSD(nn.Module):def __init__(self, num_classes, **kwargs):super(TinySSD, self).__init__(**kwargs)self.num_classes = num_classesidx_to_in_channels = [64, 128, 128, 128, 128]for i in range(5):# 即赋值语句self.blk_i=get_blk(i)setattr(self, f'blk_{i}', get_blk(i))setattr(self, f'cls_{i}', cls_predictor(idx_to_in_channels[i],num_anchors, num_classes))setattr(self, f'bbox_{i}', bbox_predictor(idx_to_in_channels[i],num_anchors))def forward(self, X):anchors, cls_preds, bbox_preds = [None] * 5, [None] * 5, [None] * 5for i in range(5):# getattr(self,'blk_%d'%i)即访问self.blk_iX, anchors[i], cls_preds[i], bbox_preds[i] = blk_forward(X, getattr(self, f'blk_{i}'), sizes[i], ratios[i],getattr(self, f'cls_{i}'), getattr(self, f'bbox_{i}'))anchors = torch.cat(anchors, dim=1)cls_preds = concat_preds(cls_preds)cls_preds = cls_preds.reshape(cls_preds.shape[0], -1, self.num_classes + 1)bbox_preds = concat_preds(bbox_preds)return anchors, cls_preds, bbox_preds

        训练:

batch_size = 32
train_iter, _ = d2l.load_data_bananas(batch_size)device, net = d2l.try_gpu(), TinySSD(num_classes=1)
trainer = torch.optim.SGD(net.parameters(), lr=0.2, weight_decay=5e-4)#损失函数和评价函数
cls_loss = nn.CrossEntropyLoss(reduction='none')
bbox_loss = nn.L1Loss(reduction='none')def calc_loss(cls_preds, cls_labels, bbox_preds, bbox_labels, bbox_masks):batch_size, num_classes = cls_preds.shape[0], cls_preds.shape[2]cls = cls_loss(cls_preds.reshape(-1, num_classes),cls_labels.reshape(-1)).reshape(batch_size, -1).mean(dim=1)bbox = bbox_loss(bbox_preds * bbox_masks,bbox_labels * bbox_masks).mean(dim=1)return cls + bboxdef cls_eval(cls_preds, cls_labels):# 由于类别预测结果放在最后一维,argmax需要指定最后一维。return float((cls_preds.argmax(dim=-1).type(cls_labels.dtype) == cls_labels).sum())def bbox_eval(bbox_preds, bbox_labels, bbox_masks):return float((torch.abs((bbox_labels - bbox_preds) * bbox_masks)).sum())#训练
num_epochs, timer = 20, d2l.Timer()
animator = d2l.Animator(xlabel='epoch', xlim=[1, num_epochs],legend=['class error', 'bbox mae'])
net = net.to(device)
for epoch in range(num_epochs):# 训练精确度的和,训练精确度的和中的示例数# 绝对误差的和,绝对误差的和中的示例数metric = d2l.Accumulator(4)net.train()for features, target in train_iter:timer.start()trainer.zero_grad()X, Y = features.to(device), target.to(device)# 生成多尺度的锚框,为每个锚框预测类别和偏移量anchors, cls_preds, bbox_preds = net(X)# 为每个锚框标注类别和偏移量bbox_labels, bbox_masks, cls_labels = d2l.multibox_target(anchors, Y)# 根据类别和偏移量的预测和标注值计算损失函数l = calc_loss(cls_preds, cls_labels, bbox_preds, bbox_labels,bbox_masks)l.mean().backward()trainer.step()metric.add(cls_eval(cls_preds, cls_labels), cls_labels.numel(),bbox_eval(bbox_preds, bbox_labels, bbox_masks),bbox_labels.numel())cls_err, bbox_mae = 1 - metric[0] / metric[1], metric[2] / metric[3]animator.add(epoch + 1, (cls_err, bbox_mae))
print(f'class err {cls_err:.2e}, bbox mae {bbox_mae:.2e}')
print(f'{len(train_iter.dataset) / timer.stop():.1f} examples/sec on 'f'{str(device)}')

         结果:


小结

        实际的手敲可能再也不会了,但是一些习惯和思路还是值得保持,锚框、分类、框预测的算法是目标检测算法的核心,全局最大池化在通道向输出数的整合上起到了很好的作用。

相关文章:

037、目标检测-SSD实现

之——实现 目录 之——简单实现 杂谈 正文 1.类别预测层 2.边界框预测 3.多尺度输出联结做预测(提高预测效率) 4.多尺度实现 5.基本网络块 6.完整模型 杂谈 原理查看:037、目标检测-算法速览-CSDN博客 正文 1.类别预测层 类别预测…...

【开题报告】基于SpringBoot的摄影作品展示网站的设计与实现

1.研究背景 随着社会的发展和人民生活水平的提高,摄影作品已成为一种非常受欢迎的艺术形式。越来越多的人开始对摄影艺术产生兴趣,并且拥有了自己的摄影作品。然而,如何将这些摄影作品展示出来并与其他摄影爱好者进行交流,成为了…...

SVR和SVM是什么关系

SVR(Support Vector Regression)和 SVM(Support Vector Machines)是支持向量机(Support Vector Machine)的两个不同方面,分别用于回归和分类问题。 SVM (Support Vector Machines): SVM是一种用…...

Flutter 3.16 中带来的更新

Flutter 3.16 中带来的更新 目 录 1. 概述2. 框架更新2.1 Material 3 成为新默认2.2 支持 Material 3 动画2.3 TextScaler2.4 SelectionArea 更新2.5 MatrixTransition 动画2.6 滚动更新2.7 在编辑菜单中添加附加选项2.8 PaintPattern 添加到 flutter_test 3. 引擎更新&#xf…...

批量插入数据与分页的原理及推导

批量插入数据 【1】准备数据 class Book(models.Model):title models.CharField(max_length32) 【2】一条一条插入 后端 def ab_many(request):# (1)先给Book表插入一万条数据for i in range(1000):models.Book.objects.create(titlef第{i}本书)# (2)将所有数据查询到并展…...

SMART PLC累计流量功能块(梯形积分法+浮点数累加精度控制)

S7-200SMART PLC数值积分器相关知识请参考下面文章链接: SMART PLC数值积分器功能块(矩形+梯形积分法完整源代码)-CSDN博客文章浏览阅读153次。PLC的数值积分器算法也可以参考下面文章链接:PLC算法系列之数值积分器(Integrator)-CSDN博客数值积分和微分在工程上的重要意义不…...

【金融分析】Python:病人预约安排政策 | 金融模拟分析

目录: 说明(Instructions) 问题描述(Problem Description) 仿真设置(Simulation Setting) 仿真过程的 Python 代码...

后端接口测试,令牌校验住,获取tocken 接口的方式

post : http://127.0.0.1:端口号/login { "username":"admin", "password":"admin123", "code":"3", "uuid":"966c34e409434f15942ec29a284da0a6" } headers tocken false...

Ghidra逆向工具配置 MacOS 的启动台显示(Python)

写在前面 通过 ghidra 工具, 但是只能用命令行启动, 不太舒服, 写个脚本生成 MacOS 的 app 格式并导入启动台. 不算复杂, 主要是解析包的一些元信息还有裁剪软件图标(通过 MacOS 自带的 API) 脚本 #!/opt/homebrew/bin/python3import os import re import subprocess as sp…...

关于交换芯片调试 tx_delay rx_delay 的一点经验

按照官方的介绍,需要用示波器 测量数据和时钟 实质相位差在2ns 左右,但是由于时钟 125M ,数据方波需要的示波器带宽更高,所以普通示波器是没有办法的,测试变形很大,所以调试的方法如下: 1.根据官方手册,先在设备树里设置跟手册示例一样的,保证ping的时候可以ping通,…...

【图像分类】【深度学习】【轻量级网络】【Pytorch版本】MobileNets_V2模型算法详解

【图像分类】【深度学习】【轻量级网络】【Pytorch版本】MobileNets_V2模型算法详解 文章目录 【图像分类】【深度学习】【轻量级网络】【Pytorch版本】MobileNets_V2模型算法详解前言MobleNet_V2讲解反向残差结构(Inverted Residuals)兴趣流形(Manifold of interest)线性瓶颈层…...

Spring Cloud 简介

1、简介 Spring CloudLevel up your Java code and explore what Spring can do for you.https://spring.io/projects/spring-cloud Spring Cloud 是一系列有序框架的集合,其主要的设施有,服务发现与注册,配置中心,消息总…...

Redis从入门到精通(二)- 入门篇

文章目录 0. 前言1. 入门篇[【入门篇】1.1 redis 基础数据类型详解和示例](https://icepip.blog.csdn.net/article/details/134438573)[【入门篇】1.2 Redis 客户端之 Jedis 详解和示例](https://icepip.blog.csdn.net/article/details/134440061)[【入门篇】1.3 redis客户端之…...

SpringDoc基础配置和集成OAuth2登录认证教程

本期内容 学会通过注解和Java代码的方式添加SpringDoc配置。在swagger-ui提供的页面上提供OAuth2登录认证,在集成Security的情况下便捷获取access_token并在请求时按照OAuth2规范携带。 为什么集成OAuth2登录认证? 现在大部分教程是在swagger-ui页面添…...

链路聚合-静态和动态区别

链路聚合之动静态聚合方式 链路聚合组是由一组相同速率、以全双工方式工作的网口组成。 1、动态聚合: 动态聚合对接的双方通过交互LACP(链路聚合控制协议)协议报文,来协商聚合对接。 优点:对接双方相互交互端口状态信息,使端口…...

发币成功,记录一下~

N年前就听说了这样一种说法——“一个熟练的区块链工程师,10分钟就可以发出一个新的币” 以前仅仅是有这么一个认识,但当时并不特别关注这个领域。 最近系统性学习中,今天尝试发币成功啦,记录一下~ 发在 Sepolia Tes…...

一个完备的手游地形实现方案

一、地形几何方案:Terrain 与 Mesh 1.1 目前手游主流地形几何方案分析 先不考虑 LOD 等优化手段,目前地形的几何方案选择有如下几种: 使用 Unity 自带的 Terrain使用 Unity 自带的 Terrain,但是等美术资产完成后使用工具转为 M…...

vite vue3配置axios

准备 参考 安装axios yarn add axios中文官网 src下新建request文件夹,该文件下新建index.ts import axios from axios; import { ElMessage } from element-plus;// const errorCodeType function (code: number): string { // let errMessage: string 未知…...

使用 C 语言快速排序将字符串按照 ASCII 码升序排列

示例代码&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h>static Comp(const void *a, const void *b) {char *pa (char *)a;char *pb (char *)b;return strcmp(a, b); }int main(void) {char strs[3][10] { "bd", &q…...

自动化运维中间件架构概况

自动化运维中间件架构概况 kubernetesjenkins 安装k8s后 设置 Jenkins 任务: 在 Jenkins 中创建一个新的任务&#xff1a; 配置源代码管理&#xff1a;选择 Git&#xff0c;并提供 GitLab 仓库的 URL、凭据和分支信息。配置构建步骤&#xff1a;选择 Maven 构建&#xff0c;…...

多模态大模型评测指南:从盲测竞技场到技术选型实战

1. 项目概述&#xff1a;一个开放的多模态模型竞技场如果你最近在关注大模型&#xff0c;尤其是那些能“看懂”图片的视觉语言大模型&#xff0c;那你可能已经发现&#xff0c;各种新模型如雨后春笋般涌现&#xff0c;每个都宣称自己性能卓越。但作为开发者或研究者&#xff0c…...

WorkshopDL:革命性跨平台Steam创意工坊下载技术指南

WorkshopDL&#xff1a;革命性跨平台Steam创意工坊下载技术指南 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 1. 问题洞察 你是否曾经在GOG平台购买了《巫师3》&#xff0c;…...

抖音下载神器:douyin-downloader免费批量下载工具完整教程

抖音下载神器&#xff1a;douyin-downloader免费批量下载工具完整教程 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback s…...

Openclaw-Setup:开源桌面自动化框架部署与实战指南

1. 项目概述与核心价值最近在折腾一个挺有意思的项目&#xff0c;叫“Openclaw-Setup”。光看这个名字&#xff0c;可能有点摸不着头脑&#xff0c;但如果你对自动化、机器人流程自动化&#xff08;RPA&#xff09;或者桌面应用控制感兴趣&#xff0c;那这个项目绝对值得你花时…...

如何用ChatPaper进行论文可重复性评估:AI辅助检查研究方法的可复制性终极指南

如何用ChatPaper进行论文可重复性评估&#xff1a;AI辅助检查研究方法的可复制性终极指南 【免费下载链接】ChatPaper Use ChatGPT to summarize the arXiv papers. 全流程加速科研&#xff0c;利用chatgpt进行论文全文总结专业翻译润色审稿审稿回复 项目地址: https://gitco…...

Go语言分布式任务调度:Machinery实战

Go语言分布式任务调度&#xff1a;Machinery实战 1. Machinery概述 Machinery是一个开源的分布式任务队列库&#xff0c;基于Redis实现&#xff0c;支持任务异步执行、定时调度、任务重试等功能。 2. 任务队列实现 package machineryimport ("github.com/RichardKnop/mach…...

5月8日OpenAI上线三款语音模型,GPT - Realtime - 2推理能力大幅提升,你看好谁接力?

5月8日&#xff0c;OpenAI在API中加入三款新一代语音模型&#xff0c;包括GPT - Realtime - 2、Realtime - Translate和Realtime - Whisper。其中&#xff0c;GPT - Realtime - 2推理能力显著提升。GPT - Realtime - 2&#xff1a;会“想”的语音助手它是OpenAI首个具备GPT - 5…...

SAP FICO顾问必看:BKPF、BSEG、BSID这些核心表到底怎么用?附真实业务场景查询示例

SAP FICO核心数据表实战指南&#xff1a;从业务场景到高效查询 在SAP FICO模块的日常运维和开发工作中&#xff0c;数据表的正确使用往往是区分普通顾问和资深专家的关键分水岭。每当财务月结遇到数据异常&#xff0c;或是业务部门提出特殊报表需求时&#xff0c;如何快速定位相…...

新手友好!Qwen3-0.6B镜像使用全攻略:启动、配置、调用

新手友好&#xff01;Qwen3-0.6B镜像使用全攻略&#xff1a;启动、配置、调用 1. 快速了解Qwen3-0.6B Qwen3&#xff08;千问3&#xff09;是阿里巴巴开源的新一代大语言模型系列&#xff0c;其中0.6B版本是一个轻量级但功能强大的模型&#xff0c;非常适合个人开发者和中小规…...

AI数学自动评估技术解析与应用实践

1. 项目背景与核心价值数学自动评估技术正在彻底改变教育测评领域的工作方式。传统人工批改数学作业的方式存在效率低下、标准不统一等问题&#xff0c;而基于AI的自动评估系统能够实现秒级反馈&#xff0c;大幅提升教学效率。Omni-MATH-2作为当前最全面的开放数学评估数据集&a…...