- 博客(37)
- 资源 (2)
- 问答 (1)
- 收藏
- 关注
原创 理解Anchor、RPN真值与预测量、RPN卷积网络
RPNRPN部分的输入、输出如下:输入:feature map、物体标签、即训练集中所有物体的类别与边框位置输出:Proposal、分类Loss、回归Loss,其中,Proposal作为生成区域,供后续模块分类与回归。两部分损失用作优化网络...
2021-08-05 15:31:34
1130
1
原创 Faster RCNN总览
如下图所示为Faster RCNN算法的基本流程,从功能模块来讲,主要包括四个部分:特征提取网络、RPN模块、RoI Pooling(Region of Interest)模块与RCNN模块,虚线表示仅仅在训练时有的步骤。Faster RCNN延续了RCNN系列的思想,即先进行感兴趣区域RoI的生成,然后再把生成的区域分类,最后完成物体的检测,这里的RoI使用的即是RPN模块,区域分类是RCNN网络特征提取网络Backbone:输入图像首先经过Backbone得到特征图,在此以VGGNet为例,假设输入图
2021-08-04 16:31:32
447
原创 RCNN系列发展历程
开山之作:RCNNRCNN算法由Ross Girshick等人发表在CVPR 2014,将卷积神经网络应用于特征提取,并借助于CNN良好的特征提取性能,一举将PASCAL VOC数据集的检测率从35.1%提升到了53.7%RCNN算法流程图如下图所示,RCNN仍然延续传统物体检测思想,将物体检测当做分类任务处理,即先提取一系列的候选区域,然后对候选区域进行分类具体过程主要包含四步:候选区域生成。采用Region Proposal提取候选区域,例如SelectiveSearch算法,先将图像分割成小
2021-07-31 18:11:15
2949
原创 卷积神经网络:DetNet
DetNet前面的网络骨架,如VGGNet和ResNet等,虽从各个角度出发提升了物体检测性能,但究其根本是为ImageNet的图像分类任务而设计的。而图像分类任务与物体检测两个任务天然存在着落差,分类任务侧重于全图的特征提取,深层的特征图分辨率很低;而物体检测需要定位出物体位置,特征图分辨率不宜过小,因此造成了以下两种缺陷大物体难以定位:对于FPN等网络,大物体对应在较深的特征图上检测,由于网络较深时下采样率较大,物体的边缘难以精确预测,增加了回归边界的难度小物体难以检测:对于传统网络,由于下采样
2021-07-30 23:26:03
660
原创 卷积神经网络:FPN
FPN为了增强语义性,传统的物体检测模型通常只要在深度卷积网络的最后一个特诊图上进行后续操作,而这一层对应的下采样率(图像缩小的倍数)通常又比较大,如16、32,造成小物体在特征图上的有效信息较少,小物体的检测性能会急剧下降,这个问题也被称为多尺度问题。解决多尺度问题的关键在于如何提取多尺度的特征。传统的方法有图像金字塔(Image Pyramid),主要思路是将输入图片做成多个尺度,不同尺寸的图像生成不同尺寸的特征,这种方法简单有效,大量使用在了COCO竞赛上,但缺点是非常耗时,计算量也很大卷积神经
2021-07-29 15:22:56
1274
原创 卷积神经网络:DenseNet
DenseNetResNet通过前层与后层的“短路连接”(Shortcuts),加强了前后层之间的信息流通,在一定程度上缓解了梯度消失的现象,从而可以将神经网络搭建得很深。DenseNet最大化了这种前后层信息交流,通过建立前面所有层与后面层的密集连接,实现了特征在通道维度上的复用,使其可以再参数计算量最少的情况下实现比ResNet更优的性能DenseNet的网络架构如下图所示,网络由多个Dense Block与中间的卷积池化组成,核心就在Dense Block...
2021-07-28 13:17:30
1118
原创 卷积神经网络:ResNet
import torch.nn as nnclass Bottleneck(nn.Module): def __init__(self, in_dim, out_dim, stride=1): super(Bottleneck, self).__init__() #网路对叠层是由1×1、3×3、1×1这3个卷积组成的,中间包含BN层 self.bottleneck = nn.Sequential( nn.Conv2
2021-07-25 17:30:23
2863
原创 卷积神经网络:Inception
Inception v1 网络是一个精心设计的22层卷积网络,并提出了具有良好局部特征结构的Inception模块,即对特征并行地执行多个大小不同的卷积运算与池化,最后再拼接到一起。由于1×1、3×3和5×5的卷积运算对应不同的特征图区域,因此这样做的好处是可以得到更好的图像表征信息。Inception模块如下图所示,使用了三个不同大小的卷积核进行卷积运算,同时还有一个最大池化,然后将这4部分级联起来(拼接通道),送入下一层在上述模块的基础上,为进一步降低网络参数量,Inception又增加了多个1×
2021-07-09 22:27:30
1772
3
原创 Pytorch:VGG16
import torchimport torch.nn as nnimport torch.nn.functional as F class VGG16(nn.Module): def __init__(self): super(VGG16, self).__init__() #输入图片大小为:3 * 224 * 224 self.conv1_1 = nn.Conv2d(3, 64, 3) #
2021-07-08 21:39:40
2015
2
原创 Pytorch:三、数据的迭代训练(猫狗)
首先定义一个epoch,也就是一共迭代多少轮再定义cirterion与optimizer,就是损失函数和优化器然后使用循环语句来训练我们的train_loader,首先外层循环为for epoch in range(epochs),也就是一共迭代多少轮次此时我们要定义runing_loss损失值与train_correct正确率还有train_total记录我们的标签接下来使用for i, data in enumerate进行train_lader的迭代训练其中enumerate返回两个参数,
2021-07-05 16:36:28
1985
1
原创 Pytorch:一、对图片数据进行标准化(猫狗)
标准化在我们把数据导入模型进行训练的时候,我们首先要对数据进行标准化处理,为什么需要进行标准化呢?简要地说,为了保证网络可以良好的收敛,在不清楚各个维度的相对重要程度之前,标准化使得输入的各个维度分布相近,从而允许我们在网络训练过程中,对各个维度“一视同仁”(即设置相同的学习率、正则项系数、权重初始化、以及激活函数)。反过来,当我们使用全局相同的学习率、权重初始化、以及激活函数等网络设置时,方差更大的维度将获得更多的重视。标准化后我们数据的均值为0,方差为1标准化的公式如下:x_i表示训练集数据
2021-07-02 16:40:17
5957
原创 Pytorch:二、数据加载与数据集的划分(猫狗)
在我们进行深度学习的时候,首先对数据进行一些预处理再将数据输入我们构建好的模型中Dataloader是PyTorch中有关数据输入和预处理的类要使用Dataloader类首先应该导入该类:from torch.utils.data import DataLoadertorch.utils.data.DataLoader类的签名:DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, batch_sampler=None, nu
2021-06-30 17:18:27
3424
1
原创 走向深度:VGGNet
VGGNet:随着AlexNet在2012年ImageNet大赛上大放光彩后,卷积网络进入了飞速的发展截断,而2014年的ImageNet亚军结构VGGNet(Visual Geometry Group Network)则将卷积网络进行了改良,探索了网络深度与性能的关系,用更小的卷积核与更深的网络结构,取得了较好的效果,称为卷积结构发展史上较为重要的一个网络VGG网络结构组成如下图所示,...
2021-06-28 16:13:39
207
原创 网络骨架:Backbone(神经网络基本组成——感受野、空洞卷积)
感受野感受野(Receptive Field)是指特征图上的某个点能看到的输入图像的区域,即特征图上的点是由出入图像中感受野大小区域的计算得到的。举个简单的例子,如下图所示为一个三层卷积网络,每一层的卷积核为33,步长为1,可以看到第一层对应的感受野是33,第二层是55,第三层则是77卷积层和池化层都会影响感受野,而激活函数层通常对感受野没有影响。对于一般的卷积神经网络,感受野可由下面的两个公式计算得出:其中RF_l+1与RF_l分别代表第l+1层与第l层的感受野,k代表第l+1层卷积核的大小,S
2021-06-28 01:34:36
1406
原创 网络骨架:Backbone(神经网络基本组成——BN层、全连接层)
BN层为了追求更高的性能,卷积网络被设计得越来越深,然而网络却变得难以训练收敛与调参。原因在于,浅层参数的微弱变化经过多层线性变化与激活函数后会被放大,改变了每一层的输入分布,造成深层的网络需要不断调整以适应这些分布变化,最终导致模型难以训练收敛由于网络中参数变化导致的内部节点数据分布发生变化的现象被称作ICS(Internal Covariate Shift)。ICS现象更容易使训练过程陷入饱和区,减慢网络的收敛。ReLU从激活函数的角度出发,在一定程度上解决了梯度饱和的现象,而2015年提出的BN层
2021-06-27 00:01:16
3557
原创 网络骨架:Backbone(神经网络基本组成——池化层、Droput层)
池化层在卷积神经网络中,通常会在卷积层之间增加池化(Pooling)层,以降低特征图的参数量,提升计算速度,增加感受野,是一种降采样操作。池化是一种较强的先验,可以使模型更关注全局特征而非局部出现的位置,这种降维的过程可以保留一些重要的特征信息,提升容错能力,并且还能一定程度上起到防止过拟合的作用在物体检测中,常用的池化有最大池化(Max Pooling)与平均值池化(Average Pooling)。池化层有两个主要的参数。即核尺寸(kernel_size)与步长(stride)。下图所示为一个核尺寸
2021-06-26 17:56:41
1846
原创 网络骨架:Backbone(神经网络基本组成——激活函数层)
激活函数层神经网络如果仅仅是由线性的卷积运算堆叠组成,则其无法形成复杂的表达空间,也就很难提取出高语义的信息,因此还需要加入非线性映射,又称激活函数,可以逼近任意的非线性函数,以提升整个神经网络的表达能力,在物体检测任务中,常用的就好函数有Sigmoid、ReLU及Softmax函数1. Sigmoid函数Sigmoid函数又称Logistic函数,模拟了生物的神经元特征,即当神经元获得的输入信号累计超过一定阈值后,神经元被激活而处于兴奋状态,否则处于抑制状态,表达式如下:Sigmoid函数曲线与
2021-06-26 12:07:24
1122
原创 网络骨架:Backbone(神经网络基本组成——卷积层)
利用卷积神经网络处理输入图像,生成深层的特征图,再利用各种算法完成区域生成与损失计算,这部分卷积神经网络数整个检测算法的“骨架”,也被称为BackboneBackbone是物体检测技术的基础,其中也涌现除了多种经典结构,如VGGNet、ResNet和DenseNet等卷积网络的经典Backbone:VGGNet:走向深度Inception:纵横交错ResNet:里程碑的残差结构DenseNet:多重残差FPN:特征金字塔DetNet:为检测而生神经网络的基本组成物体检测算法使用的通常
2021-06-26 00:01:06
17736
原创 PyTorch基础:数据处理(数据可视化)
在训练神经网络时,如果想了解训练的具体情况,可以在终端中打印出各种训练信息,但这种方法不够直观,难以从整体角度判断模型的收敛情况,因此产生了各种数据可视化工具,可以在网络训练时更好地查看训练过程中的各个损失变化情况,监督训练过程,并为进一步的参数优化与训练优化提供方向在PyTorch中,常用的可视化工具有TensorBoardX和VisdomTensorBoard简介:TensorBoardX是专为PyTorch开发的一套数据可视化工具,功能与TensorBoard相当,支持曲线、图片、文本和计算图等
2021-06-25 03:47:43
922
原创 PyTorch基础:数据处理(数据加载、GPU加速)
数据对于深度学习而言是至关重要的。丰富、完整、规范的数据集往往能训练处效果更佳的网络模型主流公开数据集ImageNet数据集PASCAL VOC数据集COCO(Common Object in Context)数据集数据加载PyTorch将数据集的处理过程标准化,提供了Dataset基本的数据类,并在torchvision中提供了众多数据变化函数,数据加载的具体过程主要分为3步:继承Dataset类增加数据变换与增强:torchvision.transforms继承Dataloade
2021-06-25 02:38:41
6233
原创 PyTorch基础:模型处理
模型处理网络模型库:torchvision.models对于深度学习,torchvision.models库提供了众多经典的网络结构与预训练模型,例如VGG、ResNet和Inception等,利用这些模型可以快速搭建物体检测网络,不需要逐层手动实现以VGG模型为例,在torchvision.models中,VGG模型的特征层与分类层分别用vgg.features与vgg.classifier来表示,每一个部分是一个nn.Sequential结构,可以方便地使用与修改>>> f
2021-06-25 00:01:32
258
原创 PyTorch基础:神经网络工具箱torch.nn(优化器nn.optim)
nn.Module模块提供了网络骨架,nn.functional提供了各式各样的损失函数,而Autograd又自动实现了求导与反向传播机制,这时候还缺少一个如何进行模型优化、加速收敛的模块,nn.optim应运而生。nn.optim中包含了各种常见的优化算法,包括随机梯度下降算法SGD(Stochatic Gradient Descent,随机梯度下降)、Adam(Adaptive Moment Esitmation)、Adagrad、RMSProp。SGD方法梯度下降(Gradient Desce
2021-06-23 22:05:15
1326
2
原创 PyTorch基础:神经网络工具箱torch.nn(损失函数)
在深度学习中,损失函数反应模型最后预测结果与实际真值之间的差异,可以用来分析训练过程的好坏、模型是否收敛等,例如均方误差、交叉熵损失等。在PyTorch中,损失函数可以看做是网络的某一层而放到模型定义中,但在实际使用时更偏向于作为功能函数放到前向传播过程中PyTorch在torch.nn即torch.nn.functional中都提供了各种损失函数,通常来讲,由于损失函数不含有可学习的参数,因此这两者在功能上基本没有区别>>> #在perception.py终端环境继续运行,来进一步求
2021-06-23 00:34:50
904
原创 PyTorch基础:神经网络工具箱torch.nn(nn.Module类)
perception.pyimport torchfrom torch import nn#首先建立一个全连接的子module,继承nn.Moduleclass Linear(nn.Module): def __init__(self, in_dim, out_dim): super(Linear, self).__init__() #调用nn.Module的构造函数 #使用nn.Parameter来构造需要学习的参数 self.w
2021-06-21 05:27:31
7010
3
原创 PyTorch基础:Autogard与计算图
基本数据Tensor可以保证完成前向传播,想要完成神经网络的训练,接下来还需要进行反向传播与梯度更新,而PyTorch提供了自动求导机制,autograd,将前向传播的计算记录成计算图,自动完成求导 在PyTorch 0.4 版本之前,Tensor仅仅是对多维数组到的抽象,使用自动求导机制需要将Tensor封装成torch.autograd.Variable类型,才能构建计算图。PyTorch 0.4 版本则将Tensor与Variable进行了整合,以前Variable的使用情景都可以直接...
2021-06-20 23:56:57
301
1
原创 PyTorch基础:Tensor的内存共享
为了实现高效计算,PyTorch提供了一些原地操作运算,即in-place operation,不经过复制,直接在原来的内存上进行计算。对于内存共享,主要有如下3种情况:通过Tensor初始化Tensor直接通过Tensor来初始化另一个Tensor,或者通过Tensor的组合、分块、索引、变形操作来初始化另一个Tensor,则这两个Tensor共享内存。原地操作符PyTorch对于一些操作通过加后缀 “ _ ” 实现了原地操作,如add_()和resize_()等,这种操作只要被执行,本身的
2021-06-20 05:38:28
2320
原创 PyTorch基础:Tensor的自动广播机制与向量化
PyTorch推出了自动广播语义,即不同形状的Tensor进行计算时,可自动扩展到较大的相同形状,再进行计算。广播机制的前提是任一个Tensor至少有一个维度,且从尾部遍历Tensor维度时,两者维度必须相等,其中一个要么是1要么不存在。向量化操作是指可以在同一时间进行批量地并行计算,例如矩阵运算,以达到更好的计算效率的一种方式。在实际使用时,应尽量使用向量化直接对Tensor操作,避免低效率的for循环对元素逐个操作,尤其是在训练网络模型时,如果有大量的for循环,会极大地影响训练的速度。...
2021-06-20 05:05:44
905
原创 PyTorch基础:Tensor的排序与取极值
比较重要的是排序函数sort(),选择沿着指定维度进行排序,返回排序后的Tensor及对应索引位置。max()与min()函数则是沿着指定维度选择最大与最小元素,返回改元素及对应的索引位置。对于Tensor的单元素数学运算,如abs()、sqrt()、log()、pow()和三角函数等,都是逐元素操作(element-wise),输出的Tensor形状与原始Tensor形状一致对于类似求和、求均值、求方差、求距离等需要多个元素完成的操作,往往需要沿着某个维度进行计算,在Tensor中属于归并操作,输出
2021-06-20 04:48:27
5801
原创 PyTorch基础:Tensor的索引与变形
索引操作与Numpy非常类似,主要包含下标索引、表达式索引、使用torch.where()与Tensor.clamp()的选择性索引变形操作是指改变Tensor维度,以适应在深度学习的计算中,数据维度经常变换的需求,是一种十分重要的操作。在PyTorch中主要有4类不同的变形方法,如下图:view()和reshape()函数view()、resize()和reshape()函数可以在不改变Tensor数据的前提下任意改变Tensor的形状,必须保证调整前后的元素总数相同,并且调整前后内存共享,
2021-06-19 23:38:27
552
原创 PyTorch基础:Tensor的组合与分块
组合与分块是将Tensor相互叠加或者分开,是十分常用的两个功能,PyTorch提供了多种操作函数,如下图所示:组合操作是指将不同的Tensor叠加起来,主要有torch.cat()和torch.stack()两个函数cat即concatenate的意思,是指沿着已有的数据的某一维度进行拼接,操作后数据的总维度不变,在进行拼接时,除了拼接的维度之外,其他维度必须相同。而torch.stack()函数是指新增维度,并按照指定的维度进行叠加分块则是与组合相反的操作,指将Tensor分割成不同的子Ten
2021-06-19 00:59:27
2172
原创 PyTorch基础:Tensor的创建与维度查看
Tensor有多种创建方法,如基础的构造函数Tensor(),还有多种与NumPy十分类似的方法,如ones()、eye()、zeros()和randn()等,下图列举了常见的Tensor创建方法:从代码角度实现Tensor的多种创建方法:对于Tensor的维度,可使用Tensor.shape或者size()函数查看每一维的大小,两者等价查看Tensor中的元素个数,可使用Tensor.numel或者Tensor.nelement()函数,两者等价...
2021-06-18 23:50:39
963
原创 PyTorch基础:Tensor数据类型与类型转换
基本数据:TensorTensor,即张量,是PyTorch中的基本操作对象,可以看做是包含单一数据类型元素的多维矩阵。Tensor数据类型7种CPU Tensor类型 8种GPU Tensor类型,在使用时可以根据网络模型所需的精度与显存容量,合理地选取。16位半精度浮点是专为GPU上运行的模型设计的,以尽可能地节省GPU显存占用,但这种节省显存的方式也缩小了所能表达数据的大小。PyTorch中默认的数据类型是torch.FloatTensor,即torch.Tensor等同于torch.Float
2021-06-18 22:06:33
1445
原创 物体检测性能评价指标:IoU、mAP、P-R曲线
IoU是Intersection of Union的缩写,中文意思为:并集交点IoU表示真实框和预测框的重合程度,取值区间为[0,1],IoU值越大,表明两个框重合越好IoU的计算公式:IoU代码(python):def iou(boxA,boxB): #计算重合部分的上、下、左、右4个边的值,注意最大最小函数的使用 left_max = max(boxA[0],boxB[0]) #boxA[0]:真实框的上边长 boxB[0]:预测框的上边长 top_max = ma
2021-06-17 06:56:09
4139
原创 PyTorch主要模块介绍(算法类模块)
torch模块:torch模块本身包含了Pytorch经常使用的一些激活函数,比如Sigmoid(torch.sigmoid),ReLU(torch.relu)和Tanh(torch.tanh),以及Pytorch张量的一些操作,比如矩阵的乘法(torch.mm)、张量元素的选择(torch.select)。需要注意的是,这些操作的对象大多数都是张量,因此,传入的参数需要时Pytorch的张量,否则会报错(一般类型报错,即TypeError)torch.Tensor模块:torch.Tensor模块定
2021-06-08 16:26:52
594
原创 神经网络基础
神经网络神经网络就是让机器模仿人脑神经元去判断结果,神经网络的作用主要就是预测输入对象的值以及分类等在了解神经网络之前我们首先应该了解线性函数 f(x,W,b) = Wx + b在神经网络中f(x,W,b)相当于通过机器训练得出的结果,x是我们的输入对象,b就是防止结果过拟合的偏置项,而机器就是去通过不断的训练得出最优的权重参数W,达到预测结果最准确的目的多组的权重参数和惩罚项构成了我们的决策边界,如图:通过神经网络我们得到了机器通过学习得出的结果,但是如何去判断结果的好坏呢?这时候我们就要引入
2021-05-28 13:22:05
784
2
原创 我的学习笔记
1. fit() :简单来说,就是求得训练集X的均值啊,方差啊,最大值啊,最小值啊这些训练集X固有的属性(可以理解为一个过程) 2. transform() :在Fit的基础上,进行标准化,降维,归一化等操作(看具体用的是哪个工具,如PCA,StandardScaler等)。
2021-05-27 22:27:52
168
具有多个值的张量的布尔值是不明确的
2021-07-05
TA创建的收藏夹 TA关注的收藏夹
TA关注的人