SSD(Single Shot MultiBox Detector)的复现

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/

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

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

相关文章

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

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

使用C#插件Quartz.Net定时执行CMD任务工具2

目录 创建简易控制台定时任务步骤完整程序 创建简易控制台定时任务 创建winform的可以看&#xff1a;https://blog.csdn.net/wayhb/article/details/134279205 步骤 创建控制台程序 使用vs2019新建项目&#xff0c;控制台程序&#xff0c;使用.net4.7.2项目右键&#xff08…

【命令行魔法:掌握Linux基础工具开发的独门技艺】

本节目标 1.Linux 软件包管理器 2.Linux开发工具 3.Linux编译器-gcc/g使用 4.Linux项目自动化构建工具-make/Makefile 5.Linux第一个小程序&#xff0d;进度条 1.Linux 软件包管理器 yum 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译…

MR外包团队:MR、XR混合现实技术应用于游戏、培训,心理咨询、教育成为一种创新的各行业MR、XR形式!

随着VR、AR、XR、MR混合现实等技术逐渐应用于游戏开发、心理咨询、培训、教育各个领域&#xff0c;为教育、培训、心理咨询等行业带来了全新的可能性。MR、XR游戏开发、心理咨询是利用虚拟现实技术模拟真实场景&#xff0c;让学生身临其境地参与学习和体验&#xff0c;从而提高…

action3录制出来的LRF文件的正确打开方式

你会发现使用大疆的产品录制出来的视频会有两种格式&#xff1a;LRF和MP4 这个LRF文件是低分辨率、低码率的预览文件&#xff0c;非常适合预览。 这个文件可以直接通过修改文件后缀转化为.mp4格式

第四代智能井盖传感器,万宾科技助力城市安全

在迈向更为智能化、相互联系更为紧密的城市发展过程中&#xff0c;智能创新产品无疑扮演了一种重要的角色。智能井盖传感器作为新型科学技术产物&#xff0c;不仅解决传统井盖管理难的问题&#xff0c;也让城市变得更加安全美好&#xff0c;是城市生命线的一层重要保障。这些平…

Windows 11 设置 wsl-ubuntu 使用桥接网络

Windows 11 设置 wsl-ubuntu 使用桥接网络 0. 背景1. Windows 11 下启用 Hyper-V2. 使用 Hyper-V 虚拟交换机管理器创建虚拟网络3. 创建 .wslconfig 文件4. 配置 wsl.conf 文件5. 配置 wsl-network.conf 文件6. 创建 00-wsl2.yaml7. 安装 net-tools 和 openssh-server 0. 背景 …

模组知识(1)-CRA-光学知识

&#xff03;灵感&#xff03; CRA算是光学基础知识的一部分&#xff0c;而且最近项目确实color shading 挺严重的。以前记的知识不全&#xff0c;这次再次整理一下。常学常新。 目录 sensor CRA&#xff1a; CRA &#xff1a; Lens CRA: lens CRA和sensor CRA不同大小关…

基于JuiceFS 的低成本 Elasticsearch 云上备份存储

杭州火石创造是国内专注于产业大数据的数据智能服务商&#xff0c;为了解决数据存储及高效服务客户需求&#xff0c;选择了 Elasticsearch 搜索引擎进行云上存储。基于性能和成本的考虑&#xff0c;在阿里云选择用本地 SSD ECS 机型自建集群。但由于是自建集群&#xff0c;如何…

单片机实验(一)

前言 实验一&#xff1a;用单片机控制多只数码管(屏)分别左、右滚动显示自己完整的学号&#xff1b; 实验二&#xff1a;用单片机控制LED1616点阵交替正序、逆序显示自己的中文姓名。 参考链接&#xff1a; LED数码管的静态显示与动态显示&#xff08;KeilProteus&#xff0…

uboot 添加命令

前言 uboot 中有个 ping 命令&#xff0c;用来检查网络是否通畅。 我们照着这个命令添加一个 ping2 命令。 step1 cmd/net.c #if defined(CONFIG_CMD_PING2) static int do_ping2(struct cmd_tbl *cmdtp, int flag, int argc,char *const argv[]) {if (argc < 2)return …

【Phoenix】请求的生命周期

本文的目的是讨论Phoenix请求的生命周期。我们实战添加两个新的页面&#xff0c;并讨论整个过程是如何串起来的。 让我们从添加第一个新页面开始。 添加一个新页面 web应用通常通过将HTTP方法和路径映射到应用的某个函数来处理请求。Phoenix通过路由器来实现这个匹配。例如将…

uniapp app tabbar 页面默认隐藏

1.在page.json 中找到tabbar visible 默认为true,设为false则是不显示 uni.setTabBarItem({ index: 1, //列表索引 visible:true //显示或隐藏 })

【C++】-- 红黑树详解

目录 一、红黑树概念 1.概念 2.性质 二、红黑树定义 1.红黑树节点定义 &#xff08;1&#xff09;将新插入节点置为红色 &#xff08;2&#xff09;将新插入节点置为黑色 2.红黑树定义 三、红黑树插入 1.插入节点 2.控制颜色 &#xff08;1&#xff09;父亲为黑色 &#xff0…

Games104现代游戏引擎笔记 面向数据编程与任务系统

Basics of Parallel Programming 并行编程的基础 核达到了上限&#xff0c;无法越做越快&#xff0c;只能通过更多的核来解决问题 Process 进程 有独立的存储单元&#xff0c;系统去管理&#xff0c;需要通过特殊机制去交换信息 Thread 线程 在进程之内&#xff0c;共享了内存…

如何在 Nginx Proxy Manager(NPM)上部署静态网站

前言 众所周知&#xff0c;我们在之前介绍过 Nginx Proxy Manager&#xff08;以下简称 NPM) 这个反向代理的神器&#xff0c;对于一些 Docker 搭建的 Web 项目&#xff0c;NPM 能够很轻松地给他们做反向代理。 然而对于一些静态网站&#xff0c;小伙伴们可能不知道怎么用 NP…

15分钟,不,用模板做数据可视化只需5分钟

测试显示&#xff0c;一个对奥威BI软件不太熟悉的人来开发数据可视化报表&#xff0c;要15分钟&#xff0c;而当这个人去套用数据可视化模板做报表&#xff0c;只需5分钟&#xff01; 数据可视化模板是奥威BI上的一个特色功能板块。用户下载后更新数据源&#xff0c;立即就能获…

LeetCode【560】和为k的子数组

题目&#xff1a; 思路&#xff1a; 转化为前缀和问题&#xff0c;和为k&#xff0c;即为&#xff1a;前缀和差值为k的情况统计&#xff1b; 为什么要转化为前缀和呢&#xff1f;因为和为k的子数组可能有n个元素&#xff0c;但是前缀和差值为k&#xff0c;只有两个元素&#…

微机原理_9

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。 1.当运算结果的最高位为1时&#xff0c;标志位(&#xff09; A. CF1 B. OF1 C. SF1 D. ZF1 2、汇编语言源程序中,每个语句由四项组成,如语句要完成一定功能,那么该语句中不可…

HTTP1.1协议详解

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