【youcans动手学模型】目标检测之 OverFeat 模型

欢迎关注『youcans动手学模型』系列
本专栏内容和资源同步到 GitHub/youcans


【youcans动手学模型】目标检测之 OverFeat 模型

    • 1. OverFeat 卷积神经网络模型
      • 1.1 论文摘要
      • 1.2 技术背景
      • 1.3 基本方法
        • 模型设计
        • 多尺度分类
        • 滑动窗口(Sliding window)
        • 定位(Localization)
        • 目标检测(Object Detection)
      • 1.4 总结
    • 2. 在 PyTorch 中定义 OverFeat 模型类
      • 2.1 OverFeat_fast 模型类
      • 2.2 OverFeat_accurate 模型类
    • 3. OverFeat 模型的训练


本文介绍目标检测之 OverFeat 模型,并给出 PyTorch 实现方法。


1. OverFeat 卷积神经网络模型

OverFeat 是一种基于卷积网络的图像特征提取器和分类器,是 2013年 ImageNet识别挑战赛(ILSVRC2013)定位任务的第一名。

Pierre Sermanet, Yann LeCun, et al., OverFeat:Integrated Recognition, Localization and Detection using Convolutional Networks

【下载地址】: https://arxiv.org/abs/1312.6229
【GitHub地址】: [OverFeat_pytorch] https://github.com/BeopGyu/OverFeat_pytorch

在这里插入图片描述


1.1 论文摘要

OverFeat 是一种特征提取算子(特征提取器)。

本文提出了一个使用卷积神经网络进行分类、定位和检测的集成框架,使用同一个卷积网络进行图像分类、定位和检测等不同的视觉任务。

我们在卷积网络中有效地实现了多尺度和滑动窗口方法。通过学习目标边界进行定位,累积而不是抑制边界框,以增加检测置信度。

该集成框架是 2013 ImageNet 视觉识别挑战赛(ILSVRC2013)定位任务的获胜者,并在检测和分类任务中获得了极具竞争力的结果。


1.2 技术背景

计算机视觉的三大基本任务:

(1)分类(classification):给定一张图片,给每张图片一个标签(label),识别图片的类别(Top5)。

(2)定位(localization):给定一张图片,识别图片的类别(Top5),并回归物体的边界框(bbox)。

(3)检测(detection):给定一张图片,其中有一个或多个(包括 0个)目标,要找出所有目标物体的边界框并识别其类别,还要考虑假阳性(FP)。

在这里插入图片描述

卷积神经网络在图像分类视觉任务中的主要优点是,对图像进行端到端(end-to-end)的训练,不需要人工设计特征提取器(如SIFT,HOG),缺点是需要大规模的标注样本集进行训练。

虽然 ImageNet 数据集的图像包含一个大致充满图像的中心目标,但是目标在不同图像中的大小和位置仍有显著的差异,依旧存在位于图像边角位置的小目标。解决这个问题有以下几个思路:

(1)使用多个固定大小的滑动窗口,对每个扫描窗口用CNN进行图像分类。该方法的缺点在于活动可能窗口没有包含整个目标,只包含了目标的局部(比如狗头)。这导致分类性能良好,但定位和检测性能较差。

(2)训练一个卷积网络,不仅能进行图像分类,还能产生预测目标的边界框(bouding box)。

(3)累积每个位置和尺寸所对应类别的置信度。


1.3 基本方法

在这里插入图片描述


模型设计

OverFeat 模型的基本结构与 AlexNet 类似,详见下表。

OverFeat 模型包括快速模型(Fast model)和精确模型(Accurate model)。

  • 快速模型
    第1~5层是卷积层组成的特征提取器,第6~8层是全连接层组成的分类器。
    在这里插入图片描述

  • 精确模型
    第1~6层是卷积层组成的特征提取器,第7~9层是全连接层组成的分类器。
    在这里插入图片描述

多尺度分类

OverFeat 在模型训练阶段与 AlexNet 是类似的,但在模型测试阶段使用 6种不同尺度的测试图像,进行多尺度多视图表决以提高性能。

研究 [15] 对一组固定的 10 个视图( 4 个角和中心,及其水平翻转)进行平均。然而这种方法会忽略图像的许多区域,并且当视图重叠时,在计算上是冗余的。此外,它仅在单个尺度上应用,该尺度可能不是 卷积网络最佳置信度响应的尺度。

本文通过在每个位置和多个尺度上,密集运行网络来探索整个图像。滑动窗口方法对某些类型的模型来说计算代价很高,但在卷积网络是非常高效的。这种方法产生了明显更多视图用于表决,增加了鲁棒性,同时保持了高效。

在这里插入图片描述

在这里插入图片描述


滑动窗口(Sliding window)

卷积网络天然地适合滑动窗口的高效计算。

与为输入的每个窗口计算一个完整流水线的滑动窗口方法不同,卷积网络在以滑动窗口方式运行时本质上是高效的,因为它们自然地共享重叠区域共有的计算。

网络的最后几层是全连接的线性层。在测试阶段,用1*1 的逐点卷积层取代这些线性层( 把FC层看成对图像的1*1卷积运算 )。于是,整个网络成为只有卷积、池化和阈值运算(ReLU)的全卷积神经网络(Fully Convolutional Network, FCN)。

在训练阶段,网络只产生一个全尺度的空间输出。

在测试阶段,将网络应用于较大的图像时,我们只需对整个图像进行一次卷积层的运算,生成全尺度输出预测图。在滑动窗口时,每个输入“窗口”(视场)都有一个空间位置。这比在图像上滑动窗口,并对逐个窗口进行特征提取要高效得多。下图展示了卷积实现滑动窗口的效果。

在这里插入图片描述


定位(Localization)

基于图像分类任务所建立和训练得到的卷积神经网络模型,包括特征提取器和图像分类器两部分。使用特征提取器从图像样本集所提取的特征,只要修改网络最后几层的图像分类器,就可以实现不同的任务,而不需要从头开始训练整个网络的参数。这在本质上就是迁移学习。

基于在 ImageNet 数据集训练的预训练模型,保留预训练模型的特征提取器,但用回归网络代替预训练模型的分类器,构造新的回归网络模型,并训练它来预测每个空间位置和尺度上的对象边界框。

(1)生成预测

为了生成对象边界框预测,我们在所有位置和尺度上同时运行分类器和回归器网络。由于这些共享相同的特征提取层,因此在计算分类网络之后只需要重新计算最终回归层。在每个位置处的类别c的最终softmax层的输出提供类别c的对象存在于(不一定完全包含)对应窗口中的置信度得分。因此,我们可以为每个边界框指定一个置信度。

(2)训练回归器

回归网络以特征提取器输出的特征图作为输入,有两个全连接的隐藏层,分别为 4096 和 1024个通道,最终输出层有 4个节点,用于指定边界框边的坐标。

固定来自分类网络的特征提取层(包括模型结构和参数)不变,并以预测边界框和真实边界框之间的 L2 范数作为损失函数。

以多尺度方式训练回归器对于跨尺度预测组合很重要。训练多尺度将使预测在多尺度上正确匹配,并以指数方式增加合并预测的置信度。

(3)组合预测结果

通过应用于回归器边界框的贪婪合并策略,组合预测结果,将这些边界框合并并累积为少量对象。

最初重叠交错的大量边界框,都收敛到某一个位置和比例。这是通过累加与预测每个边界框的输入窗口相关联的检测类输出来计算的。

在合并后,大量边界框被融合为一个非常高的置信度框。假阳性由于缺乏边界框的一致性和置信度而低于检测阈值被剔除。与传统的非最大值抑制相比,通过奖励边界框的一致性,具有更好的鲁棒性。

在这里插入图片描述


目标检测(Object Detection)

检测任务是要找出图像中的一个或多个目标物体(分类并定位)。

与定位任务的主要区别在于,当不存在对象时,要预测背景类。传统上,会随机抽取负面例子进行训练。

我们动态地进行负面训练,为每张图像选择一些负面例子,如随机的或最坏的例子。这种方法在计算上更昂贵,但使过程更简单。由于使用来自分类网络的特征提取层,因此检测微调的速度并不会很慢。


1.4 总结

OverFeat 是一种特征提取算子。本文利用卷积神经网络的特征提取功能,将从图像分类任务中提取到的特征,用于定位、检测等各种视觉任务。

基于图像分类任务所建立和训练得到的卷积神经网络模型,包括特征提取器和图像分类器两部分。使用特征提取器从图像样本集所提取的特征,只要修改网络最后几层的图像分类器,就可以实现不同的任务,而不需要从头开始训练整个网络的参数。这在本质上就是迁移学习。

本文用卷积神经网络为分类、定位、检测任务提供了一个统一的框架,展示了卷积网络实现多尺度(multiscale) 滑动窗口方法。通过学习预测目标的边界来进行定位,累积而不是抑制边界框,以便增加检测置信度。

总结如下:

(1)使用一个卷积神经网络,同时处理图像分类,定位,检测三个任务。

(2)使用卷积神经网络有效地实现了一个多尺度的滑动窗口的方法。

(3)提出了一种通过累积预测来求边界框的方法。


2. 在 PyTorch 中定义 OverFeat 模型类

2.1 OverFeat_fast 模型类

快速模型(Fast model)

class OverFeat_fast(nn.Module):def __init__(self, num_classes=1000):super().__init__()# train with 221x221 5 random crops and their horizontal filps# mini- batches of size 128# initialized weight randomly with mu=0, sigma=1x10^-2# SGD, momentum=0.6, l2 weight decay of 1x10^-5# learning rate 5x10^-2, decay by 0.5 after (30, 50, 60, 70, 80) epochs# Dropout on FCN?? -> dropout before classifier conv layerself.feature_extractor = nn.Sequential(# no contrast normalization is used# max polling with non-overlapping# 1st and 2nd layer stride 2 instead of 4# 1stnn.Conv2d(in_channels=3, out_channels=96, kernel_size=11, stride=4),  # (b x 96 x 56 x 56)nn.ReLU(),nn.MaxPool2d(kernel_size=2, stride=2),  # (b x 96 x 28 x 28)# 2ndnn.Conv2d(96, 256, 5, stride= 1),  # (b x 256 x 24 x 24)nn.ReLU(),nn.MaxPool2d(kernel_size=2, stride=2),  # (b x 256 x 12 x 12)# 3rdnn.Conv2d(256, 512, 3, padding=1),  # (b x 512 x 12 x 12)nn.ReLU(),# 4thnn.Conv2d(512, 1024, 3, padding=1),  # (b x 1024 x 12 x 12)nn.ReLU(),# 5thnn.Conv2d(1024, 1024, 3, padding=1),  # (b x 1024 x 12 x 12)nn.ReLU(),nn.MaxPool2d(kernel_size=2, stride=2),  # (b x 1024 x 6 x 6))# fully connecyed layers implemented as a convolution layersself.classifier = nn.Sequential(# 6thnn.Dropout(p=0.5, inplace=False),nn.Conv2d(in_channels=1024, out_channels=3072, kernel_size=6),nn.ReLU(),# 7thnn.Dropout(p=0.5, inplace=False),nn.Conv2d(3072, 4096, 1),nn.ReLU(),# 8thnn.Conv2d(4096, num_classes, 1))self.init_weight()  # initialize weightdef init_weight(self):for layer in self.feature_extractor:if isinstance(layer, nn.Conv2d):nn.init.normal_(layer.weight, mean=0, std=0.01)def forward(self, x):"""Pass the input through the net.Args:x (Tensor): input tensorReturns:output (Tensor): output tensor"""x = self.feature_extractor(x)x = self.classifier(x)return x.squeeze()

OverFeat_fast 模型的结构如下。

----------------------------------------------------------------Layer (type)               Output Shape         Param #
================================================================Conv2d-1           [-1, 96, 56, 56]          34,944ReLU-2           [-1, 96, 56, 56]               0MaxPool2d-3           [-1, 96, 28, 28]               0Conv2d-4          [-1, 256, 24, 24]         614,656ReLU-5          [-1, 256, 24, 24]               0MaxPool2d-6          [-1, 256, 12, 12]               0Conv2d-7          [-1, 512, 12, 12]       1,180,160ReLU-8          [-1, 512, 12, 12]               0Conv2d-9         [-1, 1024, 12, 12]       4,719,616ReLU-10         [-1, 1024, 12, 12]               0Conv2d-11         [-1, 1024, 12, 12]       9,438,208ReLU-12         [-1, 1024, 12, 12]               0MaxPool2d-13           [-1, 1024, 6, 6]               0Dropout-14           [-1, 1024, 6, 6]               0Conv2d-15           [-1, 3072, 1, 1]     113,249,280ReLU-16           [-1, 3072, 1, 1]               0Dropout-17           [-1, 3072, 1, 1]               0Conv2d-18           [-1, 4096, 1, 1]      12,587,008ReLU-19           [-1, 4096, 1, 1]               0Conv2d-20           [-1, 1000, 1, 1]       4,097,000
================================================================
Total params: 145,920,872
Trainable params: 145,920,872
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.61
Forward/backward pass size (MB): 14.03
Params size (MB): 556.64
Estimated Total Size (MB): 571.28
----------------------------------------------------------------

2.2 OverFeat_accurate 模型类

精确模型(Accurate model)

class OverFeat_accurate(nn.Module):def __init__(self, num_classes=1000):super().__init__()# train with 221x221 5 random crops and their horizontal filps# mini- batches of size 128# initialized weight randomly with mu=0, sigma=1x10^-2# SGD, momentum=0.6, l2 weight decay of 1x10^-5# learning rate 5x10^-2, decay by 0.5 after (30, 50, 60, 70, 80) epochs# Dropout on FCN?? -> dropout before classifier conv layerself.feature_extractor = nn.Sequential(# no contrast normalization is used# max polling with non-overlapping# 1st and 2nd layer stride 2 instead of 4# 1stnn.Conv2d(in_channels=3, out_channels=96, kernel_size=7, stride=2),  # (b x 96 x 108 x 108)nn.ReLU(),nn.MaxPool2d(kernel_size=3, stride=3),  # (b x 96 x 36 x 36)# 2ndnn.Conv2d(96, 256, 7, stride= 1),  # (b x 256 x 30 x 30)nn.ReLU(),nn.MaxPool2d(kernel_size=2, stride=2),  # (b x 256 x 15 x 15)# 3rdnn.Conv2d(256, 512, 3, padding=1),  # (b x 512 x 15 x 15)nn.ReLU(),# 4thnn.Conv2d(512, 512, 3, padding=1),  # (b x 512 x 15 x 15)nn.ReLU(),# 5thnn.Conv2d(512, 1024, 3, padding=1),  # (b x 1024 x 15 x 15)nn.ReLU(),# 6thnn.Conv2d(1024, 1024, 3, padding=1),  # (b x 1024 x 15 x 15)nn.ReLU(),nn.MaxPool2d(kernel_size=3, stride=3),  # (b x 1024 x 5 x 5))# fully connecyed layers implemented as a convolution layersself.classifier = nn.Sequential(# 7thnn.Dropout(p=0.5, inplace=True),nn.Conv2d(in_channels=1024, out_channels=4096, kernel_size=5),nn.ReLU(),# 8thnn.Dropout(p=0.5, inplace=True),nn.Conv2d(4096, 4096, 1),nn.ReLU(),# 9thnn.Conv2d(4096, num_classes, 1))self.init_weight()  # initialize weightdef init_weight(self):for layer in self.feature_extractor:if isinstance(layer, nn.Conv2d):nn.init.normal_(layer.weight, mean=0, std=0.01)def forward(self, x):"""Pass the input through the net.Args:x (Tensor): input tensorReturns:output (Tensor): output tensor"""x = self.feature_extractor(x)x = self.classifier(x)return x.squeeze()

OverFeat_accurate 模型的结构如下。

----------------------------------------------------------------Layer (type)               Output Shape         Param #
================================================================Conv2d-1         [-1, 96, 108, 108]          14,208ReLU-2         [-1, 96, 108, 108]               0MaxPool2d-3           [-1, 96, 36, 36]               0Conv2d-4          [-1, 256, 30, 30]       1,204,480ReLU-5          [-1, 256, 30, 30]               0MaxPool2d-6          [-1, 256, 15, 15]               0Conv2d-7          [-1, 512, 15, 15]       1,180,160ReLU-8          [-1, 512, 15, 15]               0Conv2d-9          [-1, 512, 15, 15]       2,359,808ReLU-10          [-1, 512, 15, 15]               0Conv2d-11         [-1, 1024, 15, 15]       4,719,616ReLU-12         [-1, 1024, 15, 15]               0Conv2d-13         [-1, 1024, 15, 15]       9,438,208ReLU-14         [-1, 1024, 15, 15]               0MaxPool2d-15           [-1, 1024, 5, 5]               0Dropout-16           [-1, 1024, 5, 5]               0Conv2d-17           [-1, 4096, 1, 1]     104,861,696ReLU-18           [-1, 4096, 1, 1]               0Dropout-19           [-1, 4096, 1, 1]               0Conv2d-20           [-1, 4096, 1, 1]      16,781,312ReLU-21           [-1, 4096, 1, 1]               0Conv2d-22           [-1, 1000, 1, 1]       4,097,000
================================================================
Total params: 144,656,488
Trainable params: 144,656,488
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.56
Forward/backward pass size (MB): 33.09
Params size (MB): 551.82
Estimated Total Size (MB): 585.47
----------------------------------------------------------------

3. OverFeat 模型的训练

if __name__ == '__main__':device = torch.device("cuda" if torch.cuda.is_available() else "cpu")print(device)Fast = True# Fast = Falsefrom torchsummary import summaryif (Fast):model_fast = OverFeat_fast(num_classes=1000).to(device)summary(model_fast, (3, 231, 231))else:model_accurate = OverFeat_accurate(num_classes=1000).to(device)summary(model_accurate, (3, 221, 221))

【待续。。。】
3.2 模型训练
3.3 模型推理


参考文献:

  1. Pierre Sermanet, Yann LeCun, et al., OverFeat:Integrated Recognition, Localization and Detection using Convolutional Networks
  2. https://github.com/BeopGyu/OverFeat_pytorch/blob/master/230117.ipynb

【本节完】


版权声明:
欢迎关注『youcans动手学模型』系列
转发请注明原文链接:
【youcans动手学模型】目标检测之 OverFeat 模型
Copyright 2023 youcans, XUPT
Crated:2023-07-14


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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ高阶使用

1. 问题 2. 延时任务 2.1 什么是延时任务 在当前时间往后延迟多少时间执行的任务 2.1.1 和定时任务区别 定时任务有明确的触发时间,延时任务没有定时任务有执行周期,而延时任务在某事件触发后一段时间内执行,没有执行周期定时任务一般执行的…

二、RocketMQ消息存储源码分析

RocketMQ源码深入剖析 6 Broker源码分析 Broker模块涉及到的内容非常多,本课程重点讲解以下技术点: 1、Broker启动流程分析 2、消息存储设计 3、消息写入流程 4、亮点分析:NRS与NRC的功能号设计 5、亮点分析:同步双写数倍性…

洛谷P1059 [NOIP2006 普及组] 明明的随机数

(一)Question 1. 问题描述 2. Input 输入有两行,第 1 行为 1 个正整数,表示所生成的随机数的个数 N。第 2 行有 N 个用空格隔开的正整数,为所产生的随机数。 3. Output 输出也是两行,第 1 行为 1 个正整数 M,表示不相同的随机数的个数。第 2 行为 M 个用空格隔开的正…

“简单易懂的排序:深入了解直接选择排序“

文章目录 🔍 选择排序的原理与过程📈 选择排序的优缺点👉 代码实现 🔍 选择排序的原理与过程 本文我们直接说一个优化过的直接选择排序。其思路大同小异. 选择排序的思路很简单 每次从待排序的数据中选择一个最小和最大的元素&a…

fatal: unable to access ‘http://xxxx‘: Empty reply from server

当你遇到 “fatal: unable to access ‘http://xxxx’: Empty reply from server” 的错误信息时,通常表示 Git 客户端无法连接到指定的服务器或仓库。 以下是一些可能导致该错误的原因以及一些排除故障的步骤: 错误的 URL:确保你提供的 URL…

pdf转图片操作方法是什么?分享两个简单的方法!

PDF转图片是一个常见的需求,无论是为了方便编辑、共享,还是为了其他用途,我们需要简单而有效的方法来实现这个目标。本文将介绍两种简单的PDF转图片方法:记灵在线工具和截图方法。 记灵在线工具是一个强大而易于使用的在线工具&a…

UNIX网络编程卷一 学习笔记 第二十三章 高级SCTP套接字编程

SCTP是一个面向消息的协议,递送给用户的是部分的或完整的消息。只有当发送大消息时,在对端才会递送部分的消息。部分消息被递送给应用后,多个部分消息组合成单个完整消息不由SCTP负责。在SCTP应用进程看来,一个消息既可由单个输入…

Mars3d采用ellipsoid球实现模拟地球旋转效果

1.Mars3d采用ellipsoid球实现模拟地球旋转效果 2.开始自选装之后,模型一直闪烁 http://mars3d.cn/editor-vue.html?idgraphic/entity/ellipsoid 3.相关代码: import * as mars3d from "mars3d"export let map // mars3d.Map三维地图对象 …

WPS Office AI实战:智能表格化身智能助理

前面我们已经拿 WPS AI 对Word文字、PPT幻灯片、PDF 做了开箱体验,还没有看过的小伙伴,请翻看以前的文章,本文开始对【智能表格】进行AI开箱测验。 表格在日常的数据处理中占绝对地位,但表格处理并不是每一个人都擅长,…

第2讲 KMD ISP子系统缩略词及目录结构

QCOM Camera子系统缩略词介绍 CPAS(Camera Peripherals and Support)CDM(Camera Data Mover)TFE(Thin Front End)IFE(Image Front End)OPE(Offline Processing Engine)BPS(Bayer Processing Segment)SFE(Sensor Front End)LRME(Low Resolution Motion Estimation)CSID(Camera …

taro3 微信小程序 createIntersectionObserver 监听无效

项目: taro3 vue3 官方文档 版本:3.x Taro.createIntersectionObserver(component, options) 创建并返回一个 IntersectionObserver 对象实例。在自定义组件或包含自定义组件的页面中,应使用 this.createIntersectionObserver([options]) …

常见面试题之垃圾收回

1. 简述Java垃圾回收机制?(GC是什么?为什么要GC?) 为了让程序员更专注于代码的实现,而不用过多的考虑内存释放的问题,所以,在Java语言中,有了自动的垃圾回收机制&#x…