R-CNN,SSD,YOLO算法简单对比

2023-10-30

1.R-CNN

1.1 R-CNN

  • 使用传统的锚框(提议区域)选择算法–选择性搜索算法* 选取高质量锚框。
  • 对每一个锚框使用预训练模型对其提取特征,每个锚框需要调整为预训练模型所需要的输入尺寸。
  • 使用支持向量机(SVM)对类别分类。
  • 训练线性回归模型来预测边缘框偏移。

R-CNN速度很慢的原因是每张图片抽取上千个提议区域,就需要上千次卷积神经网络的前向传播来执行目标检测。

1.2 Fast R-CNN

与R-CNN对每个提议区域独立运行一个CNN的前向传播相比,引入了共享计算,减少了多个提议区域之间重叠区域的重复计算。

  • Fast R-CNN将整个图像输入卷积神经网络提取特征图,而不是各个提议区域。设输入为一张图像,将卷积神经网络的输出的形状记为 1 × c × h 1 × w 1 1\times c \times h_1 \times w_1 1×c×h1×w1
  • 使用选择性搜索生成提议区域,这些形状各异的提议区域在卷积神经网络的输出上分别标出了形状各异的兴趣区域。然后,这些感兴趣的区域需要进一步抽取出形状相同的特征(比如指定高度 h 2 h_2 h2和宽度 w 2 w_2 w2),以便于连结后输出。为了实现这一目标,Fast R-CNN引入了兴趣区域汇聚层(RoI pooling):将卷积神经网络的输出和提议区域作为输入,输出连结后的各个提议区域抽取的特征,形状为 n × c × h 2 × w 2 n \times c \times h_2 \times w_2 n×c×h2×w2
  • 通过全连接层将输出形状变换为 n × d n \times d n×d,其中超参数d取决于模型设计。
  • 预测n个提议区域中每个区域的类别和边界框。将全连接层的输出转换为 n × q n \times q n×q(q为类别数量softmax分类)和 n × 4 n \times 4 n×4(坐标回归)。

1.3 Faster R-CNN

Faster R-CNN使用区域提议网络(RPN–神经网络)替代了Fast R-CNN的选择性搜索算法,使得提议区域的数量大幅度减少且还能保证目标检测的精度,从而更好的获取锚框。

  • 图像经过CNN抽取特征图,RPN网络将这些特征图作为输入,再经过一系列卷积层抽取特征图,在这些特征图上利用选择性搜索算法(或者其他锚框生成算法)生成大量的Anchor box锚框,经过Binary Category Prediction(背景或有目标二分类)去除一些没有可能包括目标的锚框,经过Bounding Box Prediction(边界框预测)初步回归修正含有目标锚框的位置信息,使用非极大值抑制,把一些类似的锚框消除去重,最后得到一些高质量锚框。
  • 将这些高质量锚框和特征图经过ROI pooling层,之后与Fast R-CNN 相同。

1.4 Mask R-CNN

在训练集中如果还标注了每个目标在输入图像中的像素级位置,可使用Mask R-CNN,如COCO数据集。

Mask R-CNN是基于Faster R-CNN修改而来的。 具体来说,Mask R-CNN将兴趣区域汇聚层替换为了 兴趣区域对齐层,使用双线性插值(bilinear interpolation)来保留特征图上的空间信息,从而更适于像素级预测。 兴趣区域对齐层的输出包含了所有与兴趣区域的形状相同的特征图。 它们不仅被用于预测每个兴趣区域的类别和边界框,还通过额外的全卷积网络预测目标的像素级位置。

2.SSD

SSD(单发多框检测)是one-stage网络

生成锚框

  • 对输入图像的每个像素,生成多个以它为中心的锚框。
  • 设置缩放比(scale) s 1 , . . . , s n s_1,...,s_n s1,...,sn和宽高比(aspect ratio)取值 r 1 , . . . , r m r_1,...,r_m r1,...,rm,由于计算复杂性过高,在实践中只取包含 s 1 s_1 s1 r 1 r_1 r1的组合。
    ( s 1 , r 1 ) , ( s 1 , r 2 ) , . . . , ( s 1 , r m ) , ( s 2 , r 1 ) , ( s 3 , r 1 ) , . . . , ( s n , r 1 ) (s_1,r_1),(s_1,r_2),...,(s_1,r_m),(s_2,r_1),(s_3,r_1),...,(s_n,r_1) (s1,r1),(s1,r2),...,(s1,rm),(s2,r1),(s3,r1),...,(sn,r1)
    因此一个像素点为中心可生成 n + m − 1 n+m-1 n+m1个锚框,一张图片可生成 w h ( n + m − 1 ) wh(n+m-1) wh(n+m1)个锚框。
#@save
def multibox_prior(data, sizes, ratios):
    """生成以每个像素为中心具有不同形状的锚框"""
    in_height, in_width = data.shape[-2:]
    device, num_sizes, num_ratios = data.device, len(sizes), len(ratios)
    boxes_per_pixel = (num_sizes + num_ratios - 1)
    size_tensor = torch.tensor(sizes, device=device)
    ratio_tensor = torch.tensor(ratios, device=device)

    # 为了将锚点移动到像素的中心,需要设置偏移量。
    # 因为一个像素的高为1且宽为1,我们选择偏移我们的中心0.5
    offset_h, offset_w = 0.5, 0.5
    steps_h = 1.0 / in_height  # 在y轴上缩放步长
    steps_w = 1.0 / in_width  # 在x轴上缩放步长

    # 生成锚框的所有中心点
    center_h = (torch.arange(in_height, device=device) + offset_h) * steps_h
    center_w = (torch.arange(in_width, device=device) + offset_w) * steps_w
    shift_y, shift_x = torch.meshgrid(center_h, center_w)
    shift_y, shift_x = shift_y.reshape(-1), shift_x.reshape(-1)

    # 生成“boxes_per_pixel”个高和宽,
    # 之后用于创建锚框的四角坐标(xmin,xmax,ymin,ymax)
    w = torch.cat((size_tensor * torch.sqrt(ratio_tensor[0]),
                   sizes[0] * torch.sqrt(ratio_tensor[1:])))\
                   * in_height / in_width  # 处理矩形输入
    h = torch.cat((size_tensor / torch.sqrt(ratio_tensor[0]),
                   sizes[0] / torch.sqrt(ratio_tensor[1:])))
    # 除以2来获得半高和半宽
    anchor_manipulations = torch.stack((-w, -h, w, h)).T.repeat(
                                        in_height * in_width, 1) / 2

    # 每个中心点都将有“boxes_per_pixel”个锚框,
    # 所以生成含所有锚框中心的网格,重复了“boxes_per_pixel”次
    out_grid = torch.stack([shift_x, shift_y, shift_x, shift_y],
                dim=1).repeat_interleave(boxes_per_pixel, dim=0)
    output = out_grid + anchor_manipulations
    return output.unsqueeze(0)

img = d2l.plt.imread('../img/catdog.jpg')
h, w = img.shape[:2]

print(h, w)
X = torch.rand(size=(1, 3, h, w))
Y = multibox_prior(X, sizes=[0.75, 0.5, 0.25], ratios=[1, 2, 0.5])
Y.shape

模型

  • 一个基础网络来抽取特征(一般是VGG,也可以是ResNet),然后多个卷积层快来将上一次提供的特征图的高宽缩小,在浅层特征图生成的锚框像素点多,高宽较大,因此生成的锚框数量多,可用于检测较小的目标。深层网络的特征图中每个特征点单元的感受野更大,因此可用来检测较大的目标。
  • 在每段都生成锚框,对每个锚框预测类别和边缘框。

3.YOLO

  • SSD中锚框大量重叠,因此浪费了很多计算
  • YOLO将图片均匀分成 S × S S \times S S×S个锚框
  • 每个锚框预测B个边缘框

之后继续更新。。。

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

R-CNN,SSD,YOLO算法简单对比 的相关文章

  • Windows7+WDK+VS2010+VisualDDK驱动开发环境搭建(菜鸟的经验)

    自己在研究驱动开发 第一步就是开发环境的搭建 网上已有很多的教程一 我也是按着教程一步一步搭建的 但在搭建过程的过程当中遇到一些问题 也花了我不少时间 第一个难题就是 我是Windows7 VS2010 WDK的开发环境 首先我参考了网上的
  • 逻辑回归及其数学推导

    本文只讨论二分类的情况 一 逻辑回归 P Y
  • DML和DDL的区别

    SQL语言共分为四大类 数据查询语言DQL 数据操纵语言DML 数据定义语言DDL 数据控制语言DCL DML Data Manipulation Language 数据操纵语言 适用范围 对数据库中的数据进行一些简单操作 如insert

随机推荐

  • 什么是“堆”,"栈","堆栈","队列",它们的区别?

    一 堆 什么是堆 又该怎么理解呢 堆通常是一个可以被看做一棵树的数组对象 堆总是满足下列性质 堆中某个节点的值总是不大于或不小于其父节点的值 堆总是一棵完全二叉树 将根节点最大的堆叫做最大堆或大根堆 根节点最小的堆叫做最小堆或小根堆 常见的
  • IDEA连接Redis

    IDEA连接Redis 第一步 创建项目 导入依赖 第二步 连接服务器 方案一 单实例连接 方案二 连接池 第一步 创建项目 导入依赖
  • (附源码)springboot大学生创新创业管理 毕业设计 041557

    springboot大学生创新创业管理 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化 电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用 信息时代的到来已成为不可阻挡的时尚潮流 人类发展的历史正进入一个新时代
  • Linux系统下安装 Elasticsearch 6.XX 外网无法访问的问题

    修改配置文件elasticsearch yml wys elk2 elasticsearch 6 2 2 vim config elasticsearch yml 放开下面的注解 然后配置相应的内容 network host 172 16
  • C语言,A国发生命案,警察把嫌疑人确定在4人当中(a,b,c,d)

    A国发生命案 警察把嫌疑人确定在4人当中 a b c d 审讯结果 两个人说的真话 两个人说的假话 a 罪犯在其他三个当中 B 人不是我杀的 是c杀的 c a和d之间有一个是罪犯 d b说的是事实 写一个代码 判断谁是罪犯 include
  • LPDDR4协议规范之 (一)地址映射和容量计算

    文章目录 LPDDR4协议规范之 一 地址映射和容量计算 LPDDR4 结构 LPDDR4 地址映射 LPDDR4协议规范之 一 地址映射和容量计算 LPDDR4 结构 LPDDR4采用了全新的双通道设计 每个裸片包含两个Channnel
  • 【C语言-53】实现一个通讯录; 通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名、性别、年龄、电话、住址

    目录 题目要求 解题代码 结构体定义和组织 菜单函数 通讯录初始化函数 新增联系人 删除联系人 查找联系人 修改联系人 打印全部联系人 排序联系人 清空联系人 全部代码 题目要求 实现一个通讯录 通讯录可以用来存储1000个人的信息 每个人
  • LDA降维和分类

    LDA降维和分类 LDA可以降维和分类 LinearDiscriminantAnalysis LDA 就是将多维的样本数据集映射到一个坐标轴上 可以是多维的 以降维作为目的 使得样本数据可以在这个坐标轴上就可以进行分类 和最小的类内距离 投
  • Larave5.7实现github第三方登录

    简单讲述一下使用laravel进行github第三方登录的方法 第三方登录使用的是OAuth2 0协议 至于什么是OAuth2 0 下面推荐一篇文章 OAuth2 0协议介绍 当然你看不懂也没事 因为现在有很多的库帮你完成了整个交互过程 如
  • SpringBoot和JDBC整合使用

    操作 1 创建springboot项目 略 附上我的项目结构 2 确保项目的pom xml要有下面两个依赖
  • 数据结构之环形队列

    概述 队列是一种具有先进先出 FIFO 的数据类型 可以使用多种数据结构来实现队列 数组和链表 简单队列的应用场景比较有限 于是那些牛人们就发明一些复杂的队列 环形队列 双端队列 优先队列 应用场景 Memory Management Th
  • 简单插入排序算法以及它的时间、空间复杂度

    当待排序列中记录的排序是递增有序 也就是从小到大的有序记录 称正序 时 达到最小的比较次数 n 1 最小的移动次数 0 相反的是 当待排序列中记录的排序是非递增有序 比如从大到小的有序记录 称逆序 时 需要进行n 1趟排序 得到最大比较次数
  • CSS3-选择器,子代选择器 ">"、顺序选择器、下一个兄弟选择器、后面所有的兄弟选择器 的用法

    文章目录 子代选择器 顺序选择器 下一个兄弟选择器 后面所有的兄弟选择器 子代选择器 子代选择器用 gt 表示 只选择指定元素的子元素 儿子标签 IE7开始兼容 IE6不兼容 div gt p color red div 标签的儿子 一级子
  • GnuWin32,Windows下使用Linux命令

    1 前言 昨天我写了一篇 UnxUtils工具包 Windows下使用Linux命令 的文章 今天无意间又发现了 GnuWin32 它提供Win32版本的GNU工具 Linux下的命令基本都有 你可以在 GnuWin32 Files 手动下
  • 利用dockerfile构建vue和element-ui开发环境容器

    1 创建Dockerfile 在一个目录之下创建Dockerfile FROM node system local config RUN true debian china mirrors sed i s deb debian org mi
  • Django 站点图标设置本地生效,远程服务器部署不生效解决

    遇到这种情况多半是用了 path favicon ico serve path img fav ico 这样本地生效 远程不生效 解决办法是在 base html 中 header 间添加一行
  • 详解:什么是眼图、眼图怎么看?

    详解 什么是眼图 眼图怎么看 2019 10 16 15 15 44 燚智能物联网 简介 眼图是指利用实验的方法估计和改善 通过调整 传输系统性能时在示波器上观察到的一种图形 观察眼图的方法是 用一个示波器跨接在接收滤波器的输出端 然后调整
  • Oracle19c数据库安装

    安装Oracle19c数据库一直卡在42 进度 找了很多解决办法都无效 经历了多次安装失败 删除文件重装的崩溃 最后清理电脑空间后重复删出文件注册表等重新安装 终于安装成功了 检查是否安装成功 在Windows系统下 电脑Win R 输入c
  • 新春伊始:从CHAT-GPT到生成式AI,人工智能新范式

    2023的新春伊始 每个人都希望在新的这一年 会有更多更好的事情发生 回头看去已然过去的2022年 科技界充满波折与机遇 似乎在等待一场革命性的变革 近期人工智能研究公司OpenAI推出的聊天机器人模型CHAT GPT不断出圈 据 Sema
  • R-CNN,SSD,YOLO算法简单对比

    文章目录 1 R CNN 1 1 R CNN 1 2 Fast R CNN 1 3 Faster R CNN 1 4 Mask R CNN 2 SSD 3 YOLO 1 R CNN 1 1 R CNN 使用传统的锚框 提议区域 选择算法 选