我正在尝试训练一个SSD移动网络探测器来检测显微图像中的细胞核。我在Ubuntu 16.04上使用tensorflow对象检测API和tensorflow (1.4版)的GPU实现。我的输入图像是带有注释的细胞核的256x256 RGB jpg瓦片。
当我开始训练时,我看到mAP有了很好的增加,在大约6k全局步长(批量大小为12)时,我可以检测到大多数细胞核,但也有一些多次检测到相同的细胞核。
奇怪的是,在这一点之后,mAP开始下降,即使TotalLoss继续下降,模型检测到的细胞核也越来越少。在100k步,几乎没有检测到原子核。
我对SSD使用标准的配置文件,只是我降低了匹配/不匹配的边界。如果我不使用这个修改,这个模型就很难检测到任何细胞核,因为它们是小物体,并且有太少的盒子与它们重叠。
matcher {
argmax_matcher {
matched_threshold: 0.3
unmatched_threshold: 0.3
ignore_thresholds: false
negatives_lower_than_unmatched: true
force_match_for_each_row: true
}为什么在TotalLoss提高的情况下,mAP和检测精度会随着时间的推移而下降?我对结果的直觉是,检测模型变得越来越准确(从来没有假阳性),但敏感度越来越低(大量假阴性)。
非常感谢您的任何建议!
(这里有一些来自tensorboard的示例图像)
发布于 2018-02-18 06:20:57
好的,在对配置文件进行了一些实验(=盲目猜测)之后,我想我找到了问题的答案--我把它放在这里,希望其他人能从中受益。
首先,mAP下降的原因可能是设置:
matched_threshold: 0.3
unmatched_threshold: 0.3从我的实验来看,将这个设置降低到0.5以下(就像我做的那样)似乎会破坏模型的稳定性,并使其在训练过程中崩溃(随着时间的推移,mAP会逐渐减少)。
其次,当试图在显微图像中检测细胞核时(这可能也适用于其他已知大小的小物体),SSD似乎对锚生成器中的最小/最大设置非常敏感。
anchor_generator {
ssd_anchor_generator {
num_layers: 6
min_scale: 0.2
max_scale: 0.95当我刚开始的时候(经常失败),我对这个设置使用了大致的估计,当我尝试不同的图像大小等等时,突然之间,128x128像素的模型变得非常好,mAP 0.9或多或少可以检测到每个细胞。当我试图弄清楚为什么它突然起作用时,我在图像中注释对象的相对大小上打印了直方图,我意识到我幸运地使用了128x128型号的配置文件,并精确地命中了范围。
然后我回到所有其他模型和大小,当使用特定图像大小的细胞核大小的精确范围时,该模型表现完美,即使在更大的图像大小(例如512px)中,细胞核仅占图像宽度的3-15%。即使在1024px,下采样到512,原子核只覆盖图像宽度的1-7%,只要精确指定大小范围,该模型也可以执行。
对于我的应用程序来说,这实际上不是一个问题,因为我预先知道应该使用什么大小的功能,但对于更普遍的问题,我猜这是一个弱点。
https://stackoverflow.com/questions/48595240
复制相似问题