目标检测一 SSD代码复现

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/

推荐阅读

https://zhuanlan.zhihu.com/p/79854543

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

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

相关文章

项目Git分支管理规范

Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。 一、分支管理 项目中&#xff0c;一般会创建三个常用分支&#xff1a; develop&#xff1a;开发环境的稳定分支&#xff0c;公共开发环境基于该分支构建。pre-release&#xff1a;测试…

Zabbix钉钉机器人告警

目录 一.在钉钉群里添加机器人 二.配置钉钉告警脚本 1.安装python依赖模块python-requests 2.配置钉钉告警配置脚本zabbix_ding.conf 3.创建告警日志并且授权。 4.配置钉钉告警执行脚本dingding.py 5.测试 三.配置zabbix告警 1.创建媒介 2.给用户添加报警媒介 3.配置…

C++初阶--内存管理

文章目录 内存分布new/delete基本用法malloc/free和new/delete的区别进一步理解new和delete的实现原理 定位new&#xff08;了解&#xff09; 内存分布 栈&#xff08;stack&#xff09;&#xff1a;栈是由编译器自动管理的内存区域&#xff0c;用于存储局部变量&#xff0c;函…

OpenCV基础应用(3)— 把.png图像保存为.jpg图像

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本节课就手把手教你如何把.png图像保存为.jpg图像&#xff0c;希望大家学习之后能够有所收获~&#xff01;&#x1f308; 目录 &#x1f680;1.技术介绍 &#x1f680;2.实现代码 &#x1f680;1.技术介绍 如果在电脑某…

【以图会意】文件系统从外存到内存到用户空间

首先&#xff0c;在文件目录中&#xff0c;装有很多块FCB&#xff0c;由文件名和i指针两部分构成&#xff0c;指针指向文件所在的索引结点&#xff0c;包含了例如&#xff1a;文件存储权限&#xff0c;文件长度等一系列文件的信息&#xff0c;最重要的当然是物理地址&#xff0…

Python中带图例的条形图的具体画法和参数调节

首先如上图所示的图是如何画出来的呢&#xff0c;它主要是分三个部分&#xff0c; 首先第一部分是将四个单独的图按照横轴的方式叠加起来&#xff0c;第二部分是如何调节右上角图例的位置和大小&#xff0c;第三部分是标注出整个横轴和竖轴的坐标并调节字体的大小。 一.将四个…

QQ邮箱地址一键自动粘贴,工作效率迅速提升

您是否曾经为了输入邮箱地址而烦恼&#xff1f;每次需要输入邮箱地址时&#xff0c;总是要反复复制粘贴&#xff0c;不仅浪费时间&#xff0c;还容易出错。现在&#xff0c;我们为您带来了一项全新的QQ邮箱自动粘贴功能&#xff0c;让您的工作更加高效便捷&#xff01; 首先&a…

《变形监测与数据处理》笔记/期末复习资料(择期补充更新)

变形&#xff1a; 变形是物体在外来因素作用下产生的形状、大小及位置的变化&#xff08;随时间域和空间域的变化&#xff09;&#xff0c;它是自然界普遍存在的现象。 变形体&#xff1a; 一般包括工程建筑物、构筑物、大型机械设备以及其他自然和人工对象等。 变形体和变形…

华为鸿蒙开发记录

错误 1No module found. Make sure the project sync is completed successfully and the module is set in Edit Configuration > General 应该是项目建立的是Api是9 &#xff0c;但是 华为远程模拟器是应该建立的是 8的&#xff0c;导致 版本过低。从新建立项目选择APi8就…

QtiPlot for Mac v1.1.3(科学数据分析工具)

QtiPlot是一款跨平台科学绘图软件&#xff0c;它可以在Windows、Linux和Mac OS X等多个平台上运行。QtiPlot具有强大的数据分析和可视化功能&#xff0c;被广泛应用于学术界和工业界的数据处理和图形制作。 QtiPlot支持多种语言&#xff0c;包括但不限于英语、中文等&#xff…

JS-项目实战-批量删除水果库存记录

1、fruit.js function $(name) {if (name) {//假设name是 #fruit_tblif (name.startsWith("#")) {name name.substring(1); //fruit_tblreturn document.getElementById(name);} else {return document.getElementsByName(name);}} }//当页面加载完成后执行后面的…

人人商城app禁用

api.map.baidu.com 换成 lbs.map.baidu.com

SQL存储过程和函数

SQL存储过程和函数 变量系统变量用户定义变量局部变量 存储过程存储函数 变量 在MySQL中变量分为三种类型: 系统变量、用户定义变量、局部变量。 系统变量 系统变量 是MySQL服务器提供&#xff0c;不是用户定义的&#xff0c;属于服务器层面。分为全局变量&#xff08;GLOBA…

MCAL实战三(S32K324-NXP EB tresos Port驱动配置详解)

一、前言 PORT驱动初始化就是对微控制器(MCU)的整个PORT模块进行初始化配置。很多端口和管脚被分配有多种不同的功能,即可以进行引脚功能复用,比如通用I/O、模数转换、脉宽调制等功能。因此,对PORT必须有一个整体的配置和初始化,对各管脚的具体配置和使用取决于微控制器和…

【部署篇】宝塔liunx中使用docker部署nestjs项目【全过程】

一、 &#x1f44b; 前序工作 连接服务器 获取宝塔面板信息 在命令行输入sudo /etc/init.d/bt default 进入宝塔面板输入账号密码 通过上面网址进入宝塔 安装自己需要的东西 **PS&#xff1a;**这里还需要自己登录宝塔账号&#xff0c;没有账号的同学需要注册一下 安装pm2…

高性能架构设计

1. 引言 高性能架构设计在现代系统中至关重要&#xff0c;它能够应对大规模的数据和用户需求增长&#xff0c;提供优秀的用户体验和实时数据处理能力。同时&#xff0c;它也是解决"三高"问题&#xff08;高并发、高性能、高可用性&#xff09;的关键。 2. 高性能定…

GZ038 物联网应用开发赛题第10套

2023年全国职业院校技能大赛 高职组 物联网应用开发 任 务 书 &#xff08;第10套卷&#xff09; 工位号&#xff1a;______________ 第一部分 竞赛须知 一、竞赛要求 1、正确使用工具&#xff0c;操作安全规范&#xff1b; 2、竞赛过程中如有异议&#xff0c;可向现场考…

从内网到公网:使用Axure RP和内网穿透技术发布静态web页面的完整指南

文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…

前端界面网页截图(干货)

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; 看了一些谷歌插件&#xff0c;可以对网页进行局部截图或者是整个网页截图&#xff0c;于是想着弄个demo,关于前端的截图。最后选择了 html2canvas 1.下载安装包 Install NPM npm install --save html2canvas或者…

在Linux上安装Oracle 数据库 11g (含静默方式安装)

好久没碰11g了&#xff0c;今天&#xff08;2023年11月16日&#xff09;因为有个需求又装了一遍。 在OCI上安装了一个Oracle Linux 6实例&#xff1a; $ uname -a Linux instance-20231116-1239-db11g 4.1.12-124.80.1.el6uek.x86_64 #2 SMP Mon Oct 9 02:32:10 PDT 2023 x86…
最新文章