浅谈 one-stage 与 two-stage 目标检测方法

2023-11-15

由于目前实习及找工作的原因,博客更新的频率下降,而在面试过程中也发现,虽然论文是看过了,包括也有输出一些论文笔记,但是很多时候无法形成自己对该领域的一个概括性的认知,无法粗中有细,细中有粗,主要还是基本功不扎实。反应了自己在日常学习中的学习问题,所以错失一些很好的面试机会,回首发现每一次自己都是在这种地方跌倒的,痛定思痛,准备开启一系列的总结比较之旅,论文不仅仅是单个存在,博客只是一个整理自己思路,分享知识的方法,如果想形成自己对一个领域的理解,精力足够的话还是推荐各位自己从头到尾,认真阅读原论文+复现代码,遇到不理解的地方,再配合他人的文章进行理解会比较好。本系列文章会不定期更新,主要是想结合论文和相关复现代码,把一些经典的和新的框架,方法,相互之间的联系与区别,里面会贴出一些自己对于问题的见解,若有理解有误之处,还请留言指正。

下面言归正传。

不用多说,提到 one-stage,two-stage 这个方法,了解过一点目标检测的同学肯定都能朗朗上口,默背出来:

one-stage 就是: YOLOv1,YOLOv2, YOLOv3,SSD
two-stage 就是: R-CNN,fast R-CNN,faster R-CNN

(不能一口气吃个胖子,FPN,RetinaNet 等我们稍后再谈)

原文链接:https://pjreddie.com/publications/
参考代码:https://github.com/xiongzihua/pytorch-YOLO-v1

YOLO v1

首先 YOLO v1 的野心很大,论文里有提到人们看一眼图片基本就可以判断出有什么物体在图片里,并且知道它们在图片的什么的地方,快而准,正因为这样,才使人们可以在驾驶等场景中迅速做出反应,像这样快而准的目标检测系统无疑在自动驾驶或者机器人领域会解锁更多的可能。
而前面的 R-CNN 系列,再快,faster r-cnn 还是需要两个阶段,还是很慢,那么索性就一个网络直接分类和坐标一起出来算了,这样才更符合真是人类的检测系统,而且网络可以端到端,可以学习到更全局的特征,可以改善因为滑动窗口(因为其 region proposal 是 SS 方法)只有局部信息而带来的 fast r-cnn 背景错检率高的问题。
下面要详细介绍的一个就是数据预处理,还有就是最后 YOLO v1 Loss 的计算,然后就是网络结构

网络结构

YOLO v1 整体的网络结构就是简单的 分类网络卷积部分 + 2 层全连接层 的结构,以文中结构为
在这里插入图片描述
这里 Part 1 也很容易的替换成 VGGNet 13,VGG16,ResNet 50 等,只要按照规定尺寸输入降成 7x7 的之后接 Part 2 (2 个 fc 层):

classifier = nn.Sequential(
            nn.Linear(C * 7 * 7, 4096), # C 代表输入通道数,上图为 1024, VGG16 则为 512 
            nn.ReLU(True),
            nn.Dropout(),
            nn.Linear(4096, 1470),  # 1470 = 7x7x30
        )

最后将 classifier 的输出经过 sigmiod 函数以后 reshape 成 batchsize x 7 x 7 x 30 输出即可。

数据预处理

这里主要是介绍文中网格化处理的方式,以及对原本数据集格式的修改,让其可以跟网络输出直接算 Loss。
以 VOC 为例,标准集提供的是图片及对应的 xml 文件,而 xml 文件中保存有图片中包含的真值框的坐标信息和类别信息,这里为了方便使用,可以现读取出来,保存成 txt 的文本文件,其格式为:

n0001.jpg,x1,y1,x2,y2,c,x1,y1,x2,y2,c
n0002.jpg,x1,y1,x2,y2,c,x1,y1,x2,y2,c,x1,y1,x2,y2,c

而这里对图片进行网格化处理,则是体现在坐标变换中,首先为了计算 loss 方便,文中把所有的坐标信息(即,cx,cy,cw,ch)都转换到了 0-1 之间, 以下面具体图片为例,假设有一张原图分辨率为 12 x 12,我们将它分割成 6x6 的网格。而其中有一个目标为红色虚线框位置:
在这里插入图片描述

  1. 首先根据每一个 bbox 的 (x1,y1,x2,y2)= (2,2,8,8)得到这个坐标的中心点位置和宽高(cx,xy,cw,ch)=(5,5,6,6)
  2. 现在我们需要把刚才的 中心点位置和宽高(5,5,6,6)映射到 0-1 之间,其中心点所在的网格左上角为( 5 w \frac{5}{w} w5 5 h \frac{5}{h} h5 6 w \frac{6}{w} w6 6 h \frac{6}{h} h6)= ( 5 12 \frac{5}{12} 125 5 12 \frac{5}{12} 125 6 12 \frac{6}{12} 126 6 12 \frac{6}{12} 126),而负责这个 object 的网格的坐标为(( 5 12 \frac{5}{12} 125)*S = 2.5,( 5 12 \frac{5}{12} 125)*S = 2.5)向上取整为 (3,3),因为坐标从 0 开始,再各自减1,最后就是对于 6x6 的网格就是 [2,2] 的位置负责预测这个物体,而 [2,2] 位置的网格左上角坐标(绿点)为(4,4),归一化以后为:( 4 12 \frac{4}{12} 124 4 12 \frac{4}{12} 124),所以最后转化后的坐标为 (( 5 12 \frac{5}{12} 125 - 4 12 \frac{4}{12} 124)*6,( 5 12 \frac{5}{12} 125 - 4 12 \frac{4}{12} 124)*6)=( 1 2 \frac{1}{2} 21 1 2 \frac{1}{2} 21),可以看到红色中心点确实是在 [2,2] 网格的正中心,所以相对左上角的偏移为网格宽度的一半,所以这个真值框,最后转化为( 1 2 \frac{1}{2} 21 1 2 \frac{1}{2} 21 6 12 \frac{6}{12} 126 6 12 \frac{6}{12} 126)=(0.5,0.5,0.5,0.5)

未完待续…

YOLOv2
better

简单快速的 YOLO,相对于 two-stage 的方法,还是存在一定的问题的,例如有大量的定位错误,以及较低的召回率

基于上述问题, YOLO v2 进行了如下改进:

  • 加入了 BN 层来改善网络的性能(+2% mAP)。
  • 并且使用更高分辨率的图片来训练网络(预训练分类时是 224 ,检测训练时,先在 448 的 ImageNet 上 微调 10 个 epoch 再用 448 检测训)(+ 4% mAP)。
  • 加入 anchor boxes。(增加召回率)
    在 加入 anchor 机制以后主要遇到如何选择更合适的预选框的问题,还有就是选择完预选框以后前期训练不稳定的问题。对于第一个问题,用 k-means 聚类来选取预设框尺寸。第二个,变换了数据的预处理方式,对坐标 tx,ty 预测加入了一个 sigmoid函数,让其对异常值进行一个平滑过滤,然后将 tw,th 映射到了一个对数域中,并且增加了多层的特征,26x26 直接下采样到 13x13 然后跟原来的 13x13 拼接在一起, 进行预测,多尺度大概加了 1% mAP。

…(边框回归后面将做详细介绍)

faster

这里主要提出了自己的网络,Darknet-19, 上面因为加入了 anchor 所以可以直接从卷积层预测,所以可以抛弃全连接层(降低网络参数量),然后 darknet 主要是在两个 3x3 之间使用 1x1 卷积层来降低通道数,然后加入了 ave pooling。

stronger

则是提出了新的合并策略,可以联合训练分类和检测的数据集,增加检测的类别,这里不过多介绍。

YOLOv3

YOLO v3 更像是一个集大成者,相对于 YOLO v2 又有了一定的变化,下面梳理一下:

  • 预测的 4+1+ num_classes 的策略,前面 4 个还是没有变,分别是 tx,ty,tw,th,中间一个由之前的 IoU 值,直接变成了 objectness 分数,用 logistic 回归直接预测,表示是否是物体的分数,确定是物体应该为 1。
  • 类别预测的话没有用 softmax,而是使用了二值交叉熵。因为使用 softmax 的一个假设就是类别之间相互独立,但是某些数据集是具有包含关系的(例如,狗和动物,女人和人,这种类别关系)。
  • 从多尺度输出。这里类似于 SSD,YOLO v2 虽然有用多层信息,但是是变换尺寸以后合并在一起,仍然只从最后一层尺寸输出,而 YOLO v3 是从,52x52, 26x26, 13x13 三个分辨率分别输出,这里拼接方法是将 13 x 13 分辨率的结果(s1)上采样成 26 x 26,然后与原先的 26 x 26 拼接在一起得到 s2,把 s2 再上采样成 52 x 52,再与原先的 52 x 52 拼接的到 s3,结果输出是将 s1,s2,s3 并行的讲过 2 个 3 x 3 卷积层然后输出。
  • anchor 的聚类中心从 5 个变为 9 个,可能也是为了方便均分在 3 个尺度上面。
  • 在 DarkNet-19 中加入了 ResNet 结构,构建了更有效的 Darknet-59 。
SSD

总的来说,对于 SSD 主要是将二阶分类器的 RPN 阶段去除,使用神经网络来进行坐标的回归,然后使用了多层网络的输出来进行不同尺度 bounding box 的预测,且他们都是相互独立的。然后就是与预选框尺寸的设定方案和训练时,选择正负样本的方式与 YOLO 方法都大不相同。

这里首先介绍一下 SSD 中的 loss 构成。
首先明确每一个预测框都有 4(location)+ 1(confidence)
在这里插入图片描述
这里的 N 是所有符合条件的框,挑选这些框的过程主要是:

  • 设置一个阈值(一般为 0.5),与 真值框 IoU 大于这个阈值的都视为正样本
  • 负样本会很多,所以用 hard sample 的策略, 将所有负样本通过 confidence 进行排序,选择靠前面的负样本,比例大概为 正:负 = 1:3
  • 由上面的 N 个框来构建 Loss, L l o c L_{loc} Lloc 是对所有正样本做 Smooth_L1_loss, L c o n f L_{conf} Lconf 则是交叉熵函数。

    (图片来自:https://www.cnblogs.com/hellcat/p/9351802.html)

… … 未完待续 … …

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浅谈 one-stage 与 two-stage 目标检测方法 的相关文章

  • 【CV】第 10 章:使用 R-CNN、SSD 和 R-FCN 进行目标检测

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 【计算机视觉

    文章目录 一 检测相关 1篇 1 1 SegmentAnything helps microscopy images based automatic and quantitative organoid detection and analy
  • p2b网络

    把p2b的工作推广到p2rb 目的 学习目标检测 熟悉目标检测 为自己写论文打基础 我的碎碎念 真的是fuck了 自己这个东西整了这么久 还是没有整出来 从5月分我就开始了把 因为考试 因为自己喜欢玩游戏 因为我tm真的浪费了好多时间 像个
  • Coordinate attention,SE,CBAM

    1 SE 因为普通卷积难以建模信道关系 SE考虑通道的相互依赖关系增强模型对信息通道的敏感性 同时全局平均池化可以帮助模型捕获全局信息 然而SE只考虑了内部通道信息而忽略了位置信息的重要性 输入X首先经过全局平均池化 然后经过全连接层来捕获
  • [YOLO专题-16]:YOLO V5 - 如何把labelme json训练数据集批量转换成yolo数据集

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122334367 目录 前言 第1章
  • 【目标检测】【语义分割】—Mask-R-CNN详解

    一 mask rcnn简介 论文链接 论文链接 论文代码 Facebook代码链接 Tensorflow版本代码链接 Keras and TensorFlow版本代码链接 MxNet版本代码链接 mask rcnn是基于faster rcn
  • 传统目标检测方法研究(一)

    1 传统算法目标检测 区域选择 gt 特征提取 gt 特征分类 1 1 区域选择 python 实现 图像滑动窗口 区域选取 首先选取图像中可能出现物体的位置 由于物体位置 大小都不固定 因此传统算法通常使用滑动窗口 Sliding Win
  • 【计算机视觉

    文章目录 一 检测相关 8篇 1 1 Impact of Image Context for Single Deep Learning Face Morphing Attack Detection 1 2 A Theoretical and
  • IA-YOLO项目中DIP模块的初级解读

    IA YOLO项目源自论文Image Adaptive YOLO for Object Detection in Adverse Weather Conditions 其提出端到端方式联合学习CNN PP和YOLOv3 这确保了CNN PP
  • Anchor-Free目标检测模型

    FCOS Fully Convolutional One Stage Object Detection 已开源 FoveaBox Beyond Anchor based Object Detector 未开源 FCOS 摘要 我们提出了一种
  • yolo v3 fatal : Memory allocation failure

    torch版的 yolov3报错 fatal Memory allocation failure parser add argument n cpu type int default 8 help number of cpu threads
  • 目标检测综述-P1-yolov1(20201017初稿)

    目标检测综述 P1 yolov1 写在最初 一 yolov1的提出 二 yolov1如何进行检测 三 yolov1的loss函数 四 yolov1训练过程 1 训练前处理 2 五 yolov1的优缺点 写在最初 关于基于深度学习的目标检测相
  • 迈向多模态AGI之开放世界目标检测

    作者 王斌 谢春宇 冷大炜 责编 夏萌 出品 360人工智能研究院 引言 目标检测是计算机视觉中的一个非常重要的基础任务 与常见的的图像分类 识别任务不同 目标检测需要模型在给出目标的类别之上 进一步给出目标的位置和大小信息 在 CV三大任
  • 【目标检测】OneNet: Towards End-to-End One-Stage Object Detection

    label assignment是指 在训练过程中如何将某个prediction指定给某个GT 用于计算损失 训练网络 对于上一篇文章 他们首先用one to one label assignment替换了one to many label
  • YOLOv8改进开源

    大致介绍一下AI全栈技术社区的相关内容 主要涵盖了YOLO全系列模型的改进 量化 蒸馏 剪枝以及不同工具链的使用 同时也涵盖多目标跟踪 语义分割 3D目标检测 AI模型部署等内容 具体内容小伙伴们可以参考下面的目录部分 所有内容均有答疑服务
  • YOLO3 -- 介绍

    YOLO介绍 YOLO官网 YOLO You Only Look Once 是目标检测模型 目标检测是计算机视觉中比较简单的任务 用来在一张图片中找到某些特定的物体 目标检测不仅要求我们识别这些物体的种类 同时要求我们标出这些物体的位置 Y
  • 【DETR】3、Conditional DETR

    文章目录 一 Conditional DETR 是怎么被提出来的 二 Conditional DETR 的具体实现 2 1 框架结构 2 2 DETR 的 cross attention 和 Conditional DETR 的 cross
  • FPN网络详解

    1 特征金字塔 特征金字塔 Feature Pyramid Networks FPN 的基本思想是通过构造一系列不同尺度的图像或特征图进行模型训练和测试 目的是提升检测算法对于不同尺寸检测目标的鲁棒性 但如果直接根据原始的定义进行FPN计算
  • 项目设计:基于YOLO目标检测算法的安全帽/口罩/汽车/行人/交通标志...检测

    本文将详细介绍YOLO目标检测算法 该算法支持各种目标检测 包括 安全帽 汽车 造价 交通标志 等 其他毕业设计题目推荐参考 毕业设计 电子 通信 计算机 物联网专业毕业设计选题参考 嵌入式linux 单片机STM32 web 图像 htt
  • 目标检测中的损失函数:IOU_Loss、GIOU_Loss、DIOU_Loss和CIOU_Loss

    文章目录 前言 1 IOU Loss Intersection over Union Loss 2 GIOU Loss Generalized Intersection over Union Loss 3 DIOU Loss Distanc

随机推荐

  • Maven引入本地jar包的方法分享

    转自 maven中如何包含本地jar包呢 有时候我们的jar包来源于maven仓库 有时候来源于本地仓库 有时候来源于本地文件 来源于仓库的文件 我们只需输入相应的坐标即可 那么jar包来源于本地文件 如何处理呢 下文笔者讲述maven中包
  • 二十三种设计模式第二十一篇--解释器模式

    解释器模式 Interpreter Pattern 是一种行为设计模式 它用于定义一种语言的语法结构和解释器 使得可以解释并执行特定的语法规则 该模式可以将复杂的语言表达式分解为更小的语法单元 并定义其解释过程 解释器模式的核心组成部分包括
  • NameError: global name ‘***‘ is not defined

    错误示范 class Solution object def fib self n type n int rtype int while n gt 0 if n 1 or n 2 return 1 else return fib n 1 f
  • 手把手带你实现Linux内核编译步骤及配置

    linux 系统体系结构 linux kernel体系结构 arm有7种工作模式 x86也实现了4个不同级别RING0 RING3 RING0级别最高 这样linux用户代码运行在RING3下 内核运行在RING0 这样系统本身就得到了 充
  • linux中把一个文件的内容复制到(或覆盖)另一个文件的末尾

    转载自 https blog csdn net u013991521 article details 80528647 问题描述 比如11的文件内容是 hello 22的文件内容是 world 将22的文件内容复制到11文件的末尾 11文件
  • python类的属性和实例的属性有什么区别

    在 Python 中 类属性和实例属性是两种不同类型的属性 它们在用途和作用域上有所不同 下面是关于它们的区别的详细解释 定义位置 类属性 定义在类的主体中 但在任何类方法之外 实例属性 通常在 init 方法或其他类方法中使用 self
  • 自动化测试工具软测界的不二之选,还不快速来了解

    目录 引言 前言 一 龙测AI TestOps云平台使用教程 1 如何登录龙测AI TestOps云平台 登录方法 登录方法 2 龙测AI TestOps云平台界面布局 3 龙测AI TestOps云平台菜单功能 创建项目 应用管理 设备管
  • 若依框架针对不同用户使用不同样式判断

    在开发中 有时候会针对不同用户使用不同样式 如果使用权限判断符的话会出现 请设置权限的问题 这样我们可以导入若依框架原本的权限判断函数 import checkPermi checkRole from utils permission 权限
  • Hibernate4与hibernate3主要区别与版本不一致导致的错误

    Hibernate版本改动 Hibernate4的改动较大只有spring3 1以上版本能够支持 Spring3 1取消了HibernateTemplate 因为Hibernate4的事务管理已经很好了 不用Spring再扩展了 这里简单介
  • 为何大量网站不能抓取?爬虫突破封禁的6种常见方法

    转载自 https www cnblogs com junrong624 p 5533655 html 在互联网上进行自动数据采集 抓取 这件事和互联网存在的时间差不多一样长 今天大众好像更倾向于用 网络数据采集 有时会把网络数据采集程序称
  • FileZilla - The free FTP solution

    FileZilla The free FTP solution https filezilla project org index php https www filezilla cn 1 Overview The FileZilla Cl
  • JavaScript重写Symbol(Symbol.iterator)实现迭代器(2)

    重写数组for of底层用的迭代器 for of 底层用Symbol Symbol iterator 迭代器 arr 底层用Symbol Symbol iterator 迭代器 示例图 代码 h1 对象遍历重写iterator接口2 h1
  • python中class用法实例

    python中class用法实例 https blog csdn net u010551600 article details 79126911 该程序的作用是找到studet txt文件中 GPA最高的那名同学 并打印出他的信息 程序运行
  • 【机器学习】神经网络介绍【转】

    深度学习 神经网络介绍 1 神经元 2 激活函数 3 感知机与多层网络 4 误差反向传播 参考 周志华 机器学习 神经网络是由具有适应性的简单单元组成的广泛并行互连的网络 它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应 Koho
  • micropython驱动ST7789v 2.4寸液晶显示中文

    一 ST7789v介绍 ST7789v是小尺寸液晶中常用的驱动芯片 作者手里的是网上买的一块2 4寸液晶模组 接口 为SPI接口 网上能找到这个芯片的micropython驱动 这不是本文的重点 本文的重点是如何利用这个驱动 并使用字库的方
  • 记录禁用联想笔记本电脑的触摸板

    触摸板在笔记本打字的时候很容易误操作 于是要关闭 我的这台Lenovo 关闭触摸板方法很直观很简单 键盘最上面一排Fxx的按钮中 F6键上就画着触摸板的小图标 按下F6 就关闭 再按一次 就开启 可能有些电脑不是 只是记录我使用的这台的情况
  • 快速理解事件委托?

    捕获和冒泡允许我们实现一种被称为 事件委托 的强大的事件处理模式 如果我们有许多以类似方式处理的元素 那么就不必为每个元素分配一个处理程序 而是将单个处理程序放在它们的共同祖先上 示例代码
  • 图像&视频编辑工具箱MMEditing使用示例:图像抠图(matting)

    MMEditing的介绍及安装参考 https blog csdn net fengbingchun article details 126331541 这里给出图像抠图的测试代码 论文 Indices Matter Learning to
  • Android Layout设计

    public View onCreateView LayoutInflater inflater ViewGroup container Bundle savedInstanceState Now that CrimeListFragmen
  • 浅谈 one-stage 与 two-stage 目标检测方法

    由于目前实习及找工作的原因 博客更新的频率下降 而在面试过程中也发现 虽然论文是看过了 包括也有输出一些论文笔记 但是很多时候无法形成自己对该领域的一个概括性的认知 无法粗中有细 细中有粗 主要还是基本功不扎实 反应了自己在日常学习中的学习