第三十七周学习笔记
SuperPoint复现进度
evaluation
测试的时候发现即便在图中看起来MagicPoint的预测结果与ground truth相似,但是实际的准确率和召回率均很低,调整好阈值之后,均在0.6左右,加上nms之后,可以达到0.8左右
奇怪的现象,即便test_loss变大了,但是precision和recall竟然也变大
计算mAP
为了计算出mAP,先要计算出AP值,这里遇到了以下误区:
- 计算每张图片的AP然后加和平均:这种算法是错的,而且对于全是高斯噪声的图片,由于全是负类标签,所以计算准确率和召回率的时候会出现分母为0的情况
- 为了弥补第一步中的错误,应该在全数据集上直接计算AP,因为作者评估的时候选择了1000张图片,所以计算AP的时候需要维持几个1000*120*160的数组,这对内存是很大的开销,直接计算得到AP仅有0.56,这是因为没有使用 ϵ = 4 \epsilon=4 ϵ=4的容错率,即对于在关键点周围四格以内的预测均计算为正确的
由于作者没有给出细节,而在普通的计算AP的算法上加上 ϵ = 4 \epsilon=4 ϵ=4的容错是十分奇怪的做法,因为当预测值不是标签但小于容错的时候,既不能直接将其计算为TP,因为这样做会导致recall最后大于1,也不能动态改变recall的分母,因为这会影响AP中给定r计算最大p的过程,更不可以将其算作FP,因为这样会导致precision偏低,我的选择是,当发现某个label周围 ϵ = 4 \epsilon=4 ϵ=4中的第一个点时,即给TP加一,之后该区域中出现的所有点都不再算如TP中,这样做既能保证第一时间将检测到的点加入TP,同时保证了给定r计算最大p的正确性
针对前两个错误,提出第三个计算AP的方法:
这样计算出的AP是0.8034,pr曲线如图,红点标注的是固定r可以达到的最大p的位置
疑惑:大致观察了样本上的预测效果,几乎都在90%准确和召回率,为什么总体的AP这么低?相对于论文上的mAP=0.979,即便我计算出负类的AP是1,总的AP也只有0.9左右
分类计算AP和pr曲线:
1.checkerboard
AP=0.9518
2.cube
AP=0.9687
3.ellipse
undefined
4.line
AP=0.9387
5.multipoly
AP=0.9060
6.poly
AP=0.9536
7.star
AP=0.9739
8.stride
AP=0.5030
9.noise
undefined
可见,模型在stride上的预测效果非常差,对此去掉几大类后重新评估:
- 去掉stride AP=0.82
- 去掉stride和noise AP=0.87
- 去掉stride和noise和ellipse AP=0.91
由于严重的样本不均衡问题,负类的AP几乎可以估计为1,则去掉三类后的mAP=(0.91+1)/2=0.955,接近论文给出的值,但由于论文没有详细给出evaluation的方法,上述算法只是我根据给出的一个直观的评估方法,因此会有差异,但总体看来,除了在一些负样本上,模型的效果已经不错
ResNet18在CIFAR-10上的训练
- mini batch 128
- 初始学习率0.1,在32k和48k次迭代时除以10
- 在64k次迭代时终止
结果得到的Top-1 error 是25.8%,可能由于以下原因:
- 参考论文得知,作者并没有直接使用ResNet18来训练CIFAR10,而是使用了更改了结构后的ResNet20,我一开始也觉得奇怪,因为使用ResNet18最后一层卷积得到的激活的feature map size是32/2^5=1 * 1,这样的下采样损失了大量的信息
- 我写的网络里有BUG
待下周排查
本周总结
- 评估MagicPoint完成,生成pseudo ground truth未完成
- learning opencv上册75%,未完成
- 论文阅读未完成
下周目标
- 生成pseudo ground truth
- learning opencv上册75%
- 阅读论文