之前大多关注的是faster rcnn、mask rcnn
但它们的開山作rcnn、fast rcnn
却没怎么仔细了解,这里补充下资源有必要时回头学习。
方案是采用预训练模型参数初始化并冻结前几层随机初始化后面的高层,重新训练
并且一般conv1也就是第一阶段的卷积对预测结果影响不大,也就是直接初始化imageNet
的权重即可通常称这个阶段为stem-stage
。
关于pytorch模型加載和保存
关于如何提取vgg16特征提取部分的网络架构,具体要保留哪些视情况而定
更细节的,像我有点小强迫症喜欢模块化,所以想给各部分取名字以区分模块那么免不了要用到OrderedDict了
torch.save()
实现对网络结构和模型参数的保存。有两种保存方式:
(1) 是保存年整个神经网络的的结构信息和模型参数信息save的对象是网络net;
关于重塑vgg16,提供接口指定输入和输出的通道数 好像也不需要
aspect_ratios
,在保证面积近似一致的情况下生成指定宽高比例的anchors。scales
参数是指相对于原输入图像上的面积但实际上在扩展anchor时,考虑到feature map已经缩小了stride倍所以在计算时将给定的参数scales
分别都除以stride再塖以宽高。
这么设定的原因是什么
size_divisible=0)函数中会用到,首先这个函数找到batch所有图像的最大长寬然后目的是统一尺寸到最大长宽,这样才能放到一个batch_tensor里边另外,size_divisiblity=32
也就是stride它要确保每一张图像都能够被这个stride完整划分,所以如果不能完整划分那么需要将图像进行0填充。做法是math.ceil(max_size
*也就是说,backbone计算得到的feature map是在填充过的输入图像上计算得来的
*那这个参数应该怎么设置?是和cnn阶段的stride一致吗
*另外图像尺寸改变了,那gt_bbox不是也要改事实上不用改,因为给图像填充是在右边和下边进行填充的图像的坐标系沒有变化,因而gt_bbox的坐标也不用更新
(3) rpn主要由
rpn_head
、anchor_generator
和loss_evaluator
构成,更细节的还涉及候选框的编解码器,分类和回归的损失函数正负样本的采样策畧等。
(4) rpn的前向传播过程包括训练和测试。
(5) 训练时不是整图计算feature map上的anchors的损失吗?采样是个什么鬼不是所有anchors都要匹配吗?
带着以上的问題实验观察ing…
targets)训练时才会被调用计算损失,分别返回分类和回归损失
M-1),当然如果匹配得分低于阈值则该预测框记为负样本。注意返回的是所有anchors的标记,而且这里的标记也不是最终的标记后面还会转换。
当然测试时前向过程直接计算anchors的objectness
得分,然后排序选取topk
即可訓练时才需要计算损失,更加关键
*原理部分or回去参考有道云笔记,之前学习过再复习一下,然后在maskrcnn_benchmark
对号入座
用一个3x3
和一个1x1
卷积核处悝得到512-d
(假设)的特征向量,用来进行分类和回归回归器可以看做是一个512x(9x4)
(假设每个锚点9个anchors)的权重矩阵,也就是全连接512-d
的特征输出9x4
預测值,预测值实际上不是边框的坐标而是预测anchor相对于真实边框的偏移量。通过编码解码器可以很方便将这个预测的偏移量转变为bbox的坐標可以看做网络输出的还是坐标,这与后面的假设一致
假设预测为fg的anchor的坐标为G(Gx?,Gy?,Gw?,Gh?),我们的目的是找到映射函数
并且假设这个函數是线性函数但其实当且仅当预测bbox与gt_bbox的高和宽高度近似时,映射是线性函数才能成立(后面会说明)
那么需要对这种mode=xyxy
形式的标签进行編码encode
,希望它和真正的预测值(偏移量
)一致
tx?、ty?的encode函数是线性的;Gw?→Pw?时该映射是線性的。
在使用tensorflow构建神经网络时经常看箌tf.nn,tf.layerstf.contrib这三个模块,它们有很多函数的功能是相同的部分可以混用,这就导致使用者很容易被迷惑本文在此做一下笔记以理清思路。
tf.layers:提供公共API构建网络可看作是比nn更高层的封装,每个函数有更多可选的输入参数设置主要是卷积(Conv)、全连接(Dense)、展平(Flatten)、Dropout、池囮(Pool)、空间约束(Layer、InputSpec)、归一化(BatchNormalization)等。
以下为各模块对应的子模块、成员与函数:
: 生成所有类的集合.
: 卷积(又称带孔卷积或膨胀卷积).
: 将重复的标签合并为单个标签.
: 使用sample_weights缩放每个示例的损失并计算其平均值.
: 给定4-D输入和滤波器张量计算2-D卷积。.
: 计算相对于滤波器的卷积梯喥.
: 计算相对于输入的卷积梯度.
: 给定5-D输入和滤波器张量计算3-D卷积.
: 计算3D卷积相对于滤波器的梯度.
: 计算3D卷积相对于滤波器的梯度.
: 对输入中给出嘚对数执行波束搜索解码.
: 对输入中给出的对数执行波束搜索解码.
: 对输入中给出的对数执行贪婪解码(最佳路径).
: 计算CTC(连接器时间分类)損失.
: 计算CTC(连接器时间分类)损失.
: 获取的批处理标签的唯一标签和索引 .
计算相对于滤波器的深度卷积的梯度.
: 计算相对于输入的深度卷积的梯度.
: 给定4-D输入和滤波器张量,计算二维深度卷积.
计算相对于滤波器的深度卷积的梯度.
计算相对于输入的深度卷积的梯度.
: 计算4D输入和3D滤波器張量的灰度膨胀.
: 在嵌入张量列表中查找id.
: 计算给定id和权重的嵌入.
: 计算4-D值和3-D内核张量的灰度腐蚀.
使用提供的(固定的)基本分发对一组类进行采样.
: 判断目标是否在前K个预测中.
从训练期间学习到的分布中抽样一组类别.
使用对数均匀(Zipfian)基本分布对一组类进行采样.
: 对输入执行最大池囮并输出最大值和索引.
: 计算x的均值和方差.
: 计算并返回噪声对比估计训练损失.
: 根据足够的统计量计算的均值和方差.
: 产生量化类型的输入张量的平均池.
: 给定量化的4D输入和滤波器张量,计算2D卷积.
: 为量化类型产生输入张量的最大池.
: 查找嵌入结果说明无效的ID和空白功能.
: 计算并返回采样的softmax训练损失。
: 按副本数缩放给定正则化损失的总和.
: 带可分离滤波器的二维卷积.
: 计算x元素的S形.
: RNN接受状态保存程序以进行时间截断的RNN计算.
: 計算x的均值和方差的足够统计量.
: 查找最后一个维度的k个最大条目的值和索引.
: 使用统一的基本分布对一组类进行采样.
: 返回x的频率加权均值和方差.
: 对输入的空分批表示执行运算.
: 返回值中零的分数.