SSD(Single Shot MultiBox Detector)的复现

news2025/1/12 1:09:07

SSD

  • 背景

    这是一种 single stage 的检测模型,相比于R-CNN系列模型上要简单许多。其精度可以与Faster R-CNN相匹敌,而速度达到了惊人的59FPS,速度上完爆 Fster R-CNN。
    速度快的根本原因在于移除了 region proposals 步骤以及后续的像素采样或者特征采样步骤。

  • 网络模型
    在这里插入图片描述

  1. VGG层用于特征提取,与VGG的区别是把FC6和FC7换成了卷积层,SSD在后面又加了8个卷积层。
  2. 最终用于预测的是从这些具有金字塔结构的层中选出的特定层,这些层分别对不同scale(scale的平方是面积,这个参数是假设不考虑纵横比的时候,box的边长)和不同aspect ratios(也就是纵横比)的 bounding box进行预测
  3. bounding box是 detector/classifier 对 default box 进行回归生成的,而 default box 是由一定规则生成的,这里可以认为 default box 比较像 Faster R-CNN 中的RPN生成的region proposal ,也就是两步检测方案中候选框的作用。
  4. detector/classifier (图中没有显示)对这些 default box 进行关于 类别和位置的回归,然后得出一个类别得分和位置坐标偏移量。根据坐标偏移量可以计算出bounding box的位置,根据得分确定此bounding box里的物体类别(每个类别都包含 8732个 bounding box,大部分都是背景 或者说共有 8732个bounding box,每个bounding box 都对一个 C 维的得分,C为类别总数)。
  5. 最后通过NMS(非最大值抑制)过滤掉背景和得分不是很高的框(这个是为了避免重复预测),得到最终的预测。

图中展示了SSD与YOLO两种方案的不同,主要有两点:
1.SSD是在多个feature map上进行的多尺度(multi-scale)预测(每个feature map预测一种 scale)。而YOLO是只在一个feature map上进行 多尺度预测。
2.SSD中用于预测的层也就是 detector/classifier 是全卷积的,而YOLO中是全连接的。
在这里插入图片描述

  • SSD整体结构梳理

    每个feature layer预测一种scale,feature layer 上每个位置(cell )的k个default box 的纵横比(aspect ratio)是不同的,这就实现了 multi-scale 预测的方式。
    在这里插入图片描述
    上面图中被红框框起来的 **detector和classifier**的详细结构如下图:在这里插入图片描述
    1. 这是其中一个scale的预测流程
    2. 可以看出分类和定位都是通过卷积层预测的,假设某个用于预测的feature map是5×5×256的, default box=3,那么用于定位的卷积层输出是 5×5×12 的(4×3=12,每个通道代表一个位置因素(x,y,w,h)),用于分类的卷积层输出是 5×5×63(21×3=63,每个通道代表一个类别)
    3. 每个用于预测的feature map后面可以认为接了三个并行的层,一个default box generator,一个detector,一个classifier。

    上面图中的default box generator如下图:

    在这里插入图片描述
    default box 是 bounding box 的初始参考,也就相当于region proposals,那么为了保证预测时对不同面积大小(等同于scale)和不同纵横比(aspect ratio)的目标进行预测,很明显default box也应该是具有不同scale 和 aspect ratio的。RPN中,每个feature map cell所关联的 9 种 anchor box 也是具有不同scale 和aspect ratio的,他们的作用是类似的。

    在其他一些目标检测模型中比如 overfeat 和 SPPNet中,为了达到对不同 scale 和 aspect ratio的目标的预测效果,采用的方法是对原始图片进行不同程度的缩放,以达到数据扩增。这种方式可以称为 Featurized image pyramids ,如下图示,实际上每个尺度都是一个独立的网络和预测结果。
    在这里插入图片描述
    这种方式输入尺寸在变化,然而网络中的全连接层要求固定的输入,所以 overfeat 和 SPPNet 为了解决这个问题,分别使用了 offset pooling和SPP pooling的结构,使得从卷积层输入到全连接层的特征维度固定。
    SPPnet的详解: https://zhuanlan.zhihu.com/p/60919662

    detector 和 classifier对某个 bounding box的回归:
    在这里插入图片描述
    所有的bounding box回归之后,是很乱的,然后再通过NMS过滤掉一大部分:
    在这里插入图片描述
    这只是其中某一个feature map的预测结果

    当把所有用于预测的feature map进行预测之后(multi-scale),再通过一个NMS,又过滤掉一部分,保留下来的即是最终的结果:
    在这里插入图片描述

  • 训练流程:
    在这里插入图片描述

小结:
1. Multi-scale feature maps for detection
VGG中的 conv5_3 以及VGG后面又添加的一些层中的某些层,被用来检测和分类。不同的feature layer 预测的bounding box的scale是不一样的,因此不同feature layer上的卷积模型也是不一样的(体现在参数和回归效果上)。
2. Convolutional predictors for detection
每一个被选中用于预测的feature layer,是用一个 3×3 的卷积层用于预测的,比如说某个feature layer的是 m×n×p 大小的,那么卷积核就是 3×3×p,这也是某一个 detector/classifier的参数量,它的输出是对应 bounding box中类别的得分或者相对于default box的坐标偏移量。对应于 feature map 上每个位置(cell),都会有 k 个 default box,那么无疑预测的时候要对每个位置上的每个default box都输出类别得分和坐标偏移。
3. Default boxes and aspect ratios
每一个被选中预测的feature layer ,其每个位置(cell)都关联k个default box,对每个default box都要输出C个类别得分和4个坐标偏移,因此每个default box有(C+4)个输出,每个位置有 (C+4)k 个输出,对于m×n 大小的feature map输出为
(C+4) × k × m ×n 个输出,这个机制跟anchor非常相似,具体可以看后面那个图。

SSD源码解析

https://hellozhaozheng.github.io/z_post/PyTorch-SSD/
https://cloud.tencent.com/developer/article/1548867
https://blog.csdn.net/h__ang/article/details/90316220

0. 从Git下载代码

Code: https://github.com/amdegroot/ssd.pytorch

(pytorch) xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python$ git clone https://github.com/amdegroot/ssd.pytorch.git

问题: The TLS connection was non-properly terminated.
解决:

(pytorch) xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python$ sudo git clone https://github.com/amdegroot/ssd.pytorch.git

1. 下载所需要的库

支持Visdom在训练期间进行实时损失可视化

# 首先安装Python服务器和客户端
pip install visdom -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
# 启动服务器(可能在屏幕或 tmux 中)
python -m visdom.server 

然后在train期间,导航到 http://localhost:8097/

2. 数据集

  • Download COCO 2014
    指定要下载数据集的目录,否则默认为 ~/data/

    (pytorch) xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/ssd/data/scripts$ sudo sh COCO2014.sh # <directory>   这里我修改了VOC2007.sh中的数据保存路径
    

    问题:

    curl: /usr/local/lib/libcrypto.so.1.1: version `OPENSSL_1_1_0i' not found (required by /usr/lib/x86_64-linux-gnu/libssl.so.1.1)
    

    解决:
    https://blog.csdn.net/qq_44747572/article/details/121123713

  • VOC Dataset
    Download VOC2007 trainval & test

    sudo sh VOC2007.sh # <directory>   这里我修改了VOC2007.sh中的数据保存路径
    

    Download VOC2012 trainval

    sudo sh VOC2012.sh # <directory>   这里我修改了VOC2012.sh中的数据保存路径
    

    将COCO2014和VOC数据集保存在data文件夹下:
    在这里插入图片描述

3. Training SSD

默认情况下,假设已下载ssd/weights目录中的文件:
.pth下载地址:https://s3.amazonaws.com/amdegroot-models/vgg16_reducedfc.pth (可以直接下载放入weights文件夹下,也可以使用以下命令)

(pytorch) xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/ssd$ mkdir weights
(pytorch) xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/ssd$ cd weights
(pytorch) xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/ssd/weights$ wget https://s3.amazonaws.com/amdegroot-models/vgg16_reducedfc.pth

要使用训练脚本训练 SSD,只需将列出的参数指定train.py为标志或手动更改它们。

(pytorch) xiaoxie@xiaoxie-Z10PE-D8-WS:~/data/yx/python/ssd$ python train.py
python -m visdom.server    # 通过http://localhost:8097查看训练过程

直接运行上面程序,发现会报识别不到文件, 修改coco.py/voc0712.py的路径

# coco.py  coco2014数据是直接下载
/home/xiaoxie/data/yx/python/ssd/data/
# voc0712.py
/home/xiaoxie/data/yx/python/ssd/data/VOCdevkit/

问题1:

RuntimeError: Expected a 'cuda' device type for generator but found 'cpu'

解决:降低pytorch版本
问题2:

IndexError: The shape of the mask [32, 8732] at index 0does not match the shape of the indexed tensor [279424, 1] at index 0
IndexError: invalid index of a 0-dim tensor. Use `tensor.item()` in Python or `tensor.item<T>()` in C++ to convert a 0-dim tensor to a number

解决:https://blog.csdn.net/weixin_36670529/article/details/111246059
问题3:

StopIteration

解决:
将train.py(165行)的

images, targets = next(batch_iterator)

更改成:

try:
	images, targets = next(batch_iterator)
except StopIteration:
	batch_iterator = iter(data_loader)
	images, targets = next(batch_iterator)

4. Evaluation

下载.pth文件,放在weights问价夹下:
SSD300 trained on VOC0712 (newest PyTorch weights)
https://s3.amazonaws.com/amdegroot-models/ssd300_mAP_77.43_v2.pth
SSD300 trained on VOC0712 (original Caffe weights)
https://s3.amazonaws.com/amdegroot-models/ssd_300_VOC0712.pth

 python eval.py
 python test.py     

问题:

RuntimeError: Legacy autograd function with non-static forward method is deprecated. Please use new-style autograd function with static forward method

解决:
https://blog.csdn.net/qq_36926037/article/details/108419899

参考资料

https://arleyzhang.github.io/articles/786f1ca3/

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

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

相关文章

LeetCode(15)分发糖果【数组/字符串】【困难】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 135. 分发糖果 1.题目 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获…

【微服务专题】Spring启动过程源码解析

目录 前言阅读对象阅读导航前置知识笔记正文一、SpringBoot启动过程源码解析1.1 SpringBoot启动过程源码流程图1.2 流程解析补充1.2.1 SpringApplicationRunListeners&#xff1a;SpringBoot运行过程监听器 学习总结感谢 前言 这部分只是个人的自结&#xff0c;方便后面回来看…

RK3588平台开发系列讲解(摄像头篇)USB摄像头驱动分析

🚀返回专栏总目录 文章目录 一. USB摄像头基本知识1.1 内部逻辑结构1.2 描述符实例解析二. UVC驱动框架2.1、设备枚举过程2.2、数据传输过程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 USB摄像头驱动位于 drivers\media\usb\uvc\uvc_driver.c ,我们本篇重点看下…

正版软件|Soundop 专业音频编辑器,实现无缝的音频制作工作流程

关于Soundop Soundop 音频编辑器 直观而专业的音频编辑软件&#xff0c;用于录制、编辑、混合和掌握音频内容。 Soundop 是一款适用于 Windows 的专业音频编辑器&#xff0c;可在具有高级功能的直观灵活的工作区中录制、编辑和掌握音频并混音轨道。音频文件编辑器支持波形和频谱…

一道 python 数据分析的题目

python 数据分析的题目。 做题方法&#xff1a;使用 pandas 读取数据&#xff0c;然后分析。 知识点&#xff1a;pandas&#xff0c;正则表达式&#xff0c;py知识。 过程&#xff1a;不断使用 GPT&#xff0c;遇到有问题的地方自己分析&#xff0c;把分析的结果告诉 GPT&am…

PPT转PDF转换器:便捷的批量PPT转PDF转换软件

在数字化时代&#xff0c;文档转换已成为日常工作不可或缺的一环。特别是对于那些需要转发或发布演示文稿的人来说&#xff0c;如果希望共享给他人的PPT文件在演示过程中不被修改&#xff0c;那么将PPT文件转换为PDF格式已经成为一个常见的选择。大多数PDF阅读器程序都支持全屏…

总结1057

考研倒计38天 极限冲刺day1 今日共计学习13h33m&#xff0c;为了能走出备考的低谷阶段&#xff0c;来一场与自我的较量。在尽可能保证效率的情况下&#xff0c;玩命干。考研这件事&#xff0c;从来不是因为看到了希望才去努力&#xff0c;而是玩命努力后才看到希望。

USB复合设备构建CDC+HID鼠标键盘套装

最近需要做一个小工具&#xff0c;要用到USB CDCHID设备。又重新研究了一下USB协议和STM32的USB驱动库&#xff0c;也踩了不少坑&#xff0c;因此把代码修改过程记录一下。 开发环境&#xff1a; ST-LINK v2 STM32H743开发板 PC windows 11 cubeMX v6.9.2 cubeIDE v1.13.2 cub…

BIO、NIO、AIO三者的区别及其应用场景(结合生活例子,简单易懂)

再解释三者之前我们需要先了解几个概念&#xff1a; 阻塞、非阻塞&#xff1a;是相较于线程来说的&#xff0c;如果是阻塞则线程无法往下执行&#xff0c;不阻塞&#xff0c;则线程可以继续往下 执行。同步、异步&#xff1a;是相较于IO来说的&#xff0c;同步需要等待IO操作完…

HTTP1.1协议详解

目录 协议介绍协议的特点存在的问题协议优化方案与HTTP 1.0协议的区别 协议介绍 HTTP 1.1是一种基于文本的互联网实体信息交互协议&#xff0c;是Web上任何数据交换和客户端-服务器交互的基础。它允许获取各种类型的资源&#xff0c;如HTML文档&#xff0c;并支持在互联网上交…

CocosCreator3.8神秘面纱 CocosCreator 项目结构说明及编辑器的简单使用

我们通过Dashboard 创建一个2d项目&#xff0c;来演示CocosCreator 的项目结构。 等待创建完成后&#xff0c;会得到以下项目工程&#xff1a; 一、assets文件夹 assets文件夹&#xff1a;为资源目录&#xff0c;用来存储所有的本地资源&#xff0c;如各种图片&#xff0c;脚本…

零小时零信任:数据标记如何加速实施

现在是零信任的零小时。 虽然这个概念已经存在多年&#xff0c;但现在联邦政府实施它的时间已经紧迫。 拜登政府备忘录被誉为以战斗速度安全交付关键任务数据的解决方案&#xff0c;要求联邦机构在 2024 财年年底前实现具体的零信任安全目标。 此外&#xff0c;国防部正在努…

从0开始学习JavaScript--JavaScript DOM操作与事件处理

在前端开发中&#xff0c;DOM&#xff08;文档对象模型&#xff09;是一个至关重要的概念&#xff0c;它为JavaScript提供了一种与HTML和XML文档交互的方法。本文将深入探讨DOM的概念与作用&#xff0c;以及JavaScript与DOM之间的密切关系。 DOM的概念与作用 DOM是什么&#…

【接口自动化测试】Postman(一) 介绍和安装

一.Postman介绍 Postman是一款非常流行的接口调试工具&#xff0c;它使用简单&#xff0c;而且功能也很强大。不仅测试人员会使用&#xff0c;开发人员也会 经常使用。 主要特点 1. 简单易用的图形用户界面 2. 可以保存接口请求的历史记录 3. 使用测试集Collections可以更…

编程的简单实例,编程零基础入门教程,中文编程开发语言工具下载

编程的简单实例&#xff0c;编程零基础入门教程&#xff0c;中文编程开发语言工具下载 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件&…

websocket学习笔记【springboot+websocket聊天室demo】

文章目录 WebSocket是什么&#xff1f;为什么需要WebSocket?WebSocket和Http连接的区别WebSocket的工作原理基本交互过程&#xff1a; Java中的WebSocket支持WebSocket的优势springboot websocket themlef 一个聊天室demopom.xmlWebSocketConfigChatControllerWebController…

__builtin_expect(x,0)

As opposed to the C code, above we can see bar case precedes foo case. Since foo case is unlikely, and instructions of bar are pushed to the pipeline, thrashing the pipeline is unlikely. This is a good exploitation of a modern CPU

RK3588平台开发系列讲解(项目篇)嵌入式AI的学习步骤

文章目录 一、嵌入式AI的学习步骤1.1、入门Linux1.2、入门AI 二、瑞芯微嵌入式AI2.1、瑞芯微的嵌入式AI关键词2.2、AI模型部署流程 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; &#x1f4e2; 本篇将给大家介绍什么是嵌入式AI。 一、嵌入…

debian 修改镜像源为阿里云【详细步骤】

文章目录 修改步骤第 1 步:安装 vim 软件第 2 步:备份源第 3 步:修改为阿里云镜像参考👉 背景:在 Docker 中安装了 jenkins 容器。查看系统,发现是 debian 11(bullseye)。 👉 目标:修改 debian bullseye 的镜像为阿里云镜像,加速软件安装。 修改步骤 第 1 步:…

Debian/Ubuntu 安装 NodeJS【详细步骤】

文章目录 NodeSource 简介Debian/Ubuntu 安装 NodeJS第 1 步:进入 jenkins 容器第 2 步:下载和导入 NodeSource第 3 步:创建 deb 仓库第 4 步:安装 NodeJS第 5 步:卸载NodeJS参考👉 背景:在 Docker 中安装了 Jenkins,Jenkins 镜像为 Debian 11 bullseye。 👉 目标:…