fro*_*ell 5 object-detection tensorflow
我正在尝试训练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
}
Run Code Online (Sandbox Code Playgroud)
即使TotalLoss有所改善,为什么mAP和检测精度会随时间降低?我对结果的直觉是,检测模型变得越来越准确(绝不会出现假阳性),但变得越来越不敏感(很多假阴性)。
任何建议,不胜感激!
(这是张量板的一些示例图像)
好的,所以在对配置文件进行一些试验(盲目猜测)之后,我认为我找到了问题的答案-我将其放在此处,希望其他人可以从中受益。
首先,mAP降低的原因可能是设置:
matched_threshold: 0.3
unmatched_threshold: 0.3
Run Code Online (Sandbox Code Playgroud)
根据我的实验,将此设置降低到0.5以下(像我一样)似乎会使模型不稳定,并使其在训练过程中破裂(随着时间的推移mAP降低)。
其次,当尝试检测显微图像中的细胞核时(这可能也适用于其他已知大小的小物体),SSD似乎对锚点生成器的最小/最大设置非常敏感。
anchor_generator {
ssd_anchor_generator {
num_layers: 6
min_scale: 0.2
max_scale: 0.95
Run Code Online (Sandbox Code Playgroud)
当我刚开始(并不断失败)时,我为此设置使用了停泊状态估计,并且在以不同的图像尺寸播放时,突然间,在128x128像素的情况下,该模型在mAP 0.9或多或少地检测到每个单元的情况下变得非常好。当试图弄清楚为什么它突然起作用时,我在图像中的注释对象的相对大小上打印了直方图,我意识到使用128x128模型配置文件很幸运,并且可以精确地达到范围。
然后,我又回到所有其他模型和尺寸,当在特定图像尺寸中使用细胞核尺寸的确切范围时,即使在较大的图像尺寸(例如512像素)(其中核仅占据)的情况下,该模型也能表现完美图像宽度的3-15%。即使在1024像素下采样到512,并且核仅覆盖图像宽度的1-7%,只要精确指定尺寸范围,该模型就可以执行。
对于我的应用程序来说,这实际上不是问题,因为我事先知道可以期待的功能尺寸,但是对于一个更普遍的问题,我猜这是一个缺点。
| 归档时间: |
|
| 查看次数: |
2077 次 |
| 最近记录: |