FPN全解-最全最详细,我接触目标检测,直接就到FPN了,所以不了解历史。就人的第一反映,可以想象,的确早期的目标检测算法是基于顶层的特征信息,因为顶层的特征语义丰富,但是位置发而粗糙,因为它不一定是最佳边界。而底层的特征语义少,但位置信息反而精确了。我们一开始接触就知道应该用全量特征分析,故此FPN更符合机器学习的逻辑。
1.1 上采样
图像的上采样(upsampling)与下采样(subsampled),上采样是放大图像,下采样是缩小图像。
上采样采用内插值法插入新的像素。也可以参考上采样方法原理简介
- 双线性插值
图像处理之双线性插值法,这里有关于数学公式的推导。
1.2 Average Recall
准确率(Accuracy), 精确率(Precision), 召回率(Recall)和F1-Measure ,Average为准确率,recall是召回率。FPN的评价标准采用的是AR。
# 衡量查准率,是搜索结果中找到正确匹配的数量
正确率 = 提取出的正确信息条数 / 提取出的信息条数
# 衡量查全率,这个是分母是全部样本
召回率 = 提取出的正确信息条数 / 样本中的信息条数
1.3 anchor
怎么理解anchor?,这篇文章中有一些单词没听过,感觉头大,专业术语太多。
2 网络分析
RetinaNet系列1:ResNet和FPN部分总结,结合Rsenet残差网络笔记,添加FPN代码
2.1 logits and labels must be broadcastable
原先我参考别人的代码,因为很简单,就是将
self.avgpool=layers.GlobalAveragePooling2D()
self.fc=layers.Dense(num_classes)
替换为,但实际这样做,会产生异常信息:
self.toplayer = Sequential([
layers.Conv2D(filters=256, kernel_size=1, strides=1, padding='valid'),
layers.BatchNormalization(),
layers.Activation('relu')
])
# smooth layers
self.smooth = Sequential([
layers.Conv2D(filters=256, kernel_size=3, strides=1, padding='same'),
layers.BatchNormalization(),
layers.Activation('relu')
])
# Lateral layers
self.latlayer4 = Sequential([
layers.Conv2D(filters=256, kernel_size=1, strides=1, padding='valid'),
layers.BatchNormalization(),
layers.Activation('relu')
])
self.latlayer3 = Sequential([
layers.Conv2D(filters=256, kernel_size=1, strides=1, padding='valid'),
layers.BatchNormalization(),
layers.Activation('relu')
])
self.latlayer2 = Sequential([
layers.Conv2D(filters=256, kernel_size=1, strides=1, padding='valid'),
layers.BatchNormalization(),
layers.Activation('relu')
])
InvalidArgumentError: logits and labels must be broadcastable: logits_size=[524288,10] labels_size=[512,10] [Op:SoftmaxCrossEntropyWithLogits] name: softmax_cross_entropy_with_logits/